一般Android半透明bug

时间:2011-09-28 15:31:05

标签: android antialiasing android-canvas

我使用抗锯齿使图像更加流畅。使用抗锯齿时,将在图像周围绘制黑色边框。这是因为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/

我想我发现了这个错误。问题是SurfaceView。它的背景是黑色的。当我使用上面的代码并将其显示在ImageView上时,会发生同样的半透明错误,并且ImageView后面的UI元素的背景颜色为黑色。 SurfaceView的背景颜色始终为黑色。如果我使用setBackgroundColor将其更改为白色,则SurfaceView将变为白色,但是在使用OpenGL绘制的所有其他图像上将绘制白色背景。我认为必须切换这些。首先应该绘制背景颜色,而不是OpenGL的颜色。

1 个答案:

答案 0 :(得分:2)

发布原始源图像的链接,并显示您的抗锯齿(代码)。

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

但是,如果图像具有索引颜色空间,那些较浅的黄色阴影可能不存在于图像托盘中,因此,您可以在其位置获得几乎任何其他颜色,无论索引中的颜色如何关于计算的指数值。

你问题中的图片是一个索引的png因此有这个问题。

如果这是问题所在,那么您需要将原始源图像转换为非索引颜色空间,或者在索引图像之前对它们进行消除锯齿,如果图像需要按比例缩放则不能正常工作您的申请或是否需要针对不同背景的反别名。

另一件可能发生的事情就是你对不同背景的抗锯齿比你想象的要多,特别是如果背景是黑色的话黄色星是正确的抗锯齿,发布你的代码是最简单的方法这个。