android bitmap 图片处理

最近要做图片处理,写了一个工具类。

1.图片压缩

2.图片尺寸缩放

3.图片切片

4.图片灰度变化

5.图片倒影

6.图片圆角制作

看一下代码:

[java]  view plain copy
  1. /** 
  2.  *  
  3.  * @author gxx 
  4.  *图片处理类 
  5.  *1.图片压缩 
  6.  *2.图片尺寸缩放 
  7.  *3.图片切片 
  8.  *4.图片灰度变化 
  9.  *5.图片倒影 
  10.  *6.图片圆角 
  11.  */  
  12. public class BitmapUtil {  
  13.     // 根据质量压缩  
  14.     public static Bitmap compressBitmap(Bitmap bitmap) {  
  15.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  16.         bitmap.compress(CompressFormat.JPEG, 100, bos);// 将图片压入流 就是将图片转化为字节数组  
  17.         int options = 100;  
  18.         while (bos.toByteArray().length / 1024 > 100*1024) {  
  19.             bos.reset();// 将管道流清空  
  20.             options -= 10;  
  21.             bitmap.compress(CompressFormat.JPEG, options, bos);// 重新压入  
  22.         }  
  23.         bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0,  
  24.                 bos.toByteArray().length);  
  25.         return bitmap;  
  26.     }  
  27.   
  28.     // 根据尺寸缩放  
  29.     public static Bitmap compressBydensity(Bitmap bm, int newwidth,  
  30.             int newheight) {  
  31.         int xscale = newwidth / bm.getWidth();  
  32.         int yscale = newheight / bm.getHeight();  
  33.         Matrix matrix = new Matrix();  
  34.         matrix.postScale(xscale, yscale);  
  35.         Bitmap newbm = Bitmap.createBitmap(bm, 00, bm.getWidth(),  
  36.                 bm.getHeight(), matrix, true);  
  37.         return newbm;  
  38.   
  39.     }  
  40.   
  41.     // 彩色变黑白  
  42.     public static Bitmap HuiSeJie(Bitmap bitmap) {  
  43.         int width = bitmap.getWidth();  
  44.         int height = bitmap.getHeight();  
  45.         int[] piexs = new int[width * height];// 像素点数组  
  46.         Log.i("gxx", (width*height)+"-----");  
  47.         bitmap.getPixels(piexs, 0, width, 00, width, height);// 将图片字节转化对应像素点  
  48.         // 每一个像素点处理  
  49.         for (int i = 0; i < height; i++) {  
  50.             for (int j = 0; j < width; j++) {  
  51.                 int grey=piexs[width*i+j];  
  52.                 piexs[width * i + j] = doChangeHuidu(grey);  
  53.             }  
  54.         }  
  55.         Bitmap newbm=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.RGB_565);  
  56.         newbm.setPixels(piexs, 0, bitmap.getWidth(), 00, width, height);  
  57.         return newbm;  
  58.     }  
  59.   
  60.     // 把一个像素点对应颜色改为黑白  
  61.     private static int doChangeHuidu(int grey) {  
  62.         // TODO Auto-generated method stub  
  63.         int alpha = 0xFF << 24;  
  64.         int red = ((grey & 0x00FF0000) >> 16);  
  65.         int green = ((grey & 0x0000FF00) >> 8);  
  66.         int blue = (grey & 0x000000FF);  
  67.   
  68.         grey = (int) ((float) red * 0.3 + (float) green * 0.59 + (float) blue * 0.11);  
  69.         grey = alpha | (grey << 16) | (grey << 8) | grey;  
  70.         return grey;  
  71.     }  
  72.   
  73.     // 将图片切成固定个数  
  74.     public static List<Bitmap> SplitBitmap(Bitmap bm, int xpiece, int ypiece) {  
  75.         List<Bitmap> bitmaps = new ArrayList<Bitmap>();  
  76.         int piecewidth = bm.getWidth() / xpiece;  
  77.         int pieceheight = bm.getHeight() / ypiece;  
  78.         for (int i = 0; i < xpiece; i++) {  
  79.             for (int j = 0; j < ypiece; j++) {  
  80.                 Bitmap newbm = Bitmap.createBitmap(bm, j * piecewidth, i  
  81.                         * pieceheight, piecewidth, pieceheight);  
  82.                 bitmaps.add(newbm);  
  83.             }  
  84.         }  
  85.         return bitmaps;  
  86.     }  
  87.   
  88.     // 图片圆角  
  89.     public static Bitmap roundbitmap(Bitmap bm, int round) {  
  90.         // 空白位图  
  91.         Bitmap newbm = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),  
  92.                 Bitmap.Config.ARGB_8888);  
  93.         // 新的空白位图作为绘制模版  
  94.         Canvas canvas = new Canvas(newbm);  
  95.         // 模版用白色填充  
  96.         canvas.drawARGB(0000);  
  97.         // 确定画笔  
  98.         Paint paint = new Paint();  
  99.         paint.setAntiAlias(true);  
  100.         paint.setColor(Color.parseColor("#ff424242"));  
  101.         // 确定圆角矩形相关信息  
  102.         Rect rect = new Rect(00, bm.getWidth(), bm.getHeight());  
  103.         RectF rectf = new RectF(rect);  
  104.         // 绘制边框  
  105.         canvas.drawRoundRect(rectf, round, round, paint);  
  106.         // 绘制内容图片  
  107.         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  108.         canvas.drawBitmap(bm, rect, rect, paint);  
  109.         return newbm;  
  110.     }  
  111.     public static Bitmap createReflectedImage(Bitmap bm)  
  112.     {  
  113.         int width=bm.getWidth();  
  114.         int height=bm.getHeight();  
  115.         Matrix m=new Matrix();  
  116.         m.preScale(1, -1);  
  117.         Bitmap reflectedimg=Bitmap.createBitmap(bm, 0, height/2, width, height/2, m, true);  
  118.         //----------------------翻转图片获得  
  119.         Bitmap reflectedwithorignal=Bitmap.createBitmap(width, height+height/2+4, Config.ARGB_8888);  
  120.         Canvas c=new Canvas(reflectedwithorignal);  
  121.         c.drawARGB(0000);  
  122.           
  123.         //---------------------大画板  
  124.         c.drawBitmap(bm, 00new Paint());  
  125.         //------------------------绘制原始图片  
  126.         c.drawBitmap(reflectedimg, 0, bm.getHeight()+4new Paint());  
  127.         //-------------------------绘制反转图片  
  128.         LinearGradient lg=new LinearGradient(0, bm.getHeight()+40, reflectedwithorignal.getHeight(), 0x000000000x77000000, TileMode.CLAMP);  
  129.         Paint paint=new Paint();  
  130.         paint.setShader(lg);  
  131.         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  132.         c.drawRect(0, height+4, width, reflectedwithorignal.getHeight(), paint);  
  133.         //-------------------------绘制阴影  
  134.         return reflectedwithorignal;  
  135.     }  
  136.   
  137. }  
解释一下

1.图片压缩

本质上就是修改图片品质压缩图片

  1. 将图片转化为字节数组(这个每一个字节都代表图片像素显示的颜色)
  2. 判断数组长度有没有低于100k
  3. 没有的话修改quality值继续压缩 
    [java]  view plain copy
    1. options -= 10;  
    2. bitmap.compress(CompressFormat.JPEG, options, bos);  
2.图片尺寸缩放
本质上就是用matrix操作图片
[java]  view plain copy
  1. matrix.postScale(xscale, yscale);  
3.图片灰度改变
本质是取出每一个字节对应的像素点改变颜色
  1. 取出图片的像素点
  2. 取出每个像素点中的alpha,red,green,blue对应的值
  3. 就行简单灰度变化
  4. 创建空白bitmap
  5. 将改变的像素点设置进去即可
android bitmap 图片处理_第1张图片

4.图片切片
本质上是
[java]  view plain copy
  1. Bitmap newbm = Bitmap.createBitmap(bm, j * piecewidth, i  
  2.                         * pieceheight, piecewidth, pieceheight);  
[java]  view plain copy
  1. 方法的使用  
  1. 计算出要平均切割的每个图片的高度和宽度
  2. 计算出大图片中切割的点
  3. 合理切割
android bitmap 图片处理_第2张图片
5.图片圆角
本质上是将图片轮廓重新绘制的过程
  1. 创建空白图片
  2. 绘制圆角轮廓
  3. 将图片绘制进去

6.图片倒影
本质是得到反转图片和本身图片绘制到一起的过程
  1. 获取当前图片的反转图片
  2. 创建空白图片
  3. 绘制默认图片
  4. 绘制反转图片
  5. 给反转图片区域加入渐变图层
android bitmap 图片处理_第3张图片

你可能感兴趣的:(android bitmap 图片处理)