从CGImage获取像素信息并使用Swift 4进行更改

时间:2018-06-11 15:09:02

标签: swift

问题是我可以使用以下代码获取像素信息但无法回写。

    var pixelsCopy:[UInt8] = []
    let data: NSData = cgImage!.dataProvider!.data!  
    var pixels  = data.bytes.assumingMemoryBound(to: UInt8.self)


 while index < widthOfImage * heightOfImage * 4 {
    pixelsCopy.append( pixels[index] )   
    pixelsCopy.append( pixels[index + 1] )  
    pixelsCopy.append( pixels[index + 2] )
    pixelsCopy.append( pixels[index + 3] )
  index += 4
}

回写后,我的意思是跟随

   pixels[index] = newRedValue

我有“下标get-only”错误。 我记得,我们可以在Obj-C上做到这一点。

2 个答案:

答案 0 :(得分:0)

这是一种答案。

我无法更改像素数组,但我创建了pixelCopy数组播放该数组的RGB和Alpha值,然后首先创建一个CGImage然后创建一个UIImage。

但有时候最终的影像会变得扭曲,我不知道为什么。

要将pixelsCopy数组转换为CGImage,我使用了此代码

    let numComponents = 4
    let lenght = givenImageWidth * givenImageHeight * numComponents
    let bitmapInfo  = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)

    let colorspace = CGColorSpaceCreateDeviceRGB() 
    let rgbData = CFDataCreate(nil, pixelsCopy, lenght)!
    let provider = CGDataProvider(data: rgbData)!
    let rgbImageRef = CGImage(width: size_w,
                              height: size_h,
                              bitsPerComponent: 8,
                              bitsPerPixel: 8 * numComponents,
                              bytesPerRow: givenImageWidth * numComponents,
                              space: colorspace,
                              bitmapInfo: bitmapInfo,
                              provider: provider,
                              decode: nil,
                              shouldInterpolate: true,
                              intent: CGColorRenderingIntent.defaultIntent)!

    let finalUIImage = UIImage(cgImage: rgbImageRef)

    anImageView.image = finalUIImage

    pixelsCopy.removeAll()

如果你想看到好的和扭曲的图像,请查看下面图像底部的R字母。

左边的R是给定的图像,右边的是我的finalUIImage图像。

Shows the images

答案 1 :(得分:0)

您无法将像素写回CGImageCGImage是只读的。你需要:

  1. 创建CGContext
  2. 将图像绘制到其中。
  3. 在图像上绘制您想要的任何内容。
  4. 要求上下文创建新图像。