enter image description here

MRE

import SwiftUI

struct SwiftUIView: View {
    
    func maskImage(image: UIImage, mask: UIImage) -> UIImage {
        let imageReference = image.cgImage!
        let maskReference = mask.cgImage!

        let width = maskReference.width
        let height = maskReference.height
        let bitsPerComponent = maskReference.bitsPerComponent
        let bitsPerPixel = maskReference.bitsPerPixel
        let bytesPerRow = maskReference.bytesPerRow

        let context = CGContext(
            data: nil,
            width: width,
            height: height,
            bitsPerComponent: bitsPerComponent,
            bytesPerRow: bytesPerRow,
            space: CGColorSpaceCreateDeviceGray(),
            bitmapInfo: CGImageAlphaInfo.none.rawValue
        )

        context!.draw(maskReference, in: CGRect(x: 0, y: 0, width: width, height: height))

        let maskImage = context!.makeImage()!

        let maskedReference = imageReference.masking(maskImage)!

        return UIImage(cgImage: maskedReference)
    }
    
    var body: some View {
        VStack {
            Image(uiImage: maskImage(image: UIImage(named: "uni")!, mask: UIImage(named: "mask")!))
                .background(.red)
            
            Image(uiImage: UIImage(data: maskImage(image: UIImage(named: "uni")!, mask: UIImage(named: "mask")!).pngData()!)!)
                .background(.red)
        }
    }
}

此代码屏蔽图像并返回UIImage

您可以在VStack中看到第一个映像是正确的.它显示了遮罩区域后面带有红色背景的遮罩图像.

在VStack的第二张图像中,您可以看到透明度消失了.

因此,我需要做的是将temp.pngData()上传到服务器,并期望能够查看保留了预览代码中所示透明度的PNG文件.但是,当文件被上传时,我得到的是没有透明度的原始文件.

怎么修?

推荐答案

如果需要像PNG这样的合并图像,则应该从蒙版图像制作另一个图像:

let renderer = UIGraphicsImageRenderer(size: maskedImage.size)
let newImage = renderer.image { _ in maskedImage.draw(at: .zero) }

现在蒙版区域已被移除,您可以按预期使用newImage.pngData()

Swift相关问答推荐

我应该在自定义存储队列上使用弱self 吗?

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

RealityKit如何获得两个相对大小相同的ModelEntity?

按SWIFT中每个ID的最大值进行筛选/排序

如何在SWIFT任务中判断当前任务是否已取消(异步/等待)

同时具有每个文本的标识符的文本组的可扩展性标识符

在数组中查找最大y值的x值

循环字典中的数组

可以将属性名称传递给 Swift 中的函数吗?

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

应该在ViewModel还是ViewController中使用"Task {}"?

使用View()和List()无法显示影子

根据其属性组合 2 个模型以在 Swift 中创建另一个模型

在 RealityKit 中查找特定模型的 findEntity(named:) 方法的替代方法?

如何在 swiftui 中设置给定字符串类型日期的日期倒计时?

有没有更快的方法来循环浏览 macOS 上已安装的应用程序?

如何在 SwiftUI 中获取视图的位置

如何确定扩展中的具体类型?

如何使用 Swift 将文本文件逐行加载到数组中?

将 UIImage 剪成圆形