【问题标题】:Alpha is ignored in my pixel array when using CGBitmapContextCreate使用 CGBitmapContextCreate 时,我的像素数组中忽略了 Alpha
【发布时间】:2015-11-18 12:30:27
【问题描述】:

我正在尝试使用像素数组绘制带有 coregraphics 的图像。

我的图像是 568x320,这是我的代码:

int k = 0;
unsigned char pixels[320 * 568*4];
for(int i = 0; i<568/1;i++) {
    for(int j = 0; j<320/1;j++) {
        pixels[k] = 212; //B
        pixels[k+1] = 2; //G
        pixels[k+2] = 87;//R
        pixels[k+3] = drand48()*255; //A
        k+=4;
    }
}
void *baseAddress = &pixels;


NSUInteger bitsPerComponent = 8;

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate(baseAddress, 568, 320, 8, 4*568, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);

CGImageRef cgImage = CGBitmapContextCreateImage(context);

CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

UIImage *textureImage = [UIImage imageWithCGImage:cgImage];

基本上,颜色看起来是对的,但没有透明度。如果 alpha 为 0,则图像为黑色,否则为蓝色。

知道为什么我没有透明度吗?

编辑:

这是我的结果以及我对 Alpha 的预期结果

我得到了第二个结果

for(int i = 0; i<568/1;i++) {
    for(int j = 0; j<320/1;j++) {
       [[UIColor colorWithRed:87./255 green:2.0/255 blue:212.2/255 alpha:drand48()] setFill];
       CGContextFillRect(ctx, CGRectMake(i, j, 1, 1));
    }
 }

但与 CGBitmapContextCreate 相比,它非常慢

【问题讨论】:

  • 您是否尝试过仅使用 rgb 顺序和 kCGImageAlphaPremultipliedLast 标志的“正常”设置?
  • 正常设置是什么意思?用 ARGB 代替 BGRA 吗?
  • 我的意思是 rgba(因此是 kCGImageAlphaPremultipliedLast 标志)。
  • 我仍然得到相同的颜色。

标签: ios objective-c quartz-core


【解决方案1】:

您错误地使用了CGBitmapContextCreate。第一个参数是目的地,而不是数据源。您甚至不需要创建位图上下文来创建 CGImage。检查以下代码。

int k = 0;
unsigned char pixels[320*568*4];
for(int i=0; i<568; i++) {
    for(int j=0; j<320; j++) {
        pixels[k] = 87; //R
        pixels[k+1] = 2; //G
        pixels[k+2] = 212; //B
        pixels[k+3] = drand48()*255; //A
        k+=4;
    }
}

CGDataProviderRef data = CGDataProviderCreateWithData(NULL, &pixels, 320*568*4*sizeof(char), NULL);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGImageRef cgImg = CGImageCreate(568, 320, 8, 4*8, 4*568, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, data, NULL, true, kCGRenderingIntentDefault);
UIImage *textureImage = [UIImage imageWithCGImage:cgImg];

CGColorSpaceRelease(colorSpace);
CGDataProviderRelease(data);
CGImageRelease(cgImg);

如果您想更改颜色顺序,请使用kCGBitmapByteOrderDefault | kCGImageAlphaLast 标志。

顺便说一句。为什么在循环条件下除以 1?

【讨论】:

  • 成功了,谢谢。我在除以 1 之前我被除以 2 用于测试目的,只是输入 1 以便更快地输入。谢谢
猜你喜欢
  • 2012-12-06
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2011-06-08
相关资源
最近更新 更多