gpt4 book ai didi

ios - 更改 UIImage 中某些像素的颜色

转载 作者:IT王子 更新时间:2023-10-29 05:07:18 26 4
gpt4 key购买 nike

对于给定的多色 PNG UIImage(具有透明度),最好的/Swift 惯用的方法是:

  1. 创建一个重复的UIImage
  2. 找到副本中的所有黑色像素并将它们更改为红色
  3. (返回修改后的副本)

SO 上有一些相关问题,但我没能找到有用的东西。

最佳答案

您必须提取图像的像素缓冲区,此时您可以循环遍历,根据需要更改像素。最后,从缓冲区创建一个新图像。

在 Swift 3 中,这看起来像:

func processPixels(in image: UIImage) -> UIImage? {
guard let inputCGImage = image.cgImage else {
print("unable to get cgImage")
return nil
}
let colorSpace = CGColorSpaceCreateDeviceRGB()
let width = inputCGImage.width
let height = inputCGImage.height
let bytesPerPixel = 4
let bitsPerComponent = 8
let bytesPerRow = bytesPerPixel * width
let bitmapInfo = RGBA32.bitmapInfo

guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) else {
print("unable to create context")
return nil
}
context.draw(inputCGImage, in: CGRect(x: 0, y: 0, width: width, height: height))

guard let buffer = context.data else {
print("unable to get context data")
return nil
}

let pixelBuffer = buffer.bindMemory(to: RGBA32.self, capacity: width * height)

for row in 0 ..< Int(height) {
for column in 0 ..< Int(width) {
let offset = row * width + column
if pixelBuffer[offset] == .black {
pixelBuffer[offset] = .red
}
}
}

let outputCGImage = context.makeImage()!
let outputImage = UIImage(cgImage: outputCGImage, scale: image.scale, orientation: image.imageOrientation)

return outputImage
}

struct RGBA32: Equatable {
private var color: UInt32

var redComponent: UInt8 {
return UInt8((color >> 24) & 255)
}

var greenComponent: UInt8 {
return UInt8((color >> 16) & 255)
}

var blueComponent: UInt8 {
return UInt8((color >> 8) & 255)
}

var alphaComponent: UInt8 {
return UInt8((color >> 0) & 255)
}

init(red: UInt8, green: UInt8, blue: UInt8, alpha: UInt8) {
let red = UInt32(red)
let green = UInt32(green)
let blue = UInt32(blue)
let alpha = UInt32(alpha)
color = (red << 24) | (green << 16) | (blue << 8) | (alpha << 0)
}

static let red = RGBA32(red: 255, green: 0, blue: 0, alpha: 255)
static let green = RGBA32(red: 0, green: 255, blue: 0, alpha: 255)
static let blue = RGBA32(red: 0, green: 0, blue: 255, alpha: 255)
static let white = RGBA32(red: 255, green: 255, blue: 255, alpha: 255)
static let black = RGBA32(red: 0, green: 0, blue: 0, alpha: 255)
static let magenta = RGBA32(red: 255, green: 0, blue: 255, alpha: 255)
static let yellow = RGBA32(red: 255, green: 255, blue: 0, alpha: 255)
static let cyan = RGBA32(red: 0, green: 255, blue: 255, alpha: 255)

static let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrder32Little.rawValue

static func ==(lhs: RGBA32, rhs: RGBA32) -> Bool {
return lhs.color == rhs.color
}
}

有关 Swift 2 版本,请参阅 previous revision of this answer .

关于ios - 更改 UIImage 中某些像素的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com