2016-07-25 85 views
2

我正在制作一个应用程序,用于更改地图上的颜色以突出显示一个国家/地区。它就像一个代码系统,其中一个国家将具有特定的颜色,如果条件允许,该颜色将变为黄色,其余的将变为绿色。它与基于用户输入的标记系统类似,以突出特定的国家。我以前看过这篇文章,我修改了它,因此它可以使用参数作为检测颜色。 https://codedump.io/share/gEsdbwFbGT3T/1/change-color-of-certain-pixels-in-a-uiimage将基于RBG值的UIImage中的特定像素更改为不同的RBG颜色

这里是修改后的代码:

func processPixelsInImage(inputImage: UIImage, r: UInt8, b: UInt8, g: UInt8) -> UIImage { 
     let inputCGImage  = inputImage.CGImage 
     let colorSpace  = CGColorSpaceCreateDeviceRGB() 
     let width   = CGImageGetWidth(inputCGImage) 
     let height   = CGImageGetHeight(inputCGImage) 
     let bytesPerPixel = 4 
     let bitsPerComponent = 8 
     let bytesPerRow  = bytesPerPixel * width 
     let bitmapInfo  = CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue 

     let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo)! 
     CGContextDrawImage(context, CGRectMake(0, 0, CGFloat(width), CGFloat(height)), inputCGImage) 

     let pixelBuffer = UnsafeMutablePointer<UInt32>(CGBitmapContextGetData(context)) 

     var currentPixel = pixelBuffer 

     for _ in 0 ..< Int(height) { 
      for _ in 0 ..< Int(width) { 
       let pixel = currentPixel.memory 

       if red(pixel) == r && green(pixel) == g && blue(pixel) == b { 
        currentPixel.memory = rgba(red: 0, green: 170, blue: 0, alpha: 255) 
       } 
       currentPixel = currentPixel.successor() 
      } 
     } 

     let outputCGImage = CGBitmapContextCreateImage(context) 
     let outputImage = UIImage(CGImage: outputCGImage!, scale: inputImage.scale, orientation: inputImage.imageOrientation) 

     return outputImage 
    } 

    func alpha(color: UInt32) -> UInt8 { 
     return UInt8((color >> 24) & 255) 
    } 

    func red(color: UInt32) -> UInt8 { 
     return UInt8((color >> 16) & 255) 
    } 

    func green(color: UInt32) -> UInt8 { 
     return UInt8((color >> 8) & 255) 
    } 

    func blue(color: UInt32) -> UInt8 { 
     return UInt8((color >> 0) & 255) 
    } 

    func rgba(red red: UInt8, green: UInt8, blue: UInt8, alpha: UInt8) -> UInt32 { 
     return (UInt32(alpha) << 24) | (UInt32(red) << 16) | (UInt32(green) << 8) | (UInt32(blue) << 0) 
    } 

当我使用比色黑(0,0,0)它不检测和改变颜色之外的RGB值。由于数据类型不同,我不确定它是否与rgb值的普通CG颜色不同,但我仍然不确定如何充分使用此功能。如何使用RGB值检测黑色以外的颜色并将其更改为另一个?

回答

1

我调整类似的代码来改变所有的UIImage白色像素为清晰像素

(SWIFT 3)

func processPixelsInImage(_ 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) 

let white = RGBA32(red: 255, green: 255, blue: 255, alpha: 255) 
let clear = RGBA32(red: 0, green: 0, blue: 0, alpha: 0) 

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

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

return outputImage 

} 


struct RGBA32: Equatable { 
var color: UInt32 

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

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

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

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

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

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

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

}