Android中图像的效果的处理无非是Matrix和ColorMatrix,以及PortialXformed,其中Matrix使用在旋转,镜像方面,而ColorMatrix用于跳转色相,最后一种用于合成


1色相涉及难度较高,这里主要讲解ColorMatrix色相
Bitmapbitmap=Bitmap.createBitmap(srcBmp.getWith(),srcBmp.getHeight(),Bitmap.Config.ARGB_8888);Canvascanvas=newBitmap(bitmap);Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);//设置色相ColorMatrixhueMatrix=newColorMatrix();hueMatrix.setRotation(0,20);//0表示红色,参数二表示色度hueMatrix.setRotation(1,20);//1表示绿色,参数二表示色度hueMatrix.setRotation(2,20);//2表示蓝色,参数二表示色度//饱和度ColorMatrixsaturationMatrix=newColorMatrix();saturationMatrix.setSaturation(40f);//亮度ColorMatrixlumMatrix=newColorMatrix();lumMatrix.setScale(50,50,50,1);//参数:红,绿,蓝,透明度//融合以上三种ColorMatriximgMatrix=newColorMatrix();imgMatrix.postConcat(hueMatrix);imgMatrix.postConcat(saturationMatrix);imgMatrix.postConcat(lumMatrix);//设置到画笔paint.setColorFilter(newColorMatrixColorFilter(imgMatrix));canvas.drawBitmap(bitmap,0,0,paint);
2对于ColorMatrix也可以使用矩阵进行处理
{1,0,0,0,0}//红{R}{0,1,0,0,0}//绿乘{G}{0,0,1,0,0}//蓝{B}{0,0,0,1,0}//alpha{A}

其实是矩阵的乘法

ColorMatriximgMatrix=newColorMatrix();imgMatrix.set(int[4][5]cm);
3使用像素点,获取特定像素点所占面积
int[]pixelSize=newint[bmp.getWidth()*bmp.getHeight()];bmp.getPixels(pixelSize,0,bmp.getWidth(),0,0,bmp.getWidth(),bmp.getHeight());//对于刮刮卡计算刮开涂层的面积可以使用intalphaSize=0;inttotalSize=bmp.getWidth()*bmp.getHeight();for(inti=0;i<bmp.getHeight();i++){for(intj<0;j<bmp.getWidth();j++){inth=i*width+j;if(pixelSize[h]==0)//色素值为0,表示透明{alphaSize++;}}}//计算刮开区域比例introta=(float)alphaSize/(float)totalSize*100;if(rota>60){}
4.获取像素点三元素数据,修改像素数据

(实际开发中某些Bitmap不能修改像素点,不能调用setPixels,请参考5解决)

//定义目标像素点int[]pixelSize=newint[bmp.getWidth()*bmp.getHeight()];bmp.getPixels(pixelSize,0,bmp.getWidth(),0,0,bmp.getWidth(),bmp.getHeight());int[]dstPixelSize=newint[bmp.getWidth()*bmp.getHeight()];for(inti=0;i<bmp.getWidth()*bmp.getHeight();i++){intcolor=pixelSize[i];intr=Color.red(color);intg=Color.green(color);intb=Color.blue(color);intalpha=Color.alpha(color);r=255-r;g=255-g;b=255-b;intr=Math.min(255,Math.max(0,r));//保证范围在0-255intg=Math.min(255,Math.max(0,g));intb=Math.min(255,Math.max(0,b));dstPixelSize[i]=Color.argb(alpha,r,g,b);}bmp.setPixels(dstPixelSize,0,bmp.getWidth(),0,0,bmp.getWidth(),bmp.getHeight());
5.将immutable Bitmap转为mutable Bitmap

实际开发中,有些Bitmap不能修改像素点,因此需要转化

mBitmap=Bitmap.createBitmap(bmp.getWidth(),bmp.getHeight(),Config.ARGB_8888);Canvascanvas=newCanvas(mBitmap);canvas.drawBitmap(bmp,0,0,newPaint(Paint.ANTI_ALIAS_FLAG));//转为可修改int[]pixelSize=newint[mBitmap.getWidth()*mBitmap.getHeight()];int[]dstPixelSize=newint[mBitmap.getWidth()*mBitmap.getHeight()];mBitmap.getPixels(pixelSize,0,mBitmap.getWidth(),0,0,mBitmap.getWidth(),mBitmap.getHeight());for(inti=0;i<mBitmap.getWidth()*mBitmap.getHeight();i++){intcolor=pixelSize[i];intr=Color.red(color);intg=Color.green(color);intb=Color.blue(color);intalpha=Color.alpha(color);if(b>=225){alpha=255;dstPixelSize[i]=Color.TRANSPARENT;}else{r=255-r;g=255-g;b=255-b;r=Math.min(255,Math.max(0,r));//保证范围在0-255g=Math.min(255,Math.max(0,g));b=Math.min(255,Math.max(0,b));dstPixelSize[i]=Color.argb(alpha,r,g,b);}}mBitmap.setPixels(dstPixelSize,0,mBitmap.getWidth(),0,0,mBitmap.getWidth(),mBitmap.getHeight());setImageBitmap(mBitmap);bmp.recycle();

更多相关文章

  1. android 获取字符串在屏幕中所占像素宽度和高度
  2. Android中获取字符串长度、宽度(所占像素宽度)
  3. [安卓基础] 008.Android中的显示单位
  4. android opengl 实现相机的实时滤镜
  5. android 获取屏幕宽高 & 控件宽高
  6. Android(安卓)软键盘弹出与关闭监听
  7. Android中的drawable像素密度适配详解
  8. 如果我是Android面试官三
  9. Android获取屏幕宽度高度并动态设置控件宽度,比例等

随机推荐

  1. Android之仿iphone抖动效果
  2. 【Android开发】构建第一个APP
  3. Android7.1&8.0 audio设置音量
  4. Android - MediaPlayer
  5. Android 手机存储文件各种路径
  6. 收集android上开源的酷炫的交互动画和视
  7. 移动android的AI总结
  8. Android自动化测试之monkeyrunner基本要
  9. 整理出来的一些Android基础知识
  10. input 之我见1