我有两张照片。其中一个只是纯白色,并且有一些具有alpha透明度的区域。它旨在成为使另一个图像透明的掩模。另一个图像,全彩色和PNG,在任何地方都没有应用alpha。
所以我想将遮罩图像的alpha值添加到另一个的alpha值。两个图像具有完全相同的大小。我想,这只是环绕像素的问题。知道这看起来有多详细吗?
答案 0 :(得分:1)
查看Alpha合成。 http://en.wikipedia.org/wiki/Alpha_compositing看起来你正在尝试执行A out B.
答案 1 :(得分:1)
“clemahieu”是对的 - 在这种情况下你不必担心预乘alpha,因为你正在进行高级操作,而实际的像素格式是一个低级细节。
如果您只是使用正确的合成运算符将白色/ alpha图像合成到彩色/无alpha图像(在颜色/ alpha缓冲区中),您将得到您想要的结果。
-Wil
答案 2 :(得分:1)
CGImageRef resultImage = CGImageCreateWithMask([imageA CGImage],[imageB CGImage]); UIImage * img = [UIImage imageWithCGImage:resultImage]; CGImageRelease(resultImage); return img;
答案 3 :(得分:0)
我能想到的最快的方法是获取每个图像缓冲区的指针,并将它们组合在第三个缓冲区中,循环遍历所有像素,就像你提到的那样。
或者,如果源(颜色)图像具有Alpha通道,但它设置为1,则只用第二个图像中的alpha替换该通道。
从Panther中开始Quartz具有仅alpha的位图上下文,可用于屏蔽其他图像。优秀的图书programming with quartz 2d and pdf graphics in mac os x有一个关于alpha only bitmap contexts的部分。
要从压缩的PNG文件中获取alpha,您可以执行类似以下操作:
CGImageRef myImage = [self CGImage];
CGSize newSize = {CGImageGetWidth(myImage), CGImageGetHeight(myImage)};
if(!isPowerOf2(newSize.width))
newSize.width = nextPowerOf2(newSize.width);
if(!isPowerOf2(newSize.height))
newSize.height = nextPowerOf2(newSize.height);
const GLint picSize = newSize.height * newSize.width * 4;
// The bitmapinfo provided by the CGImageRef isn't supported by the bitmap context.
// So I'll make a conforming bitmap info
CGBitmapInfo myInfo = kCGImageAlphaPremultipliedLast;
unsigned char * actual_bytes = new unsigned char[picSize];
CGContextRef imageContext = CGBitmapContextCreate(
actual_bytes,
newSize.width,
newSize.height,
CGImageGetBitsPerComponent(myImage),
newSize.width * 4,
CGImageGetColorSpace(myImage),
myInfo);
CGContextSaveGState(imageContext);
CGContextDrawImage(imageContext, [self bounds], myImage);
CGContextRestoreGState(imageContext);
此时,actual_bytes具有RGBA数据。不要忘记删除actual_bytes的内存。这是UIImage上的一个类别,因此self是一个已经从PNG文件加载的UIImage。