从RGB数据创建图像?

5
我遇到了一些困难。我有一些原始的RGB数据,值从0到255,想在iPhone上将其显示为图像,但不知道如何操作。有人能帮忙吗?我认为我可能需要使用CGImageCreate,但是不太理解。尝试查看类参考文档,但感觉很无助。
我只想生成一个10x10的灰度图像,其中包含一些计算结果,如果有一种简单的方法来创建PNG或其他格式的图像就太好了。

你能添加一些关于你的平台和使用的编程语言的细节吗?你提到了CGImageCreate,能否包含一个URL链接? - user481572
1
你能否提供一些你卡住的细节?对于那些没有看到其他问题的人:http://stackoverflow.com/questions/7221604/create-image-from-nsarray-data/7221751#7221751 - w-m
3个回答

14

一个非常基础的例子,类似于Mats建议的方式,但这个版本使用了一个外部像素缓冲区(pixelData):

const size_t Width = 10;
const size_t Height = 10;
const size_t Area = Width * Height;
const size_t ComponentsPerPixel = 4; // rgba

uint8_t pixelData[Area * ComponentsPerPixel];

// fill the pixels with a lovely opaque blue gradient:
for (size_t i=0; i < Area; ++i) {
    const size_t offset = i * ComponentsPerPixel;
    pixelData[offset] = i;
    pixelData[offset+1] = i;
    pixelData[offset+2] = i + i; // enhance blue
    pixelData[offset+3] = UINT8_MAX; // opaque
}

// create the bitmap context:
const size_t BitsPerComponent = 8;
const size_t BytesPerRow=((BitsPerComponent * Width) / 8) * ComponentsPerPixel;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef gtx = CGBitmapContextCreate(&pixelData[0], Width, Height, BitsPerComponent, BytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);

// create the image:
CGImageRef toCGImage = CGBitmapContextCreateImage(gtx);
UIImage * uiimage = [[UIImage alloc] initWithCGImage:toCGImage];

NSData * png = UIImagePNGRepresentation(uiimage);

// remember to cleanup your resources! :)

看起来就像我要找的东西。唯一的问题是现在我遇到了Mach-O错误:( - John P
它正在工作,但您介意简要解释一下我如何更改像素数据以获取我想要显示的内容吗?如果您不想也谢谢您提供代码! - John P
pixelData是一个连续的rgba像素组件缓冲区,非常常见于C语言图形处理中。它的内存布局(单调递增)是rgbargbargbargbargba... 你可以看到我是如何通过在示例中设置pixelData元素来生成蓝色渐变的。我不确定你具体的问题是什么...也许这个链接可以帮助你(?): http://en.wikipedia.org/wiki/Pixels - justin
我有一个包含所有RGB值的数组,想将它们传递给类似这样的函数进行绘制。 - John P
如果那个数组是10x10像素值源,则可以将其传递给CGBitmapContextCreate而不是pixelData。或者将像素从缓冲区复制到pixelData - justin
显示剩余2条评论

3
使用CGBitmapContextCreate()函数来创建一个基于内存的位图。接着调用CGBitmapContextGetData()函数来获取指针,以便进行绘制操作。最后,使用CGBitmapContextCreateImage()函数来创建一个CGImageRef对象。
希望这些内容足以让您开始工作。

好的,我正在使用Xcode和Objective-C/Cocoa进行iOS编程。我遇到了困难,因为我之前从未使用过任何石英或CGImage相关的东西,而且每个人都只是说“使用CGBitmapContextCreate”之类的话,但我真的需要一个简单的例子。 - John P
另外,感谢提供的链接,但我无法让它正常工作,并开始怀疑它如何帮助我。我尝试打印出为unsigned char创建的数据,然后使用它来制作uiimage,期望它是rgb数据,但我无法正确显示它。这是使用示例项目时发生的情况。当我将其放入我的项目中时,似乎无法正确加载我的图像,并且拒绝记录任何内容。 - John P
我找到了另一个看起来不错的页面,但我还是不太明白。我对这个还很新。https://dev59.com/u3I-5IYBdhLWcg3w-92b - John P
另外,我刚刚尝试从UIImage中获取数据,但它只记录“PNG”。这是我的代码: UIImage *img = [UIImage imageNamed:@"img.png"]; NSData *dataObj = UIImagePNGRepresentation(img); NSString *aStr = [[NSString alloc] initWithData:dataObj encoding:NSASCIIStringEncoding]; NSLog(@"%@",aStr); - John P
PNGRepresentation基本上就是一种文件格式。但这不是你想要的。(或者至少,创建一个PNG文件与创建一张图片不同。) - David Dunham

1

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