Android开发笔记之图片的颜色处理
2016-05-10 22:41
519 查看
这次我们来讨论例如美图秀秀中对一张图片改变图片风格的操作。很多女孩子自拍后往往会对照片进行美化。我们来说说这个问题。
1.首先我们应该了解的一个知识点:
图像的颜色处理主要借助颜色矩阵(ColorMatrix)这个类。颜色矩阵是一个5*4的矩阵,在Android中,颜色矩阵是以一位数组存储的。
![](http://img.blog.csdn.net/20160510221458275)
通过颜色矩阵修改原图像的RGBA值。第一行的1代表红色像素富集程度,第二行的2表示绿色的像素富集程度,第三行的1表示蓝色富集程度,第四行的1表示透明程度。
所以我们要改变图片的颜色我们可以通过修改像素矩阵来做到。但是,我们无法对加载的原图进行操作,所以我们应该重新拷贝一张和原图一模一样的图来进行。
2.我们做一个通过调节seekbar来改变图片颜色的例子。
我们来分析一下如何实现:
a.布局三个seekbar
b.准备好原图片
c.画图准备:Bitmap,Canvas,Paint
d.重新计算像素矩阵,利用setColorFilter重新设置像素
e.画修改过像素矩阵的图片
布局文件三个seekbar,分别调节由..变红,由..变蓝,由..变绿。
其中包括seekbar调节
1.首先我们应该了解的一个知识点:
图像的颜色处理主要借助颜色矩阵(ColorMatrix)这个类。颜色矩阵是一个5*4的矩阵,在Android中,颜色矩阵是以一位数组存储的。
通过颜色矩阵修改原图像的RGBA值。第一行的1代表红色像素富集程度,第二行的2表示绿色的像素富集程度,第三行的1表示蓝色富集程度,第四行的1表示透明程度。
所以我们要改变图片的颜色我们可以通过修改像素矩阵来做到。但是,我们无法对加载的原图进行操作,所以我们应该重新拷贝一张和原图一模一样的图来进行。
2.我们做一个通过调节seekbar来改变图片颜色的例子。
我们来分析一下如何实现:
a.布局三个seekbar
b.准备好原图片
c.画图准备:Bitmap,Canvas,Paint
d.重新计算像素矩阵,利用setColorFilter重新设置像素
e.画修改过像素矩阵的图片
布局文件三个seekbar,分别调节由..变红,由..变蓝,由..变绿。
其中包括seekbar调节
public class MainActivity extends Activity implements OnSeekBarChangeListener{ SeekBar red,green,blue; ImageView iv; private Bitmap basebitmap,copybitmap; private Canvas canvas; private Paint paint; private float red_vector,green_vector,blue_vector; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); red=(SeekBar) findViewById(R.id.red); green=(SeekBar) findViewById(R.id.green); blue=(SeekBar) findViewById(R.id.blue); iv=(ImageView) findViewById(R.id.iv); red.setOnSeekBarChangeListener(this); green.setOnSeekBarChangeListener(this); blue.setOnSeekBarChangeListener(this); } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub basebitmap=BitmapFactory.decodeResource(getResources(), R.drawable.img_small_1); copybitmap=Bitmap.createBitmap(basebitmap.getWidth(),basebitmap.getHeight(),basebitmap.getConfig()); canvas=new Canvas(copybitmap); Matrix matrix=new Matrix(); paint=new Paint(); float[] colors=new float[]{red_vector,0,0,0,0, 0,green_vector,0,0,0, 0,0,blue_vector,0,0, 0,0,0,1,0}; paint.setColorFilter(new ColorMatrixColorFilter(colors)); canvas.drawBitmap(basebitmap, matrix, paint); iv.setImageBitmap(copybitmap); } public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub int progress=seekBar.getProgress(); float count=progress/50f;//使得拖动条取值为0f-2f switch (seekBar.getId()) { case R.id.red: this.red_vector=count; break; case R.id.green: this.green_vector=count; break; case R.id.blue: this.blue_vector=count; break; } } }
相关文章推荐
- android关于RandomAccessFile
- Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示
- Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示
- android关于getLayoutParams()方法源码译文(部分)
- Android中的Activity
- js与android代码的交互
- Android NDK日志输出
- Android Studio报错@integer/google_play_services_version').
- java Android SDK安装与环境变量配置以及开发第一个Android程序
- Android入门学习——Retrofit+MVP模式学习
- android选取本地图片及关于图片压缩上传问题
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
- android 屏幕适配
- ubuntu kylin 14.04 下载,编译,安装android内核源码
- android中获取文件的md5值时首位出现0被省略,而造成了只有31位字符的解决办法。
- Android基础知识:广播
- Android开发工具之Android Studio----版本控制SVN使用(一)
- android.support.v7.widget.Toolbar 中menu图标不显示问题
- Android View系列一: View基础知识
- Android中的通知 Notification