Tec*_*Zen 25 iphone png alpha cgimage cgbitmapcontextcreate
我有一个PNG图像具有不受支持的位图图形上下文像素格式.每当我尝试调整图像大小时,都会CGBitmapContextCreate()以不支持的格式进行扼流
我收到以下错误(格式错误,以方便阅读):
CGBitmapContextCreate: unsupported parameter combination:
8 integer bits/component;
32 bits/pixel;
3-component colorspace;
kCGImageAlphaLast;
1344 bytes/row.
Run Code Online (Sandbox Code Playgroud)
在支持的像素格式列表绝对不支持这种组合.看来我需要重绘图像并将alpha通道信息移动到kCGImageAlphaPremultipliedFirst或kCGImageAlphaPremultipliedLast.
我不知道该怎么做.
PNG文件没有任何异常,并且没有损坏.它在所有其他环境中工作得很好.我偶然遇到这个错误,但显然我的用户可能有类似格式的文件,所以我必须检查我的应用程序的导入图像并纠正这个问题.
小智 56
是的,我遇到了8位(索引).PNG的问题.我不得不将其转换为更原生的图像来执行图形操作.我基本上做了这样的事情:
- (UIImage *) normalize {
CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL,
self.size.width,
self.size.height,
8, (4 * self.size.width),
genericColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(genericColorSpace);
CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
CGRect destRect = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
CGContextRelease(thumbBitmapCtxt);
UIImage *result = [UIImage imageWithCGImage:tmpThumbImage];
CGImageRelease(tmpThumbImage);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这是Alfons回答帐户屏幕比例的方法的更新版本,还有一些愚蠢的错误,其中包含图像大小的浮点值中的小数,如原始答案的非同步评论中所述.
SCREEN_SCALE是一个宏,如果未定义比例或者实际上是设备比例,则返回1.0([UIScreen mainScreen] .scale).
- (UIImage *) normalize {
CGSize size = CGSizeMake(round(self.size.width*SCREEN_SCALE), round(self.size.height*SCREEN_SCALE));
CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL,
size.width,
size.height,
8, (4 * size.width),
genericColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(genericColorSpace);
CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
CGRect destRect = CGRectMake(0, 0, size.width, size.height);
CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
CGContextRelease(thumbBitmapCtxt);
UIImage *result = [UIImage imageWithCGImage:tmpThumbImage scale:SCREEN_SCALE orientation:UIImageOrientationUp];
CGImageRelease(tmpThumbImage);
return result;
}
Run Code Online (Sandbox Code Playgroud)