我如何在CGImage上设置/更改alphaInfo?

问题描述 投票:0回答:1

我正在使用此扩展程序来获取像素颜色:

extension UIImage {
    subscript (x: Int, y: Int) -> UIColor? {
        guard x >= 0 && x < Int(size.width) && y >= 0 && y < Int(size.height),
            let cgImage = cgImage,
            let provider = cgImage.dataProvider,
            let providerData = provider.data,
            let data = CFDataGetBytePtr(providerData) else {
            return nil
        }

        let numberOfComponents = 4
        let pixelData = ((Int(size.width) * y) + x) * numberOfComponents

        let r = CGFloat(data[pixelData]) / 255.0
        let g = CGFloat(data[pixelData + 1]) / 255.0
        let b = CGFloat(data[pixelData + 2]) / 255.0
        let a = CGFloat(data[pixelData + 3]) / 255.0

        return UIColor(red: r, green: g, blue: b, alpha: a)
    }
}

[使用游乐场或模拟器运行时,一切正常,但是在设备(iPhone XR)上运行时,我得到了不同的值。

经过一段时间的调试后,我发现当我使用模拟器时cgimage具有alphaInfo kCGImageAlphaLast,而当我使用设备时,alphaInfo为kCGImageAlphaNoneSkipLast] >>

调试:

// Simulator
<CGImage 0x7f9f674150f0> (IP)
    <<CGColorSpace 0x600002893120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
        width = 1000, height = 500, bpc = 8, bpp = 32, row bytes = 4000 
        kCGImageAlphaLast | 0 (default byte order)  | kCGImagePixelFormatPacked 
        is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes
// -------------------------------------------- //

// Device
<CGImage 0x7f88df70d980> (DP)
    <<CGColorSpace 0x6000003dc540> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
        width = 1000, height = 500, bpc = 8, bpp = 32, row bytes = 4000 
        kCGImageAlphaNoneSkipLast | 0 (default byte order)  | kCGImagePixelFormatPacked 
        is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes

由于alphaInfo是只读属性,有什么方法可以设置该值或重新创建将alphaValue设置为kCGImageAlphaLast

[我发现该颜色值乘以alpha值,但我对如何“恢复”“正确”值感到困惑不解。

https://developer.apple.com/documentation/coregraphics/cgimagealphainfo/kcgimagealphapremultipliedlast

我正在使用此扩展程序来获取像素颜色:扩展程序UIImage {下标(x:Int,y:Int)-> UIColor吗? {保护x> = 0 && x = 0&...

ios swift core-graphics core-image
1个回答
0
投票

您需要创建一个不透明的图像上下文,设置其alpha值并将原始图像绘制到该新上下文中。对于iOS10或更高版本,您可以使用UIGraphicsImageRenderer

© www.soinside.com 2019 - 2024. All rights reserved.