【问题标题】:How to alpha mask a color如何对颜色进行 alpha 遮罩
【发布时间】:2011-05-25 18:32:41
【问题描述】:

在 Android (1.5) 中工作,我有一百个左右以字节数组形式存在的灰度图像。我想使用图像作为 alpha 蒙版在画布中绘制纯色。图像是固定的,但颜色可以改变。我可以为每个图像/颜色组合创建位图对象,但这似乎非常低效。就内存和速度而言,解决这个问题的好方法是什么? (我需要为每个图像/颜色组合多次执行此操作。)

【问题讨论】:

    标签: android image canvas alpha grayscale


    【解决方案1】:

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

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

    【讨论】:

    • 我正在做这样的事情。问题(我看到我没有完全解释)是我需要一个解决方案,其中每个图像都可以被缓存和重复使用多次。我无法在每次需要时重新生成图像,也无法缓存所需的每种颜色的图像。
    • @TedHopp 很高兴您有解决方案。但是,我上面的解决方案确实缓存了图像数据而不缓存每种颜色的变化。请注意,图像数据只加载一次(window.onload 内的第 115 行),而每次更新滑块时都会重新创建每种颜色的变化(作为updateColor() 的一部分)。
    • 我试图避免为每种颜色的变化生成一个新图像。 Porter-Duff 彩色滤光片似乎就是这样做的。
    【解决方案2】:

    我想我找到了我正在寻找的答案:

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

    对于单一颜色,这可能不如准确构建我想要的位图并在没有 Paint 对象的情况下绘制那么快,但它比每个图像/颜色组合的位图更节省空间。

    【讨论】:

      【解决方案3】:

      浮动对比度 = 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 2011-09-19
        相关资源
        最近更新 更多