将C数组转换为UIImage(适用于iOS)

4

我目前在一个C数组中拥有一些图像数据,其中包含RGBA数据。

float array[length][4]

我正在尝试将其转换为UIImage,看起来这些是通过文件、NSData和URL进行初始化的。由于其他两种方法很慢,所以我最感兴趣的是NSData方法。

我可以这样将所有这些值放入NSArray中:

for (i=0; i<image.size.width * image.size.height; i++){
    replace = [UIColor colorWithRed:array[i][0] green:array[i][1] blue:array[i][2] alpha:array[i][3]];
    [output replaceObjectAtIndex:i withObject:replace];
}

我有一个包含UIColor对象的NSArray。我尝试了许多方法,但是如何将其转换为UIImage?

我认为这应该很简单。类似于imageWithData:data R:0 B:1 G:2 A:3 length:length width:width length:length这样的函数会很不错,但据我所知,没有这样的函数。

1个回答

6
imageWithData: 适用于标准图像文件格式(例如,你在内存中拥有的 PNG 或 JPEG 文件)的图像数据。但不适用于从原始数据创建图像。
为此,您通常会创建位图图形上下文,并将您的数组、像素格式、大小等传递给 CGBitmapContextCreate 函数。当您创建了位图上下文后,可以使用 CGBitmapContextCreateImage 创建一个图像,它会给您一个 CGImageRef,您可以将其传递给 UIImage 方法 imageWithCGImage:
下面是一个基本示例,它创建了一个只有一个红色像素和一个绿色像素的 win2×1 的小图像。它只使用硬编码像素值来显示颜色组件的顺序,当然,你通常会从其他地方获得这些数据:
size_t width = 2;
size_t height = 1;
size_t bytesPerPixel = 4;
//4 bytes per pixel (R, G, B, A) = 8 bytes for a 1x2 pixel image:
unsigned char rawData[8] = {255, 0, 0, 255,  //red
                            0, 255, 0, 255}; //green

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
size_t bytesPerRow = bytesPerPixel * width;
size_t bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);

CGImageRef cgImage = CGBitmapContextCreateImage(context);
//This is your image:
UIImage *image = [UIImage imageWithCGImage:cgImage];
//Don't forget to clean up:
CGImageRelease(cgImage);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);

你能给我更多的细节吗?如果可以的话,举个例子会非常有帮助。从我的理解来看,我使用CGBitmapContextCreate函数创建一个CGBitmapContextRef,但是无法在任何地方找到CGBitmapContextRef。然后我将该创建传递给CGBitmapContextCreateImage,然后将其传递给imageWithCGImage。正确吗? - Scott
抱歉,CGBitmapContextRef 是错误的,CGBitmapContextCreate 函数实际上只返回一个普通的 CGContextRef。我会看看能否找到一个简单的例子... - omz
我已经在答案中添加了一个基本示例。 - omz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接