gpt4 book ai didi

ios - 着色图像会忽略 alpha channel ——为什么以及如何解决?

转载 作者:可可西里 更新时间:2023-11-01 06:11:45 25 4
gpt4 key购买 nike

这是我正在尝试做的事情:左边 是一个通用的、未着色的 RGBA 图像,我在屏幕外创建并缓存以提高速度(最初创建速度很慢,但以后可以根据需要非常快速地用任何颜色着色)。这是一个带有圆形漩涡的方形图像。在圆圈内,图像的 alpha/不透明度为 1。在圆圈外,它的 alpha/不透明度为 0。我在背景颜色为 [UIColor scrollViewTexturedBackgroundColor] 右侧 是当我在设置 CGContextSetBlendMode(context, kCGBlendModeColor) 后尝试通过在图像顶部填充实心红色矩形来为图像着色时发生的情况。

Uncolorized Colorized Incorrectly

这不是我想要的,也不是我期望的。显然,出于某种奇怪的原因,为完全透明的像素着色(例如,alpha 值为 0)会导致完全填充颜色,而不是像我预期的那样保持透明。

我想要的其实是这样的:

Colorized Correctly

现在,在这种特殊情况下,我可以将剪裁区域设置为一个圆圈,这样圆圈外的区域就不会受到影响——这就是我在这里所做的解决方法。

但在我的应用程序中,我还需要能够为不知道剪切/轮廓路径的任意形状着色。一个示例是通过叠加渐变来为白色文本着色。这是怎么做到的?我怀疑一定有某种方法可以有效地做到这一点——通常,没有奇怪的路径/剪切技巧——使用图像蒙版……但我还没有找到这方面的教程。显然这是可能的,因为我在其他游戏中看到过彩色渐变文本。

顺便说一下,我不能做的是从渐变开始并剪掉/清除我不需要的部分——因为(如上例所示)我未着色的源图像通常是灰度而不是纯图像白色的。所以我真的需要从未着色的图像开始,然后对其进行着色。

附注— kCGBlendModeMultiply 在为部分透明图像着色时也有同样的缺陷/缺点/特质。有谁知道 为什么 Apple 决定这样做?就好像 Quartz 着色代码将 RGBA(0,0,0,0) 视为 RGBA(0,0,0,1),即它完全忽略并破坏了 alpha channel 。

最佳答案

您可以采用的一种可行方法是从原始图像构造一个 mask ,然后调用 CGContextClipToMask() 方法,然后再使用多重混合模式集渲染图像。这是 CoreGraphics 代码,它会在将图像绘制为颜色之前设置 mask 。

  CGContextRef context = [frameBuffer createBitmapContext];
CGRect bounds = CGRectMake( 0.0f, 0.0f, width, height );
CGContextClipToMask(context, bounds, maskImage.CGImage);
CGContextDrawImage(context, bounds, greyImage.CGImage);

稍微棘手的部分是获取原始图像并生成 maskImage。为此,您可以编写一个循环来检查每个像素并写入黑色或白色像素作为掩码值。如果要着色的图像中的原始像素是完全透明的,则写入黑色像素,否则写入白色像素。请注意,掩码值将是 24BPP 图像。这里有一些代码可以为您提供正确的想法。

  uint32_t *inPixels = (uint32_t*) MEMORY_ADDR_OF_ORIGINAL_IMAGE;
uint32_t *maskPixels = malloc(numPixels * sizeof(uint32_t));
uint32_t *maskPixelsPtr = maskPixels;

for (int rowi = 0; rowi < height; rowi++) {
for (int coli = 0; coli < width; coli++) {
uint32_t inPixel = *inPixels++;
uint32_t inAlpha = (inPixel >> 24) & 0xFF;
uint32_t cval = 0;
if (inAlpha != 0) {
cval = 0xFF;
}
uint32_t outPixel = (0xFF << 24) | (cval << 16) | (cval << 8) | cval;
*maskPixelsPtr++ = outPixel;
}
}

您当然需要填写所有细节并创建图形上下文等。但一般的想法是简单地创建您自己的蒙版来过滤掉圆圈外部的红色部分。

关于ios - 着色图像会忽略 alpha channel ——为什么以及如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127720/

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