2010-12-15 108 views
4

在Android(1.5)工作,我有一百个左右的字节数组形式的灰度图像。我想使用图像作为alpha遮罩在Canvas中绘制纯色。图像是固定的,但颜色可以改变。我可以为每个图像/颜色组合创建位图对象,但这看起来非常低效。从内存和速度两方面来看,解决这个问题的好方法是什么? (我需要为每个图像/颜色组合做了很多次。)如何alpha遮罩颜色

回答

4

我想我发现我一直在寻找的答案:

  1. 创建ARGB_8888位图,其中每个像素的颜色设置为(灰色< < 24)| 0XFFFFFF。
  2. 对于每种颜色,创建一个新的PorterDuffColorFilter(color,PorterDuff.Mode.MULTIPLY)。
  3. 要进行渲染,请创建一个Paint对象,并使用与要使用的颜色对应的滤镜调用setColorFilter()。然后使用Bitmap和Paint对象调用canvas.drawBitmap。

对于单一颜色,这可能不像构建我想要的位图和绘制没有Paint对象那样快,但它比每个图像/颜色组合的位图更具空间效率。

0

我会用drawImage的图像BitBlt到画布,getImageData()访问像素,然后在图像数据的.data环,设置将每个像素的RGB值转换为您的常量,并将第四个(alpha)值与您从图像中获得的值进行比较。然后你可以将这个半透明的画布铺在你需要的任何地方。

编辑:我已将a working example这个放在我的网站上。只适用于Chrome/Safari。

+0

我正在做这样的事情。这个问题(我看到我没有完全解释)是我需要一个解决方案,每个图像可以缓存和重复使用很多次。每次需要时我都无法重新生成图像,我无法将图像缓存到所需的每种颜色中。 – 2010-12-16 21:02:53

+0

@TedHopp我很高兴你有一个解决方案。但是,我上面的解决方案可以缓存图像数据,而不会缓存每种颜色的变化。请注意,图像数据只加载一次(window.onload'中的第115行),而每更新一次滑块(作为'updateColor()'的一部分),则重新创建每种颜色的变化。 – Phrogz 2010-12-16 21:13:08

+0

我试图避免的是为每个颜色变化生成一个新图像。 Porter-Duff滤色器似乎就是这样做的。 – 2011-01-13 00:08:37

1

float contrast = 100/180.f; float scale = contrast + 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);