团队博客
滤镜
private ImageView image_view; private SeekBar sb_alpha; private SeekBar sb_rad; private SeekBar sb_green; private SeekBar sb_blue; // 原图 private Bitmap bitmap; private Canvas canvas; private Bitmap newBitmap; // 空白的新图 private Paint paint;
setContentView(R.layout.activity_meitu); image_view = findViewById(R.id.image_view); sb_alpha = findViewById(R.id.sb_alpha); sb_rad = findViewById(R.id.sb_rad); sb_green = findViewById(R.id.sb_green); sb_blue = findViewById(R.id.sb_blue); /** * 设置拖动条最大值 */ sb_alpha.setMax(SB_MAX); sb_rad.setMax(SB_MAX); sb_green.setMax(SB_MAX); sb_blue.setMax(SB_MAX); sb_alpha.setOnSeekBarChangeListener(seekBarChangeListener); sb_rad.setOnSeekBarChangeListener(seekBarChangeListener); sb_green.setOnSeekBarChangeListener(seekBarChangeListener); sb_blue.setOnSeekBarChangeListener(seekBarChangeListener);
File file = new File(Environment.getExternalStorageDirectory(), "mm.jpg"); if (!file.exists()) { Toast.makeText(this, file.getName() + "不存在", Toast.LENGTH_SHORT).show(); return; }
// 拿一块新的画布,把空白图片和画布关联 canvas = new Canvas(newBitmap); // 设置画布的背景 canvas.drawColor(Color.WHITE); // 拿一只新的画笔 paint = new Paint();
private final SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { float alpha = 1; // (0 ~ 1 就是变化的过程) 0就是透明 0.5就是半透明 1就是完全显示 float rad = 1; float green = 1; float blue = 1; /** * 拖动条 拖动过程中,拖动的改变 * @param seekBar * @param progress * @param fromUser */ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { switch (seekBar.getId()) { case R.id.sb_alpha: alpha = (float) (SB_MAX - progress) / SB_MAX; Log.d(TAG, "progress:" + progress + " alpha:" + alpha); break; case R.id.sb_rad: rad = (float) (SB_MAX - progress) / SB_MAX; break; case R.id.sb_green: green = (float) (SB_MAX - progress) / SB_MAX; break; case R.id.sb_blue: blue = (float) (SB_MAX - progress) / SB_MAX; break; default: break; } /** * ColorMatrix 做了一系列复杂的颜色值ragb运算 * 颜色值ragb运算,颜色矩阵是 5*4 的float数组 */ ColorMatrix colorMatrix = new ColorMatrix(); /** * 以下这些值,是颜色矩阵的内部运算是需要这样的值,是这样排列的 * 0, 0, 0, 0, 0, // 红色 * 0, 0, 0, 0, 0, // 绿色 * 0, 0, 0, 0, 0, // 蓝色 * 0, 0, 0, 0, 0, // 透明的 * * 以下这些值是让图片正常显示,是原图的效果 (0 ~ 1 就是变化的过程) * 1, 0, 0, 0, 0, // 红色 * 0, 1, 0, 0, 0, // 绿色 * 0, 0, 1, 0, 0, // 蓝色 * 0, 0, 0, 1, 0, // 透明的 */ colorMatrix.set(new float[]{ rad, 0, 0, 0, 0, // 红色 0, green, 0, 0, 0, // 绿色 0, 0, blue, 0, 0, // 蓝色 0, 0, 0, alpha, 0, // 透明的 }); /** * 颜色矩阵-颜色过滤器,需要ColorMatrix */ ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorFilter); canvas.drawBitmap(bitmap, new Matrix(), paint); image_view.setImageBitmap(newBitmap); }
权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />