[置顶]很实用的android压缩图片的算法

分类:android 534人阅读 评论(2) 收藏 举报 android 压缩图片 这些天一直为android程序如何压缩图片烦恼,上网找了很多资料,整理了一下,经过测试,都是可用的, [java] view plain copy
  1. /**
  2. *压缩图片
  3. *@parambitmap源图片
  4. *@paramwidth想要的宽度
  5. *@paramheight想要的高度
  6. *@paramisAdjust是否自动调整尺寸,true图片就不会拉伸,false严格按照你的尺寸压缩
  7. *@returnBitmap
  8. */
  9. publicBitmapreduce(Bitmapbitmap,intwidth,intheight,booleanisAdjust){
  10. //如果想要的宽度和高度都比源图片小,就不压缩了,直接返回原图
  11. if(bitmap.getWidth()<width&&bitmap.getHeight()<height){returnbitmap;}
  12. //根据想要的尺寸精确计算压缩比例,方法详解:publicBigDecimaldivide(BigDecimaldivisor,intscale,introundingMode);
  13. //scale表示要保留的小数位,roundingMode表示如何处理多余的小数位,BigDecimal.ROUND_DOWN表示自动舍弃
  14. floatsx=newBigDecimal(width).divide(newBigDecimal(bitmap.getWidth()),4,BigDecimal.ROUND_DOWN).floatValue();
  15. floatsy=newBigDecimal(height).divide(newBigDecimal(bitmap.getHeight()),4,BigDecimal.ROUND_DOWN).floatValue();
  16. if(isAdjust){//如果想自动调整比例,不至于图片会拉伸
  17. sx=(sx<sy?sx:sy);sy=sx;//哪个比例小一点,就用哪个比例
  18. }
  19. Matrixmatrix=newMatrix();
  20. matrix.postScale(sx,sy);//调用api中的方法进行压缩,就大功告成了
  21. returnBitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
  22. }


旋转图片:

[java] view plain copy
  1. /**
  2. *旋转图片
  3. *@parambitmap源图片
  4. *@paramangle旋转角度(90为顺时针旋转,-90为逆时针旋转)
  5. *@returnBitmap
  6. */
  7. publicBitmaprotate(Bitmapbitmap,floatangle){
  8. Matrixmatrix=newMatrix();
  9. matrix.postRotate(angle);
  10. returnBitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
  11. }

放大或缩小图片: [java] view plain copy
  1. /**
  2. *放大或缩小图片
  3. *@parambitmap源图片
  4. *@paramratio放大或缩小的倍数,大于1表示放大,小于1表示缩小
  5. *@returnBitmap
  6. */
  7. publicBitmapzoom(Bitmapbitmap,floatratio){
  8. if(ratio<0f){returnbitmap;}
  9. Matrixmatrix=newMatrix();
  10. matrix.postScale(ratio,ratio);
  11. returnBitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
  12. }

在图片上印字:

[java] view plain copy
  1. /**
  2. *在图片上印字
  3. *@parambitmap源图片
  4. *@paramtext印上去的字
  5. *@paramparam字体参数分别为:颜色,大小,是否加粗,起点x,起点y;比如:{color:0xFF000000,size:30,bold:true,x:20,y:20}
  6. *@returnBitmap
  7. */
  8. publicBitmapprintWord(Bitmapbitmap,Stringtext,Map<String,Object>param){
  9. if(ToolUtil.get().isBlank(text)||null==param){returnbitmap;}
  10. BitmapnewBitmap=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Config.ARGB_8888);
  11. Canvascanvas=newCanvas(newBitmap);
  12. canvas.drawBitmap(bitmap,0,0,null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
  13. Paintpaint=newPaint();
  14. paint.setColor(null!=param.get("color")?(Integer)param.get("color"):Color.BLACK);
  15. paint.setTextSize(null!=param.get("size")?(Integer)param.get("size"):20);
  16. paint.setFakeBoldText(null!=param.get("bold")?(Boolean)param.get("bold"):false);
  17. canvas.drawText(text,null!=param.get("x")?(Integer)param.get("x"):0,null!=param.get("y")?(Integer)param.get("y"):0,paint);
  18. canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
  19. returnnewBitmap;
  20. }

创建logo(给图片加水印), : [java] view plain copy
  1. /**
  2. *创建logo(给图片加水印),
  3. *@parambitmaps原图片和水印图片
  4. *@paramleft左边起点坐标
  5. *@paramtop顶部起点坐标t
  6. *@returnBitmap
  7. */
  8. publicBitmapcreateLogo(Bitmap[]bitmaps,intleft,inttop){
  9. BitmapnewBitmap=Bitmap.createBitmap(bitmaps[0].getWidth(),bitmaps[0].getHeight(),Config.ARGB_8888);
  10. Canvascanvas=newCanvas(newBitmap);
  11. for(inti=0;i<bitmaps.length;i++){
  12. if(i==0){
  13. canvas.drawBitmap(bitmaps[0],0,0,null);
  14. }else{
  15. canvas.drawBitmap(bitmaps[i],left,top,null);
  16. }
  17. canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
  18. }
  19. returnnewBitmap;
  20. }
产生一个4位随机数字的图片验证码:

[java] view plain copy
  1. privateintwidth=140,height=40,codeLen=4;
  2. privateStringcheckCode="";
  3. privateRandomrandom=newRandom();
  4. /**
  5. *产生一个4位随机数字的图片验证码
  6. *@returnBitmap
  7. */
  8. publicBitmapcreateCode(){
  9. checkCode="";
  10. String[]chars={"0","1","2","3","4","5","6","7","8","9"};
  11. for(inti=0;i<codeLen;i++){checkCode+=chars[random.nextInt(chars.length)];}
  12. Bitmapbitmap=Bitmap.createBitmap(width,height,Config.ARGB_8888);
  13. Canvascanvas=newCanvas(bitmap);canvas.drawColor(Color.WHITE);
  14. Paintpaint=newPaint();paint.setTextSize(30);paint.setColor(Color.BLUE);
  15. for(inti=0;i<checkCode.length();i++){
  16. paint.setColor(randomColor(1));paint.setFakeBoldText(random.nextBoolean());
  17. floatskewX=random.nextInt(11)/10;
  18. paint.setTextSkewX(random.nextBoolean()?skewX:-skewX);
  19. intx=width/codeLen*i+random.nextInt(10);
  20. canvas.drawText(String.valueOf(checkCode.charAt(i)),x,28,paint);
  21. }
  22. for(inti=0;i<3;i++){drawLine(canvas,paint);}
  23. for(inti=0;i<255;i++){drawPoints(canvas,paint);}
  24. canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
  25. returnbitmap;
  26. }
  27. /**
  28. *获得一个随机的颜色
  29. *@paramrate
  30. *@return
  31. */
  32. publicintrandomColor(intrate){
  33. intred=random.nextInt(256)/rate,green=random.nextInt(256)/rate,blue=random.nextInt(256)/rate;
  34. returnColor.rgb(red,green,blue);
  35. }
  36. /**
  37. *画随机线条
  38. *@paramcanvas
  39. *@parampaint
  40. */
  41. publicvoiddrawLine(Canvascanvas,Paintpaint){
  42. intstartX=random.nextInt(width),startY=random.nextInt(height);
  43. intstopX=random.nextInt(width),stopY=random.nextInt(height);
  44. paint.setStrokeWidth(1);paint.setColor(randomColor(1));
  45. canvas.drawLine(startX,startY,stopX,stopY,paint);
  46. }
  47. /**
  48. *画随机干扰点
  49. *@paramcanvas
  50. *@parampaint
  51. */
  52. publicvoiddrawPoints(Canvascanvas,Paintpaint){
  53. intstopX=random.nextInt(width),stopY=random.nextInt(height);
  54. paint.setStrokeWidth(1);
  55. paint.setColor(randomColor(1));
  56. canvas.drawPoint(stopX,stopY,paint);
  57. }
  58. /**
  59. *返回真实验证码字符串
  60. *@returnString
  61. */
  62. publicStringgetCheckCode(){
  63. returncheckCode;

更多相关文章

  1. android 布局特殊的属性介绍
  2. [转]Android媒体的一些使用总结
  3. 【 Android(安卓)】Android(安卓)动态矢量图
  4. android imageView 图片显示方式属性
  5. android:scaleType 属性
  6. android selector下的属性值
  7. android的异步加载与UI
  8. android EditView的一些问题
  9. Android(安卓)为联系人添加图片

随机推荐

  1. sqlserver 禁用触发器和启用触发器的语句
  2. 实现按关健字模糊查询,并按匹配度排序的S
  3. SQLSERVER中union,cube,rollup,cumpute运
  4. sqlserver 字符串分拆 语句
  5. MSSQL 提取汉字实现语句
  6. MSSQL 首字母替换成大写字母
  7. MSSQL 删除数据库里某个用户所有表里的数
  8. MSSQL 多字段根据范围求最大值实现方法
  9. sqlserver 常用存储过程集锦
  10. sqlserver 中ntext字段的批量替换(updatet