gpt4 book ai didi

android - Canvas.draw() 不透明背景上的透明形状导致 254 alpha

转载 作者:行者123 更新时间:2023-11-29 01:35:34 24 4
gpt4 key购买 nike

我在桌面上查看保存的位图时注意到了这一点(这似乎是一个错误),我几乎看不到图像文件中的方格图案。我做了一个简单的实验:

Bitmap bitmap = new Bitmap(300, 200, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setColor(Color.argb(150, 0, 255, 0));
canvas.drawColor(Color.RED);
canvas.drawRect(20, 20, 280, 180, paint);
Log.d("alpha-bug", "Alpha at 30, 30 is "
+ Color.alpha(bitmap.getPixel(30, 30))
);

验证。上面的日志 Alpha at 30, 30 is 254。正确的 alpha 是 255。无论我绘制的形状的 alpha 是多少,我都会得到 254。我假设这是一个舍入错误。还有其他人遇到过这个吗?这是预期的吗?如果是,为什么?如果没有,关于如何解决它有什么想法吗?

最佳答案

是的,对我来说似乎是个错误。

解决方法是使用另一个位图绘制半透明形状,然后使用绘制该位图 drawBitmap 方法。其他位图的背景是透明的,这样(显然),形状将被正确绘制。 (或者,如果您要重复使用位图,则可以使用 drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) 将其填充为透明。)


示例代码和输出:

Bitmap test = Bitmap.createBitmap(250, 190, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(test);
{ // draw opaque background
Paint p = new Paint();
p.setARGB(255, 0, 0, 0);
c.drawPaint(p);
}
Paint circlePaint = new Paint();
circlePaint.setARGB(128, 255, 255, 255);
Bitmap b;
c.drawText("drawCircle", 30, 40, circlePaint);
c.drawText("drawBitmap", 140, 40, circlePaint);
{ // draw a circle into a temporary bitmap as workaround
b = MipMap.allocateBitmapSafely(100, 100);
Canvas ca = new Canvas(b);
ca.drawCircle(50, 50, 50, circlePaint);
System.out.println("drawCircle (in temporary bitmap) color: " + Integer.toHexString(b.getPixel(50, 50)));
}
{ // draw circle with circle-drawing method
c.drawCircle(70, 100, 50, circlePaint);
System.out.println("drawCircle color: " + Integer.toHexString(test.getPixel(70, 100)));
}
{ // draw circle from the saved bitmap with bitmap-drawing method
c.drawBitmap(b, 130, 50, null);
System.out.println("drawBitmap color: " + Integer.toHexString(test.getPixel(170, 100)));
}
String filename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.png";
FileOutputStream out = null;
try {
out = new FileOutputStream(filename);
test.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
} finally {
try {
out.close();
} catch (IOException e) {
}
}

控制台输出:

drawCircle(在临时位图中)颜色:80ffffff
绘制圆圈颜色:fe818181
drawBitmap 颜色:ff808080

Example output image

图中左边圆圈的颜色是(254, 129, 129, 129),右边圆圈的颜色是(255, 128, 128, 128)。因此,不仅左侧的 alpha 为 254 而不是 255,R、G 和 B 值也相差 1。

P.S.:我们应该向 Google 报告此情况,因为这对于解决方法来说是一种矫枉过正的做法。

关于android - Canvas.draw() 不透明背景上的透明形状导致 254 alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378662/

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