【问题标题】:Setting Saturation and ColorFilter to image simultaneously同时将饱和度和颜色过滤器设置为图像
【发布时间】:2011-11-16 20:25:30
【问题描述】:

以下函数成功改变图片的对比度和亮度。

Bitmap bmp;
ImageView alteredImageView;
...
public void drawAlteredImage(float contr,float bright) {
    Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();

    cm.set(new float[] { 
            contr, 0, 0, 0, bright, 
            0, contr, 0, 0, bright, 
            0, 0, contr, 0, bright, 
            0, 0, 0, 1, 0 });

    paint.setColorFilter(new ColorMatrixColorFilter(cm));
    Matrix matrix = new Matrix();
    canvas.drawBitmap(bmp, matrix, paint);
    alteredImageView.setImageBitmap(alteredBitmap);
}

但是当我将 setSaturation 方法添加到 ColorMatrix 时,对比度和亮度改变不再起作用。代码:

public void drawAlteredImage(float contr,float bright,float satur) {
    Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();

    cm.set(new float[] { 
            contr, 0, 0, 0, bright, 
            0, contr, 0, 0, bright, 
            0, 0, contr, 0, bright, 
            0, 0, 0, 1, 0 });
    cm.setSaturation(satur);
    paint.setColorFilter(new ColorMatrixColorFilter(cm));
    Matrix matrix = new Matrix();
    canvas.drawBitmap(bmp, matrix, paint);
    alteredImageView.setImageBitmap(alteredBitmap);
}

在这种情况下仅应用饱和效果。为什么会出现这个问题?我该如何解决?

【问题讨论】:

    标签: android image-processing


    【解决方案1】:

    setSaturation(...) 方法替换矩阵中的所有值。您可以创建一个组合这两种操作的矩阵,也可以通过两个单独的drawBitmap(...) 调用来执行这些操作。

    试试:

    cm.setSaturation(satur);
    final float m[] = cm.getArray();
    final float c = contr;
    cm.set(new float[] { 
            m[ 0] * c, m[ 1] * c, m[ 2] * c, m[ 3] * c, m[ 4] * c + bright, 
            m[ 5] * c, m[ 6] * c, m[ 7] * c, m[ 8] * c, m[ 9] * c + bright, 
            m[10] * c, m[11] * c, m[12] * c, m[13] * c, m[14] * c + bright, 
            m[15]    , m[16]    , m[17]    , m[18]    , m[19] }); 
    

    【讨论】:

      【解决方案2】:

      另一个选项是创建一个新的 ColorMatrix,在这个新的 ColorMatrix 中设置饱和度,然后在 Brightness/Contrast ColorMatrix 上调用 postConcat。比如:

       public void drawAlteredImage(float contr,float bright,float satur) {
              Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
              Canvas canvas = new Canvas(alteredBitmap);
              Paint paint = new Paint();
              ColorMatrix cm = new ColorMatrix();
      
              cm.set(new float[] { 
                  contr, 0, 0, 0, bright, 
                  0, contr, 0, 0, bright, 
                  0, 0, contr, 0, bright, 
                  0, 0, 0, 1, 0 });
      
              ColorMatrix saturationCM = new ColorMatrix();
              saturationCM.setSaturation(satur);
              cm.postConcat(saturationCM);
      
              paint.setColorFilter(new ColorMatrixColorFilter(cm));
              Matrix matrix = new Matrix();
              canvas.drawBitmap(bmp, matrix, paint);
              alteredImageView.setImageBitmap(alteredBitmap);
      }
      

      【讨论】:

        【解决方案3】:

        如果有人还在寻找这个,改变图像饱和度、亮度和对比度的简单方法就是使用ImageFilterView,它是ImageView的子类

        来源: https://developer.android.com/reference/kotlin/androidx/constraintlayout/utils/widget/ImageFilterView

        kotlin 中的示例:

        
        val myImage = findViewById<ImageFilterView>(R.id.my_image)
        
        myImage.setSaturation(1.2f)
        myImage.setBrightness(1.5f)
        myImage.setContrast(2f)
        
        

        【讨论】:

          猜你喜欢
          • 2011-05-17
          • 2016-09-25
          • 1970-01-01
          • 2018-04-01
          • 1970-01-01
          • 2011-01-23
          • 1970-01-01
          • 2011-11-26
          • 1970-01-01
          相关资源
          最近更新 更多