2011-09-14 39 views
3

次の機能は、画像のコントラストと明るさを正常に変更します。彩度とカラーフィルタを同時に画像に設定する

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); 
} 

しかし、ColorMatrixにsetSaturationメソッドを追加すると、コントラストと輝度の変更が機能しなくなりました。コード:

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); 
} 

この場合、飽和効果のみが適用されます。なぜこの問題が起こるのですか?どうすれば修正できますか?

答えて

7

setSaturation(...)メソッドは、マトリックスのすべての値を置き換えます。両方の操作を組み合わせた行列を作成するか、または2つの別々の呼び出し(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] }); 
0

別のオプションは、明るさ/コントラストColorMatrixにpostConcatを呼び出し、この新しいColorMatrixに鮮やかさを設定し、新しい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 }); 

    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); 

}

関連する問題