1

我正在尝试为 iOS 5.1 设备创建 UIImage 测试模式。目标 UIImageView 的大小为 320x240,但我试图创建一个 160x120 UIImage 测试模式(未来,非测试模式图像将是这个大小)。我希望框的上半部分为蓝色,下半部分为红色,但我得到了看起来像未初始化的内存破坏了图像底部的东西。代码如下:

int width = 160;
int height = 120;
unsigned int testData[width * height];
for(int k = 0; k < (width * height) / 2; k++)
    testData[k] = 0xFF0000FF;   // BGRA (Blue)
for(int k = (width * height) / 2; k < width * height; k++)
    testData[k] = 0x0000FFFF;   // BGRA (Red)

int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * width;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, &testData, (width * height * 4), NULL);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();      
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, 
                                    colorSpaceRef, bitmapInfo, provider, NULL, NO,renderingIntent);

UIImage *myTestImage = [UIImage imageWithCGImage:imageRef];

这应该看起来像 Stack Overflow 上的另一个示例。无论如何,我发现当我减小测试图案的大小时,图像的“损坏”部分会增加。同样奇怪的是,我在“损坏”部分看到了红色线条,所以看起来我只是在弄乱组件的大小。我错过了什么?感觉就像提供者中的某些东西,但我没有看到。

谢谢!

添加了屏幕截图。这是设置 kCGImageAlphaNoneSkipFirst 的样子:

AlphaSkipFirst

这是 kCGImageAlphaFirst 的样子:

在此处输入图像描述

4

2 回答 2

2

您的像素数据在一个自动变量中,因此它存储在堆栈中:

unsigned int testData[width * height];

您必须从声明此数据的函数返回。这使得函数的堆栈帧被其他函数弹出并重用,从而覆盖数据。

但是,您的图像仍然引用堆栈上同一地址的像素数据。(CGDataProviderCreateWithData不复制数据,它只是引用它。)

修复:使用mallocorCFMutableDataNSMutableData为堆上的像素数据分配空间。

于 2012-03-26T15:58:21.517 回答
0

您的图像包含 alpha,然后您通过跳过最高有效位(即图像的“B”部分)告诉系统忽略它。尝试将其设置为 kCGImageAlphaPremultipliedLast。

编辑:

现在我记得字节顺序,我意识到程序可能正在向后读取您的值,所以您可能真正想要的是 kCGImageAlphaPremultipliedFirst

于 2012-03-25T23:54:27.000 回答