如何在iOS SWIFT上创建ARGB8888二进制镜像

fdbelqdn  于 2022-10-04  发布在  iOS
关注(0)|答案(1)|浏览(112)

我使用以下代码来创建ARGB8888映像。这是ARBG8888的正确图像格式,还是应该使用不同的格式。此链接用于创建以下图像格式

guard let imageConversionToCGImage = img.cgImage,
              let imageFormat = vImage_CGImageFormat(
                bitsPerComponent: 8,
                bitsPerPixel: 32,
                colorSpace: CGColorSpaceCreateDeviceRGB(),
                bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue),
                renderingIntent: .defaultIntent),    
                //Source buffer
                let sourceBuffer = try? vImage_Buffer(cgImage: imageConversionToCGImage, format: imageFormat, flags: .noFlags),
              //ARGBImage
                let argb8888CGImage = try? sourceBuffer.createCGImage(format: imageFormat) else { return } ```

我正在使用DataProvider.CFData获取图像数据。这是正确的格式还是我做错了。我应该怎么做才能拿到ARGB的数据。

zqry0prt

zqry0prt1#

当您将填充的vImage_CGImageFormat传递给该初始化式时,vImage将尝试将源映像转换为指定的格式。例如,您可以传递灰度图像格式,例如:

let imageFormat = vImage_CGImageFormat(
    bitsPerComponent: 8,
    bitsPerPixel: 8,
    colorSpace: CGColorSpaceCreateDeviceGray(),
    bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue),
    renderingIntent: .defaultIntent)

并且返回的缓冲区将包含源图像的灰度表示,而不管源图像的格式如何。

如果要根据源映像的格式填充缓冲区,请传递一个空的vImage_CGImageFormat并使用vImageBuffer_InitWithCGImage函数:

var imageFormat = vImage_CGImageFormat()
var sourceBuffer = vImage_Buffer()
vImageBuffer_InitWithCGImage(&sourceBuffer,
                             &imageFormat,
                             nil,
                             cgImage,
                             vImage_Flags(kvImageNoFlags))

返回时,imageFormat包含源图像的颜色空间和位深度,sourceBuffer包含图像本身。

苹果刚刚发布了vImage.PixelBuffer,它为vImage提供了一个SWIFT友好的API。看看init(cgImage:cgImageFormat:pixelFormat:)

最后,init(data:width:height:byteCountPerRow:pixelFormat:)展示了从Core Graphics图像的底层数据创建vImage像素缓冲区的示例。

相关问题