Android图片颜色校正。如何更改Android中单个图像的亮度,饱和度等?
问题描述:
我正在开发一个应用程序,用户可以在其中更改图像亮度,对比度,饱和度等。我可以使用下面的代码单独完成所有这些操作。Android图片颜色校正。如何更改Android中单个图像的亮度,饱和度等?
seekBar_brightness.setMax(512);
seekBar_brightness.setProgress(255);
seekBar_brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progress = progress - 255;
Log.e("ImageColor_bri global", "" + bitmap_global);
Bitmap new_bm = changeBrightness(bitmap_global, (float) progress);
Log.e("ImageColor_bri local", "" + new_bm);
imageView.setImageBitmap(new_bm);
bitmap_local = new_bm;
// imageView.getDrawable().setColorFilter(ColorFilterGenerator.adjustBrightness(progress));//foto is my ImageView
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
seekbar_saturation.setMax(512);
seekbar_saturation.setProgress(255);
//seekbar_saturation.setThumbOffset(255);
seekbar_saturation.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progress = progress-255;
// imageView.buildDrawingCache();
// Bitmap bimap = imageView.getDrawingCache();
// imageView.setColorFilter(value);
Log.e("ImageColor_satu global", "" + bitmap_global);
Bitmap new_bm = adjustSaturation(bitmap_global, progress);
Log.e("ImageColor_satu local", "" + new_bm);
imageView.setImageBitmap(new_bm);
bitmap_local = new_bm;
// ColorMatrix matrix = new ColorMatrix();
// matrix.setSaturation(progress);
// ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
// imageView.getDrawable().setColorFilter(ColorFilterGenerator.adjustSaturation(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
public static Bitmap changeBrightness(Bitmap bmp, float brightness) {
ColorMatrix cm = new ColorMatrix(new float[]
{
1, 0, 0, 0, brightness,
0, 1, 0, 0, brightness,
0, 0, 1, 0, brightness,
0, 0, 0, 1, 0
});
Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
Canvas canvas = new Canvas(ret);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bmp, 0, 0, paint);
return ret;
}
public static Bitmap adjustSaturation(Bitmap bmp, float value) {
value = cleanValue(value, 100);
if (value == 0) {
return bmp;
}
float x = 1 + ((value > 0) ? 3 * value/100 : value/100);
float lumR = 0.3086f;
float lumG = 0.6094f;
float lumB = 0.0820f;
float[] mat = new float[]
{
lumR * (1 - x) + x, lumG * (1 - x), lumB * (1 - x), 0, 0,
lumR * (1 - x), lumG * (1 - x) + x, lumB * (1 - x), 0, 0,
lumR * (1 - x), lumG * (1 - x), lumB * (1 - x) + x, 0, 0,
0, 0, 0, 1, 0,
0, 0, 0, 0, 1
};
ColorMatrix cm = new ColorMatrix(mat);
Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
Canvas canvas = new Canvas(ret);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bmp, 0, 0, paint);
return ret;
}
问题是:增加或减小图像的亮度和增加或减小饱和度值之后完全改变了图像的颜色。
我必须做到这一点,如果我逆转到seekbar的亮度和饱和度的初始值,我应该得到实际图像时,它是在第一次。
例如如果增加亮度的从0到100的值,则饱和度的值从0至80.然后我扭转亮度和饱和度值设置为0改变然后我应该得到的原始图像,因为它是在第一次。
但是现在图像颜色在逆转其值时不会逆转。请帮忙。提前Thanx。
答
这是因为最大和最小亮度(以及饱和度和其他参数)值。例如。如果当前亮度为200并且ins增加100,则亮度值变为255(不是300),因为255是最大值。如果当前亮度(现在255)减少100,则它变为255 - 100 = 155,并且不等于初始值(200)。为了避免这种情况,您应该存储初始位图并且不会更改它,但通过postConcat()
更改ColorMatrixColorFilter
,并且每次对初始位图应用颜色过滤器,但不适用于已修改的位图。
所以,你应该为ColorMatrix
创造全球价值和改变它在你的changeBrightness()
和adjustSaturation()
方法,然后总是把它应用到初始位图。