【问题标题】:General Android semi transparent bug一般Android半透明bug
【发布时间】:2011-09-28 15:31:05
【问题描述】:

我使用抗锯齿使我的图像更平滑。使用抗锯齿时,将在图像周围绘制深色边框。发生这种情况是因为 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 的东西。

【问题讨论】:

    标签: android antialiasing android-canvas


    【解决方案1】:

    发布原始源图像的链接,并展示您如何对它们进行抗锯齿处理(代码)。

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

    但是,如果图像具有索引颜色空间,则图像托盘中可能不存在那些较浅的黄色阴影,因此,您几乎可以使用任何其他颜色来代替索引区域中的任何颜色对指数值的计算。

    您问题中的图像是索引 png,因此存在此问题。

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

    可能发生的另一件事是,您的抗锯齿背景与您想象的不同,特别是如果背景为黑色,黄色星号会正确抗锯齿,发布您的代码是最简单的计算方法这个出来了。

    【讨论】:

    • 图像是使用上面链接的库渲染的 SVG 图形。背景永远不会改变。它保持白色。
    • 只是为了理解原因:问题在于,SVG 是用“硬边”绘制的。通常算法会在边缘颜色和背景颜色之间找到一种颜色,但在这个例子中没有背景颜色,因为 svg 是单独渲染的。因此,将使用任何颜色。对吗?
    • 你是如何渲染 SVG 的?您是在填充 ImageView 还是将它们作为图片抓取并将其绘制到 Canvas 上?
    • SVG 将被解析,并且画布对象将路径、矩形等绘制到位图上。此位图将在 openGL 中用作纹理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多