一般Android半透明漏洞

6
我使用抗锯齿来让我的图片更加平滑。使用抗锯齿时,图像周围会绘制一个黑色边框。这是因为Android使用黑色并将其与图像中的黄色混合。这是一个普遍存在的问题!当我绘制一个矩形并将alpha值设置为127时,图像也会变得相当暗。Android不应该使用黑色来绘制透明度,而应该使用白色。
有什么解决这个问题的方法吗?
以下是在画布上绘制半透明矩形的示例源代码。然而,矩形同样很暗,但它应该很亮。
Bitmap bmp = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Paint rPaint = new Paint();
rPaint.setColor(Color.parseColor("#F7E836"));
rPaint.setAlpha(127);
rPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(0, 0, 100, 100, rPaint);

这些图像是使用以下库呈现的SVG图形: http://code.google.com/p/svg-android/ 我认为我找到了bug。问题在于SurfaceView。它的背景是黑色的。当我使用上面的代码并在ImageView上显示它时,如果UI元素背后的颜色是黑色,则会出现相同的半透明错误。 SurfaceView的背景颜色始终为黑色。如果我使用setBackgroundColor将其更改为白色,则SurfaceView变为白色,但是白色背景将覆盖我使用OpenGL绘制的所有其他图像。我认为这些必须交换。首先应该绘制背景颜色,然后才是OpenGL内容。
1个回答

2

请发布原始图片链接并展示您如何进行抗锯齿处理(代码)。

当图像进行抗锯齿处理时,算法将在构成边缘的颜色之间插入颜色。因此,对于您的黄色星形图像,如果背景是白色的,则会尝试在边缘周围添加介于黄色和白色之间的像素(一种较浅的黄色)。这就是“平滑”图像的方式。

但是,如果图像具有索引颜色空间,则这些较浅的黄色阴影可能不存在于图像调色板中,结果可以得到几乎任何其他颜色,无论哪种颜色落在计算出的索引值上。

您问题中的图像是一张索引PNG,因此存在这个问题。

如果是这个问题,那么您需要将原始源图像转换为非索引颜色空间,或在对图像进行索引之前进行抗锯齿处理,如果您的应用程序需要缩放图像或者需要针对不同的背景进行抗锯齿处理,这种方法效果不佳。

另一件可能发生的事情是,您正在对与您认为的不同背景进行抗锯齿处理,特别是如果黄色星形图像在黑色背景下进行了正确的抗锯齿处理,发布您的代码是确定问题的最简单方法。


这些图像是使用上面链接的库渲染的SVG图形。背景从不改变。它保持白色。 - Basic Coder
仅供理解:问题在于SVG被绘制为“硬边缘”。通常算法会在边缘颜色和背景颜色之间找到一种颜色,但在这个例子中没有背景颜色,因为SVG是单独渲染的。结果将使用任何颜色。这样对吗? - Basic Coder
你是如何渲染SVG的?是填充ImageViews还是获取它们作为Picture并将其绘制到Canvas上? - Mark
SVG会被解析,然后用一个画布对象将路径、矩形等绘制在位图上。这个位图将作为纹理在OpenGL中使用。 - Basic Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接