2

例如,我有一个 UIImage(如果需要,我可以从中获取 CGImage、CGLayer 等),我想用蓝色 (0, 0, 1) 替换所有红色像素 (1, 0, 0) )。

我有代码来确定哪些像素是目标颜色(参见这个 SO question & answer),我可以在 rawData 中替换适当的值,但是(a)我不知道如何从我的 rawData 缓冲区中取回 UIImage 和(b) 似乎我可能缺少一个内置程序,它会自动为我完成所有这些工作,让我免于悲伤。

谢谢!

4

1 回答 1

9

好的,所以我们将 UIImage 放入 rawBits 缓冲区(请参阅原始问题中的链接),然后我们根据自己的喜好调整缓冲区中的数据(即,将所有红色组件(每 4 个字节)设置为 0,作为测试),现在需要获取一个表示旋转数据的新 UIImage。

我在Erica 苏丹的 iPhone Cookbook第 7 章(图像),示例 12(位图)中找到了答案。相关调用为 CGBitmapContextCreate(),相关代码为:

+ (UIImage *) imageWithBits: (unsigned char *) bits withSize: (CGSize)  
size
{
    // Create a color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        free(bits);
        return nil;
    }

    CGContextRef context = CGBitmapContextCreate (bits, size.width,  
size.height, 8, size.width * 4, colorSpace,  
kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
        fprintf (stderr, "Error: Context not created!");
        free (bits);
        CGColorSpaceRelease(colorSpace );
        return nil;
    }

    CGColorSpaceRelease(colorSpace );
    CGImageRef ref = CGBitmapContextCreateImage(context);
    free(CGBitmapContextGetData(context));
    CGContextRelease(context);

    UIImage *img = [UIImage imageWithCGImage:ref];
    CFRelease(ref);
    return img;
}

希望这对未来的网站探险者有用!

于 2009-08-11T23:38:29.367 回答