Swift教程:如何修改UIImage背景色与选中区域颜色
实现UIImage颜色反转(白背景红选区转黑背景白选区)
Swift 实现方案
可以通过直接操作图片像素完成颜色替换,代码示例如下:
func convertImage(_ originalImage: UIImage) -> UIImage? { guard let cgImage = originalImage.cgImage else { return nil } let width = cgImage.width let height = cgImage.height let colorSpace = CGColorSpaceCreateDeviceRGB() let bytesPerPixel = 4 let bytesPerRow = bytesPerPixel * width let bitsPerComponent = 8 var pixels = [UInt8](repeating: 0, count: width * height * bytesPerPixel) guard let context = CGContext(data: &pixels, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { return nil } context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height)) for i in stride(from: 0, to: pixels.count, by: bytesPerPixel) { let red = pixels[i] let green = pixels[i+1] let blue = pixels[i+2] // 判断白色背景并替换为黑色 if red >= 240 && green >= 240 && blue >= 240 { pixels[i] = 0 pixels[i+1] = 0 pixels[i+2] = 0 } // 判断红色选区并替换为白色 else if red >= 240 && green <= 20 && blue <= 20 { pixels[i] = 255 pixels[i+1] = 255 pixels[i+2] = 255 } // 保留Alpha通道不变 } guard let newCGImage = context.makeImage() else { return nil } return UIImage(cgImage: newCGImage) }
调用示例:
if let originalImage = UIImage(named: "yourImage"), let convertedImage = convertImage(originalImage) { // 保存转换后的图片到沙盒 if let data = convertedImage.pngData() { let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let savePath = documentsDir.appendingPathComponent("converted_image.png") try? data.write(to: savePath) } }
Objective-C 实现方案
如果项目使用Objective-C,对应的实现代码如下:
- (UIImage *)convertImage:(UIImage *)originalImage { CGImageRef cgImage = originalImage.CGImage; size_t width = CGImageGetWidth(cgImage); size_t height = CGImageGetHeight(cgImage); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); size_t bytesPerPixel = 4; size_t bytesPerRow = bytesPerPixel * width; size_t bitsPerComponent = 8; UInt8 *pixels = (UInt8 *)malloc(width * height * bytesPerPixel); CGContextRef context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage); for (size_t i = 0; i < width * height * bytesPerPixel; i += bytesPerPixel) { UInt8 red = pixels[i]; UInt8 green = pixels[i+1]; UInt8 blue = pixels[i+2]; // 替换白色背景为黑色 if (red >= 240 && green >= 240 && blue >= 240) { pixels[i] = 0; pixels[i+1] = 0; pixels[i+2] = 0; } // 替换红色选区为白色 else if (red >= 240 && green <= 20 && blue <= 20) { pixels[i] = 255; pixels[i+1] = 255; pixels[i+2] = 255; } } CGImageRef newCGImage = CGBitmapContextCreateImage(context); UIImage *convertedImage = [UIImage imageWithCGImage:newCGImage]; // 释放内存 CGColorSpaceRelease(colorSpace); CGContextRelease(context); CGImageRelease(newCGImage); free(pixels); return convertedImage; }
调用示例:
UIImage *originalImage = [UIImage imageNamed:@"yourImage"]; UIImage *convertedImage = [self convertImage:originalImage]; if (convertedImage) { NSData *imageData = UIImagePNGRepresentation(convertedImage); NSURL *documentsDir = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]; NSURL *savePath = [documentsDir URLByAppendingPathComponent:@"converted_image.png"]; [imageData writeToURL:savePath atomically:YES]; }
注意事项
- 代码中用颜色阈值(如
red >=240)判断颜色,可根据实际图片的颜色深浅调整阈值,确保识别准确。 - 图片的透明通道会被保留,无需额外处理。
- 超大图片可考虑分块处理或Core Image滤镜优化性能。
内容的提问来源于stack exchange,提问作者tomtao
相关产品推荐
相关产品推荐

