如何使用Alpha遮罩颜色

4
在Android(1.5)中工作时,我有大约一百个灰度图像,以字节数组的形式存在。我想将这些图像用作Canvas中绘制纯色的Alpha掩码。这些图像是固定的,但颜色可以改变。我可以为每个图像/颜色组合创建Bitmap对象,但这似乎非常低效。从内存和速度两方面考虑,如何解决这个问题?(我需要为每个图像/颜色组合执行此操作多次。)
3个回答

4
我想我找到了我要找的答案:
  1. 创建一个ARGB_8888位图,其中每个像素颜色设置为(gray << 24) | 0xFFFFFF。
  2. 对于每种颜色,创建一个新的PorterDuffColorFilter(color,PorterDuff.Mode.MULTIPLY)。
  3. 要呈现,请创建一个Paint对象并调用setColorFilter(),并使用对应于要使用的颜色的过滤器。然后使用Bitmap和Paint对象调用canvas.drawBitmap。
对于单个颜色,这可能不如构建所需的确切位图并且没有Paint对象绘制快,但比每个图像/颜色组合都要节省空间。

1

浮点对比度 = 100 / 180.f; 浮点尺度 = 对比度 + 1.f;

        cm.set(new float[] {
               scale, 0, 0, 0, 0,//Red
               0, 1.5f, 0, 0, 0,//Green
               0, 0, 1.5f, 0, 0,//Blue
               0, 0, 0, 1, 0 });//alpha
        bmpGrayscale = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);

        Canvas c = new Canvas(bmpGrayscale);
        Paint paint = new Paint();

        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
        paint.setColorFilter(f);
        c.drawBitmap(bitmap, 0, 0, paint);
        /*BitmapDrawable bmd = new BitmapDrawable(bmpGrayscale);
        photo_view.setBackgroundDrawable(bmd);*/

        photo_view.setImageBitmap(bmpGrayscale);

0

我会使用drawImage将图像绘制到画布上,使用getImageData()访问像素,然后循环遍历图像数据的.data,将每个像素的RGB值设置为您的常量,并将第四个(alpha)值设置为从图像获取的值。然后,您可以在任何需要的地方叠加这个半透明的画布。

编辑:我已经在我的网站上放置了一个工作示例。仅适用于Chrome / Safari。


我正在做类似这样的事情。问题(我看到我没有完全解释清楚)是我需要一个解决方案,每个图像都可以被缓存和多次重复使用。我不能承担每次需要时重新生成图像的成本,也不能承担在每种所需颜色中缓存图像的成本。 - Ted Hopp
@TedHopp,很高兴你有解决方案。然而,我上面的解决方案确实缓存了图像数据,但没有缓存每种颜色的变化。请注意,图像数据仅在加载一次(window.onload内的第115行),而每种颜色的变化会在每次更新滑块时重新创建(作为updateColor()的一部分)。 - Phrogz
我试图避免的是为每种颜色变化生成新图像。Porter-Duff颜色过滤器似乎正好做到了这一点。 - Ted Hopp

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