0

我正在尝试使位图中单个像素的 Alpha 通道变暗。我想保持像素颜色 rgb 但只是使像素半透明。我查看了 Color 类并尝试了 Color.argb(int,int,int,int) 方法,但效果不佳。我怎样才能在保持像素的原始 rgb 的同时设置像素的 alpha?

提前感谢垫子。

[编辑] 大声笑水龟:)。嗨,下面是我如何配置我的位图。如果这就是你的意思,我没有潜在的形象。我想做的基本上是使某些像素半透明。我有一个位图并在位图上放置了一个圆圈。我的算法只针对圆圈内的像素,我可以将这些像素更改为粉红色。我想要的是检查圆圈中的每个像素并使其smi透明,如果有意义的话,仍然保持原始像素颜色的一半:)

 bgr.setPixel(i,y,Color.argb(50,255,255,255));

[编辑]

BitmapFactory.Options bfo = new BitmapFactory.Options();
        bfo.inSampleSize = 1;

        bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);
        bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
        bgr = bm.copy(bm.getConfig(), true);
4

1 回答 1

2

问候水龟。您的代码片段看起来不错。我脑子里只有两个想法。
1) 你确定你的位图是 ARGB_8888 格式吗?默认情况下,您可能会获得另一种格式,具体取决于具体情况。
2) Alpha 值是绝对值(不是百分比),所以我认为您希望第一个参数是 127,而不是 50。

编辑:另外,嗯,当你减少 alpha 时,你必须确保你在一个背景上绘画,这个背景将以一种有效的方式显示出来。如果我已经解决了您的问题或者您需要更多帮助(也许我们需要查看更多代码),请告诉我。

编辑:我认为问题是你没有背景。如果你减少 alpha 并且你在黑色之上绘制,它只会让事情看起来更暗。换句话说, (127, 255, 255, 255) 与 (255, 127, 127, 127) 相当。我是动态壁纸制作者,所以我一直在使用画布。这是我做某事的方法:
c.drawBitmap(sBG, 0, 0, null);
c.drawBitmap(sSprite, mWidth/2, mHeight/2, null);
sBG 是一个充满象形文字的位图,通过我的“幽灵”精灵显示(sSprite 的 alpha ~127)。
我只是在画布中叠加位图,当我渲染画布时,一切都很好。:-)

编辑:降低 alpha 通常用于让某些东西从后面显示出来。我认为您需要通过“淡化颜色使其看起来有点半透明”来准确确定您的意思(数学上)。例如,将红色变为粉红色意味着混合白色;这相当于具有白色背景的半透明(混合白色是您将饱和颜色更改为粉彩的方式)。我建议使用 GIMP 或 Photoshop(可以调整图层 alphas)来确定哪种效果最能满足您的需求,然后尝试在 Android 中复制它。

编辑:我认为它可能会“鼓励”您提及这些是您正在努力解决的棘手且希望有趣的事情。在计算机图形学中,有时我们必须做一些不一定直观的事情才能达到预期的效果。我会争辩说,令人信服的半透明是不平凡的……需要使用背景对象、照明和/或动画。我对这种特定效果了解不多,但这里有一个您可能会喜欢的链接:http: //www.neilblevins.com/cg_education/translucency/translucency.htm
我确实知道一些关于创建金属纹理的事情。诀窍是:您几乎总是必须使用反射。这个 youtube 视频是一个很好的演示:http ://www.youtube.com/watch?v=k6ZiRNkbWPw
真正参与其中的人甚至会选择 HDRi!例如,在这里查看反射球:http ://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/HDRi

于 2011-05-08T15:41:59.983 回答