gpt4 book ai didi

iphone - PNG 图像周围的黑色边框,使用 OpenGL 绘制

转载 作者:行者123 更新时间:2023-12-03 20:32:15 26 4
gpt4 key购买 nike

当我尝试使用 OpenGL 绘制具有透明度的 PNG 图像时,周围出现奇怪的黑色边框:

Two images with borders

但是原始图像是干净且正常的:

Normal icons

我的代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

UIImage* allIcons = [[appDelegate load_image_from_zip: pl.icons[ico_index]] retain];

CGRect rect = CGRectMake( 0, 0, allIcons.size.width/nIcons, allIcons.size.height );
UIGraphicsBeginImageContext(rect.size);

CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextTranslateCTM ( currentContext, 0, allIcons.size.height );
CGContextScaleCTM ( currentContext, 1, -1 );

CGRect clippedRect = CGRectMake(0, 0, rect.size.width, rect.size.height);
CGContextClipToRect( currentContext, clippedRect);
CGRect drawRect = CGRectMake(rect.origin.x * -1, rect.origin.y * -1, allIcons.size.width, allIcons.size.height);
CGContextDrawImage(currentContext, drawRect, allIcons.CGImage);

最佳答案

这是可怕的预乘 alpha 问题。在弄清楚之前,我为此苦苦挣扎了一周。告诉您的项目不压缩 .png 文件并不能解决问题,因为各种 API 调用将重新乘以 alpha。我就是这样解决的。

设置混合模式和颜色时:

blendFuncSource =  premultAlpha ? GL_ONE : GL_SRC_ALPHA;
blendFuncDestination = GL_ONE_MINUS_SRC_ALPHA;

if (premultAlpha)
{
glColor4f(colorfilter.red*colorfilter.alpha, colorfilter.green*colorfilter.alpha, colorfilter.blue*colorfilter.alpha, colorfilter.alpha);
}
else
{
glColor4f(colorfilter.red, colorfilter.green, colorfilter.blue, colorfilter.alpha);
}

您需要弄清楚图像是否使用了预乘 Alpha。您可以通过在加载 png header 时检查它们来执行此操作:

CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo( image );

...

switch( bitmapInfo & kCGBitmapAlphaInfoMask )
{
case kCGImageAlphaPremultipliedFirst:
premultAlpha = YES;
srcFormat = GL_BGRA;
break;

case kCGImageAlphaFirst:
srcFormat = GL_BGRA;
break;

case kCGImageAlphaNoneSkipFirst:
srcFormat = GL_BGRA;
break;

default:
srcFormat = GL_RGBA;
}

我在这里解释了很多代码,希望它仍然有帮助。

关于iphone - PNG 图像周围的黑色边框,使用 OpenGL 绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7259880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com