当前位置: 首页 > 面试题库 >

更改UIImage中某些像素的颜色

柳威
2023-03-14
问题内容

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

  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
    }
}


 类似资料:
  • 对于给定的多色PNG(带透明度),最好的/快速的惯用方式是什么: 创建一个重复的 关于SO有几个相关的问题,但是我还没有找到有效的方法。

  • 问题内容: 我想从我的Fluke机器人那里得到一张图像,并确定图像中每个像素的颜色。然后,如果像素大部分为红色,请将其更改为完全绿色。如果像素大部分是绿色,请将其更改为完全蓝色。如果像素大部分是蓝色,请将其更改为完全红色。这是我能够做的,但是我无法使它工作以获取必须更改的图像。没有语法错误,这只是语义上的麻烦。我正在使用python。 我尝试的代码: 我也保存了如下图片: 问题答案: 我假设您正在

  • 问题内容: 我需要在python中更改图像的像素颜色。除了像素值(255,0,0)红色外,我需要将每个像素颜色值更改为黑色(0,0,0)。我尝试了以下代码,但没有帮助。 问题答案: 参见此Wikibook:https : //zh.wikibooks.org/wiki/Python_Imaging_Library/Editing_Pixels 修改该代码以适合您的问题:

  • 很抱歉问这个问题,但我不知道如何将UIImage表示为每个像素的UIColor数组。我尽了最大努力转换,但没有得到想要的结果。

  • 问题内容: 我正在尝试使用Swift来获取UIImage中像素的颜色,但它似乎总是返回0。这是从@Minas 对此线程的回答中转换的代码: 提前致谢! 问题答案: 由于遇到了类似的问题,一些搜索将我引到了这里。您的代码工作正常。该问题可能是由您的图像引起的。 码: 发生的是此方法将从图像的CGImage中选择像素颜色。因此,请确保您选择的是正确的图像。例如,如果您的UIImage是200x200,

  • 我对Android很陌生,正在做我自己的迷你项目,我想改变一个特定像素的颜色。在寻找如何做到这一点时,我在几年前遇到了这个问题。我尝试了myBitmap。setPixel(10,10,Color.rgb(45,127,0)) ,但当我在手机上激活它时,我激活这行代码的那一刻它就崩溃了。每当我与位图交互时,它似乎就会崩溃<代码>int x=myBitmap。getHeight() 这一行也会使应用程