使用 CGBitmapContextCreate 时,我的像素数组中的 Alpha 被忽略
Alpha is ignored in my pixel array when using CGBitmapContextCreate
我正在尝试使用像素数组绘制带有核心图形的图像。
我的图片是 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
相比它非常慢
您使用的 CGBitmapContextCreate
不正确。第一个参数是 destination,不是数据源。您甚至不需要创建位图上下文来创建 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?
我正在尝试使用像素数组绘制带有核心图形的图像。
我的图片是 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
相比它非常慢您使用的 CGBitmapContextCreate
不正确。第一个参数是 destination,不是数据源。您甚至不需要创建位图上下文来创建 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?