当前位置:  开发笔记 > IOS > 正文

如何从iPhone OS中的PNG图像中获取干净的Alpha通道信息?

如何解决《如何从iPhoneOS中的PNG图像中获取干净的Alpha通道信息?》经验,为你挑选了1个好方法。

我创建了一个这样的上下文(简化):

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef context = CGBitmapContextCreate (bitmapData,
  pixWide,
  pixHeigh,
  8, // bits per component
  bitmapBytesPerRow,
  colorSpace,
  kCGImageAlphaPremultipliedFirst);

现在,当我尝试使用Alphatransparency为我的PNG中的第一个像素提取数据时,它有非常奇怪的alpha值.我有一个简单的PNG,它是一个正方形.在每个边缘上,我切掉了10x10像素,使它们完全透明.阿尔法不应该像153那样.

在CGImage.h中声明了一个kCGImageAlphaOnly.医生说:

kCGImageAlphaOnly没有颜色数据,只有alpha通道.

好吧,这实际上听起来不错,因为我只需要Alpha数据,而不需要其他任何东西.但这引起了我脑海中的一些问号.如果我有一个装备齐全的PNG,有一堆颜色+ alpha:这是否会确保我的PNG转换为匹配该颜色空间?或者我是否必须提供与指定颜色空间匹配的PNG?

编辑:我尝试使用kCGImageAlphaOnly,但是我收到此错误:

: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 0-component colorspace; kCGImageAlphaOnly; 55 bytes/row.

这可能是什么问题?我之前指定了这个:

size_t pixelsWide = CGImageGetWidth(inImage);
size_t pixelsHigh = CGImageGetHeight(inImage);
bitmapBytesPerRow = (pixelsWide * 1); // not * 4, because I just want alpha
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

编辑:我一分钟前读过这篇文章:

添加到XCode的PNG在编译期间通过'pngcrush'进行优化.这会进行一些字节交换(从RGBA到BRGA)和alpha的预乘.

我认为这种alpha的预乘会会带来麻烦.

编辑:在pngcrunch对PNG进行字节交换之后,alpha通道保持不变.因为我不关心颜色,只是alpha,我认为预乘不应该是一个太大的问题.

我的PNG已经是24位PNG,我将它们添加到Xcode中.



1> Jim Dovey..:

你不能这样做:

bitmapBytesPerRow = (pixelsWide * 1); // not * 4, because I just want alpha

您正在调用的函数将始终返回所有图像数据.该kCGImageAlphaOnly常数被用来告诉你,图像仅包含一个alpha通道,没有颜色信息.

你需要使用pixelsWide * 4bytesPerRow.另请注意,CGBitmapContextCreate()的bitmapData参数用于显式提供存储空间,而不是为您绘制存储空间.

可能你要做的就是这个(未经测试的代码,只需从内存中输入):

CGImageRef image = GetMyImageFromWhereverItIs();
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate( NULL, CGImageGetWidth(image),
        CGImageGetHeight(image), CGImageGetBitsPerComponent(image),
        CGImageGetBytesPerRow(image), space,
        kCGBitmapByteOrderDefault | kCGImageAlphaLast );
CGColorSpaceRelease( space );

// now draw the image into the context
CGRect rect = CGRectMake( 0, 0, CGImageGetWidth(image), CGImageGetHeight(image) );
CGContextDrawImage( ctx, rect, image );
UInt32 * pixels = CGBitmapContextGetData( ctx );

// now we can iterate through the data & read the alpha values
int i, count = CGBitmapContextGetBytesPerRow(ctx) * CGBitmapContextGetHeight(ctx);
for ( i = 0; i < count; i++ )
{
    UInt8 alpha = pixels[i] & 0x000000ff;
    // do with the alpha what you will
}

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有