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会很好,但据我所知没有函数。

4

1 回答 1

6

imageWithData:用于标准图像文件格式的图像数据,例如内存中的 PNG 或 JPEG 文件。它不适合从原始数据创建图像。

为此,您通常会创建一个位图图形上下文,将您的数组、像素格式、大小等传递给CGBitmapContextCreate函数。创建位图上下文后,可以使用 从中创建图像,CGBitmapContextCreateImage它会为您提供CGImageRef可以传递给UIImage方法的图像imageWithCGImage:

这是一个基本示例,它创建一个带有一个红色像素和一个绿色像素的 1×2 像素图像。它只是使用硬编码的像素值来显示颜色分量的顺序,通常,您当然会从其他地方获取这些数据:

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);
于 2012-10-13T00:32:43.663 回答