0

我对在字节级别上使用 UIImages 很陌生,但我希望有人能指出我关于这个问题的一些指南?

我最终希望根据某些参数(位置、颜色等)编辑字节的 RGBA 值,我知道我以前遇到过示例/教程,但我似乎找不到任何东西现在。

基本上,我希望能够将 UIImage 分解为其字节并对其进行迭代并单独编辑字节的 RGBA 值。也许这里的一些示例代码也会有很大帮助。

我已经在不同的图像上下文中工作并使用 CG 电动工具编辑图像,但我希望能够在字节级别上工作。

编辑:

抱歉,但我明白您不能直接编辑 UIImage 中的字节。我应该更清楚地问我的问题。我的意思是问如何获取 UIImage 的字节,编辑这些字节,然后从这些字节创建一个新的 UIImage。

正如@BradLarson 所指出的,OpenGL 是一个更好的选择,这里有一个很棒的库,由@BradLarson 创建。感谢@CSmith 指出!

4

2 回答 2

2

@MartinR 有正确答案,这里有一些代码可以帮助您入门:

UIImage *image = 你的图片;

CGImageRef imageRef = image.CGImage;
NSUInteger nWidth = CGImageGetWidth(imageRef);
NSUInteger nHeight = CGImageGetHeight(imageRef);
NSUInteger nBytesPerRow = CGImageGetBytesPerRow(imageRef);
NSUInteger nBitsPerPixel = CGImageGetBitsPerPixel(imageRef);
NSUInteger nBitsPerComponent = CGImageGetBitsPerComponent(imageRef);
NSUInteger nBytesPerPixel = nBitsPerPixel == 24 ? 3 : 4;

unsigned char *rawInput = malloc (nWidth * nHeight * nBytesPerPixel);

CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rawInput, nWidth, nHeight, nBitsPerComponent, nBytesPerRow, colorSpaceRGB, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Big);
CGContextDrawImage (context, CGRectMake(0, 0, nWidth, nHeight), imageRef);          

// modify the pixels stored in the array of 4-byte pixels at rawInput
.
.
.

UIImage *imageNew = [[UIImage alloc] initWithCGImage:CGBitmapContextCreateImage(context)];

CGContextRelease (context);
free (rawInput);
于 2012-08-23T19:55:10.667 回答
1

您无法直接访问 an 中的字节,UIImage也无法直接更改它们。

您必须将图像绘制到 aCGBitmapContext中,修改位图中的像素,然后从位图上下文中创建一个新图像。

于 2012-08-23T19:44:41.343 回答