You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:26:00