Matrix 与 ColorMatrix

Matrix:

简单用法就是直接使用它的setXX()方法

而高级一点来理解他就是去理解一个线性矩形

首先我们来认识线性矩形:(用画图粗略地画不要见怪)

分析:

那还有一组 MRERSP_0 MRERSP_1是干什么的呢?

等下告诉你

如:选择90度  那九十度就放进去a角里

Float [] x={1.0f,0.0f,0.0f,0.0f,-1.0f,0.0f,0.0f,0.0f,0.0f};

Matrix matrix=new Matrix();

matrix.setValues(f);

也有简单一点的:

matrix.setRotate(90);

 

如果想围绕哪个点:

matrix.setRotate(90,x,y);

matrix.setRotate(90,0,0);

或者:Float [] x={1.0f,0.0f,0.0f,0.0f,-1.0f,0.0f,0.0f,0.0f,0.0f};

而围绕100,100可以这样:如下:

Float [] x={

1.0f,0.0f,100.0f,

0.0f,-1.0f,100.0f,

0.0f,0.0f,0.0f};

现在清楚MRERSP_0 MRERSP_1是干什么的吧?

归根结底是这个图,重点在 a b d e 记好他们的位置  然后套用公式:

X=aX1+bY1;

Y=dX1+eY1;

如:y=-x;

那需要什么条件? 问自己a b d e 怎么设置吧  其他同理

对称效果图:

实例:

//锐化效果
  public static Bitmap toSharp(Bitmap bit)
     { 
         long start =System.currentTimeMillis(); 
         // 拉普拉斯矩阵  
         int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 }; 
          
         int width = bit.getWidth(); 
         int height = bit.getHeight(); 
         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
          
         int pixR = 0; 
         int pixG = 0; 
         int pixB = 0; 
          
         int pixColor = 0; 
          
         int newR = 0; 
         int newG = 0; 
         int newB = 0; 
          
         int idx = 0; 
         float alpha = 0.3F; 
         int[] pixels = new int[width * height]; 
         bit.getPixels(pixels, 0, width, 0, 0, width, height); 
         for (int i = 1, length = height - 1; i < length; i++) 
         { 
             for (int k = 1, len = width - 1; k < len; k++) 
             { 
                 idx = 0; 
                 for (int m = -1; m <= 1; m++) 
                 { 
                     for (int n = -1; n <= 1; n++) 
                     { 
                         pixColor = pixels[(i + n) * width + k + m]; 
                         pixR = Color.red(pixColor); 
                         pixG = Color.green(pixColor); 
                         pixB = Color.blue(pixColor); 
                          
                         newR = newR + (int) (pixR * laplacian[idx] * alpha); 
                         newG = newG + (int) (pixG * laplacian[idx] * alpha); 
                         newB = newB + (int) (pixB * laplacian[idx] * alpha); 
                         idx++; 
                     } 
                 } 
                  
                 newR = Math.min(255, Math.max(0, newR)); 
                 newG = Math.min(255, Math.max(0, newG)); 
                 newB = Math.min(255, Math.max(0, newB)); 
                  
                 pixels[i * width + k] = Color.argb(255, newR, newG, newB); 
                 newR = 0; 
                 newG = 0; 
                 newB = 0; 
             } 
         } 
          
         bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
         long end = System.currentTimeMillis(); 
         //Log.d("may", "used time="+(end - start)); 
         return bitmap; 
     }
 
  //旋轉90度
  public static Bitmap ToNinety(Bitmap bitmap){
   int w=bitmap.getWidth();
   int h=bitmap.getHeight();
   float fw=((float)100/w);
   float fh=((float)100/h);
   Canvas canvas=new Canvas(bitmap);
   Matrix matrix=new Matrix();
   Paint paint=new Paint();
   paint.setColor(Color.RED);

方便大家看 我把 数组这样写:

final float jingxiang[]={
     0.0f,1.0f,0.0f,
     -1.0f,0.0f,0.0f,
     0.0f,0.0f,1.0f};
  
  matrix.setValues(jingxiang);
  //matrix.setRotate(90);
  matrix.postScale(fw, fh);
  
  canvas.drawBitmap(bitmap, matrix, paint);
  Bitmap newbitmap = Bitmap.createBitmap(bitmap, 0, 0, w,h, matrix, true);
  return newbitmap;
  }

这里有个要点:并不是每个createBitmap()方法都可以达到你想要的,不同参数效果不一样,我觉得归根结底是哪个true 影响了一切

但有些效果又不用带true参数的createBitmap()方法

如黑白照片效果:

//把图片变成黑白
 public static Bitmap toGrayscale(Bitmap bmpOriginal) {
  int width, height;
  height = bmpOriginal.getHeight();
  width = bmpOriginal.getWidth();
  Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,
    Bitmap.Config.RGB_565);
  Canvas c = new Canvas(bmpGrayscale);
  Paint paint = new Paint();
  ColorMatrix cm = new ColorMatrix();
  cm.setSaturation(0);
  ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
  paint.setColorFilter(f);
  c.drawBitmap(bmpOriginal, 0, 0, paint);
  return bmpGrayscale;
 }

还有图片的变化等效果  想怎样就怎么去计算吧 哈

接下来介绍

ColorMatrix

大家可以把那个有颜色坐标看成一个六面体 每个面都是混合颜色的渐变效果

这个ColorMatrix我犯错就搞了一日了。。虽然很浪费时间 但是却是知道了更多

原理与Matrix 差不多

只是数组变成RGBA

所谓的Red Green Blue Alpha

通常:

1 ,0 ,0, 0, 0,

0 ,1 ,0 ,0 ,0,

0 ,0, 1, 0, 0,

0 ,0 ,0 ,1 ,0

这样就是普通效果

现在可以根据参数来设置自己的效果了

简单例子:

public static Bitmap What(Bitmap bitmap) {
    int w=bitmap.getWidth();
    int h=bitmap.getHeight();
    Bitmap result = Bitmap.createBitmap(w, h,
      Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.set(new float[]{
      1 ,0 ,0, 0, 0,

0 ,1 ,0 ,0 ,0,

0 ,0, 1, 0, 0,

0 ,0 ,0 ,1 ,0

});
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);
    c.drawBitmap(bitmap, 0, 0, paint);
    return result;   
  }

有一个也挺好玩的就是黑白效果介绍那里

public static Bitmap toGrayscale(Bitmap bmpOriginal) {
  int width, height;
  height = bmpOriginal.getHeight();
  width = bmpOriginal.getWidth();
  Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,
    Bitmap.Config.RGB_565);
  Canvas c = new Canvas(bmpGrayscale);
  Paint paint = new Paint();
  ColorMatrix cm = new ColorMatrix();
  cm.setSaturation(0);
  ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
  paint.setColorFilter(f);
  c.drawBitmap(bmpOriginal, 0, 0, paint);
  return bmpGrayscale;
 }

原理:把某东西画到某东西上

cm.setSaturation(0); 根据不同参数也有不同效果

更多学习请看androidAPI

其实学习了这个android ==学习了Java==学习了C#

都有这样的东西吧 哈

时间: 2024-10-05 04:48:53

Matrix 与 ColorMatrix的相关文章

图片变换 矩阵 Bitmap Matrix

Matrix矩阵介绍 在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,内部就是个一维数组,内部有9个元素:可以通过setValues( float[])进行初始化,通过getValues(float[])拿到当前矩阵的值. 其具体坐标对应的属性为: {MSCALE_X,MSKEW_X,MTRANS_X,  MSKEW_Y, MSCALE_Y,MTRANS_Y,  MPERSP_0,MPERSP_1,MPERSP_2} 比如我想知道现在x方向缩放比例:

图片变换【Matrix】矩阵 简介

Matrix矩阵介绍 官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html 在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,内部就是个一维数组,内部有9个元素,可以通过setValues(float[])进行初始化,通过getValues(float[])把拿到的矩阵值赋给传入的数组. 源码中的介绍就一句话:The Matrix class holds

Android ColorMatrix 亮度矩阵 对比度矩阵 黑白矩阵

颜色矩阵M是5*4的矩阵,android中颜色矩阵M是以一维数组m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方式进行存储的. 矩阵的每行分别是: R[a b c d e] G[f g h i j] B[k l m n o] A[p q r s t] 图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可. 在对ColorMatrixFilter过滤时候,传入的这个参数ColorMatrix,首

[Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理

    前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包括:通过打开相册里的图片,使用Matrix对图像进行缩放.旋转.移动.对比度.亮度.饱和度操作,希望对大家有所帮助. 一. 显示打开图片     首先,设置activity_main.xml布局如下所示: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android

Android Matrix矩阵详解

Android中有两个比较重要的矩阵,ColorMatrix和Matrix.ColorMatrix用来改变bitmap的颜色和透明度,Matrix用来对bitmap平移.缩放.错切. ColorMatrix(色彩矩阵) Android中Bitmap色彩用了一个[R, G, B, A],4*1的矩阵来保存. 如果想改变一个Bitmap的色彩该怎么办?现在来了解下ColorMatrix的相关知识.ColorMatrix 是一个4*5的矩阵. 我们用[R', G', B', A']来保存新的bitma

数往知来 JQuery 图片上传_水印 &lt;二十二&gt;

一.图片上传  :enctype='multipart/form-date 首先在进行文件上传时,添加form表单中的enctype属性指定enctype='multipart/form-date', 文件数据发送给服务端,并不是把文件路径发送给服务端了,它会随机生成一个分割字符串, 把每一个表单元素分割开 <form method='post' action='' enctype='multipart/form-date'> //这里的enctype是提交请求报文的报文体的一种编码格式, 默

实现类似QQ离线用户头像彩色变灰色的效果

头像由彩色变灰色有两种实现方式: 方法1把图片彩色图转换为纯黑白二色: /** * 将彩色图转换为纯黑白二色 * * @param 位图 * @return 返回转换好的位图 */ private Bitmap convertToBlackWhite(Bitmap bmp) { int width = bmp.getWidth(); // 获取位图的宽 int height = bmp.getHeight(); // 获取位图的高 int[] pixels = new int[width * h

android图像处理,实现变暗效果

图像处理主要是图像的颜色矩阵和坐标矩阵进行处理,要实现变暗效果只需要对颜色矩阵中的RGB偏移减小即可,具体代码如下: int brightness = -80; //RGB偏移量,变暗为负数 ColorMatrix matrix = new ColorMatrix(); matrix.set(new float[]{1, 0, 0, 0, brightness, 0, 1, 0, 0, brightness, 0, 0, 1, 0, brightness, 0, 0, 0, 1, 0}); Co

Android图像处理之图形特效处理

一.Android变形矩阵--Matricx: 跟Android图像的色彩处理基本一样,只是将ColorMatrix换成了Matrix,ColorMatrix是4*5的矩阵,Matrix是3*3的.每个像素点表达了其坐标的X.Y信息: 当使用变换矩阵去处理每一个像素点的时候,与颜色矩阵的矩阵乘法一样,计算公式如下所示: 通常情况下,会让g=h=0,i=1,这样就使1=gX+hY+i    恒成立.因此,只需着重关注上面几个参数即可. 与色彩变换矩阵的初始矩阵一样,图形变换矩阵也有一个初始矩阵.就