很实用的android压缩图片的算法
16lz
2021-12-04
[置顶]很实用的android压缩图片的算法
分类:android 2013-11-06 14:31 534人阅读 评论(2) 收藏 举报 android 压缩图片 这些天一直为android程序如何压缩图片烦恼,上网找了很多资料,整理了一下,经过测试,都是可用的, [java] view plain copy- /**
- *压缩图片
- *@parambitmap源图片
- *@paramwidth想要的宽度
- *@paramheight想要的高度
- *@paramisAdjust是否自动调整尺寸,true图片就不会拉伸,false严格按照你的尺寸压缩
- *@returnBitmap
- */
- publicBitmapreduce(Bitmapbitmap,intwidth,intheight,booleanisAdjust){
- //如果想要的宽度和高度都比源图片小,就不压缩了,直接返回原图
- if(bitmap.getWidth()<width&&bitmap.getHeight()<height){returnbitmap;}
- //根据想要的尺寸精确计算压缩比例,方法详解:publicBigDecimaldivide(BigDecimaldivisor,intscale,introundingMode);
- //scale表示要保留的小数位,roundingMode表示如何处理多余的小数位,BigDecimal.ROUND_DOWN表示自动舍弃
- floatsx=newBigDecimal(width).divide(newBigDecimal(bitmap.getWidth()),4,BigDecimal.ROUND_DOWN).floatValue();
- floatsy=newBigDecimal(height).divide(newBigDecimal(bitmap.getHeight()),4,BigDecimal.ROUND_DOWN).floatValue();
- if(isAdjust){//如果想自动调整比例,不至于图片会拉伸
- sx=(sx<sy?sx:sy);sy=sx;//哪个比例小一点,就用哪个比例
- }
- Matrixmatrix=newMatrix();
- matrix.postScale(sx,sy);//调用api中的方法进行压缩,就大功告成了
- returnBitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
- }
旋转图片:
[java] view plain copy- /**
- *旋转图片
- *@parambitmap源图片
- *@paramangle旋转角度(90为顺时针旋转,-90为逆时针旋转)
- *@returnBitmap
- */
- publicBitmaprotate(Bitmapbitmap,floatangle){
- Matrixmatrix=newMatrix();
- matrix.postRotate(angle);
- returnBitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
- }
放大或缩小图片: [java] view plain copy
- /**
- *放大或缩小图片
- *@parambitmap源图片
- *@paramratio放大或缩小的倍数,大于1表示放大,小于1表示缩小
- *@returnBitmap
- */
- publicBitmapzoom(Bitmapbitmap,floatratio){
- if(ratio<0f){returnbitmap;}
- Matrixmatrix=newMatrix();
- matrix.postScale(ratio,ratio);
- returnBitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
- }
在图片上印字:
[java] view plain copy
- /**
- *在图片上印字
- *@parambitmap源图片
- *@paramtext印上去的字
- *@paramparam字体参数分别为:颜色,大小,是否加粗,起点x,起点y;比如:{color:0xFF000000,size:30,bold:true,x:20,y:20}
- *@returnBitmap
- */
- publicBitmapprintWord(Bitmapbitmap,Stringtext,Map<String,Object>param){
- if(ToolUtil.get().isBlank(text)||null==param){returnbitmap;}
- BitmapnewBitmap=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Config.ARGB_8888);
- Canvascanvas=newCanvas(newBitmap);
- canvas.drawBitmap(bitmap,0,0,null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- Paintpaint=newPaint();
- paint.setColor(null!=param.get("color")?(Integer)param.get("color"):Color.BLACK);
- paint.setTextSize(null!=param.get("size")?(Integer)param.get("size"):20);
- paint.setFakeBoldText(null!=param.get("bold")?(Boolean)param.get("bold"):false);
- canvas.drawText(text,null!=param.get("x")?(Integer)param.get("x"):0,null!=param.get("y")?(Integer)param.get("y"):0,paint);
- canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- returnnewBitmap;
- }
创建logo(给图片加水印), : [java] view plain copy
- /**
- *创建logo(给图片加水印),
- *@parambitmaps原图片和水印图片
- *@paramleft左边起点坐标
- *@paramtop顶部起点坐标t
- *@returnBitmap
- */
- publicBitmapcreateLogo(Bitmap[]bitmaps,intleft,inttop){
- BitmapnewBitmap=Bitmap.createBitmap(bitmaps[0].getWidth(),bitmaps[0].getHeight(),Config.ARGB_8888);
- Canvascanvas=newCanvas(newBitmap);
- for(inti=0;i<bitmaps.length;i++){
- if(i==0){
- canvas.drawBitmap(bitmaps[0],0,0,null);
- }else{
- canvas.drawBitmap(bitmaps[i],left,top,null);
- }
- canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- }
- returnnewBitmap;
- }
[java] view plain copy
- privateintwidth=140,height=40,codeLen=4;
- privateStringcheckCode="";
- privateRandomrandom=newRandom();
- /**
- *产生一个4位随机数字的图片验证码
- *@returnBitmap
- */
- publicBitmapcreateCode(){
- checkCode="";
- String[]chars={"0","1","2","3","4","5","6","7","8","9"};
- for(inti=0;i<codeLen;i++){checkCode+=chars[random.nextInt(chars.length)];}
- Bitmapbitmap=Bitmap.createBitmap(width,height,Config.ARGB_8888);
- Canvascanvas=newCanvas(bitmap);canvas.drawColor(Color.WHITE);
- Paintpaint=newPaint();paint.setTextSize(30);paint.setColor(Color.BLUE);
- for(inti=0;i<checkCode.length();i++){
- paint.setColor(randomColor(1));paint.setFakeBoldText(random.nextBoolean());
- floatskewX=random.nextInt(11)/10;
- paint.setTextSkewX(random.nextBoolean()?skewX:-skewX);
- intx=width/codeLen*i+random.nextInt(10);
- canvas.drawText(String.valueOf(checkCode.charAt(i)),x,28,paint);
- }
- for(inti=0;i<3;i++){drawLine(canvas,paint);}
- for(inti=0;i<255;i++){drawPoints(canvas,paint);}
- canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- returnbitmap;
- }
- /**
- *获得一个随机的颜色
- *@paramrate
- *@return
- */
- publicintrandomColor(intrate){
- intred=random.nextInt(256)/rate,green=random.nextInt(256)/rate,blue=random.nextInt(256)/rate;
- returnColor.rgb(red,green,blue);
- }
- /**
- *画随机线条
- *@paramcanvas
- *@parampaint
- */
- publicvoiddrawLine(Canvascanvas,Paintpaint){
- intstartX=random.nextInt(width),startY=random.nextInt(height);
- intstopX=random.nextInt(width),stopY=random.nextInt(height);
- paint.setStrokeWidth(1);paint.setColor(randomColor(1));
- canvas.drawLine(startX,startY,stopX,stopY,paint);
- }
- /**
- *画随机干扰点
- *@paramcanvas
- *@parampaint
- */
- publicvoiddrawPoints(Canvascanvas,Paintpaint){
- intstopX=random.nextInt(width),stopY=random.nextInt(height);
- paint.setStrokeWidth(1);
- paint.setColor(randomColor(1));
- canvas.drawPoint(stopX,stopY,paint);
- }
- /**
- *返回真实验证码字符串
- *@returnString
- */
- publicStringgetCheckCode(){
- returncheckCode;
更多相关文章
- android 布局特殊的属性介绍
- [转]Android媒体的一些使用总结
- 【 Android(安卓)】Android(安卓)动态矢量图
- android imageView 图片显示方式属性
- android:scaleType 属性
- android selector下的属性值
- android的异步加载与UI
- android EditView的一些问题
- Android(安卓)为联系人添加图片