android图片压缩工具类分享

android图片压缩工具类分享,第1张

概述本文实例为大家分享了android图片压缩工具类的具体代码,供大家参考,具体内容如下

本文实例为大家分享了androID图片压缩工具类的具体代码,供大家参考,具体内容如下

import java.io.bufferedoutputstream; import java.io.ByteArrayinputStream; import java.io.ByteArrayOutputStream; import java.io.file; import java.io.fileNotFoundException; import java.io.fileOutputStream; import java.io.IOException; import java.io.inputStream;  import androID.content.Context; import androID.graphics.Bitmap; import androID.graphics.BitmapFactory; import androID.graphics.BitmapFactory.Options; import androID.graphics.Matrix; import androID.net.Uri; import androID.Widget.Toast;  /**  * 圆形图片工具类  *  * @author SKLM  *  */ public class ImageVIEwTool {    /**    * 我们先看下质量压缩方法    *    * @param image    * @return    */   public static Bitmap compressImage(Bitmap image) {      ByteArrayOutputStream baos = new ByteArrayOutputStream();     image.compress(Bitmap.CompressFormat.JPEG,100,baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中     int options = 100;     while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩       baos.reset();// 重置baos即清空baos       image.compress(Bitmap.CompressFormat.JPEG,options,baos);// 这里压缩options%,把压缩后的数据存放到baos中       options -= 10;// 每次都减少10     }     ByteArrayinputStream isBm = new ByteArrayinputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayinputStream中     Bitmap bitmap = BitmapFactory.decodeStream(isBm,null,null);// 把ByteArrayinputStream数据生成图片     return bitmap;   }    /**    * 图片按比例大小压缩方法(根据路径获取图片并压缩)    *    * @param srcPath    * @return    */   public static Bitmap getimage(String srcPath) {     BitmapFactory.Options newOpts = new BitmapFactory.Options();     // 开始读入图片,此时把options.inJustDecodeBounds 设回true了     newOpts.inJustDecodeBounds = true;     Bitmap bitmap = BitmapFactory.decodefile(srcPath,newOpts);// 此时返回bm为空      newOpts.inJustDecodeBounds = false;     int w = newOpts.outWIDth;     int h = newOpts.outHeight;     // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为     float hh = 800f;// 这里设置高度为800f     float ww = 480f;// 这里设置宽度为480f     // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可     int be = 1;// be=1表示不缩放     if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放       be = (int) (newOpts.outWIDth / ww);     } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放       be = (int) (newOpts.outHeight / hh);     }     if (be <= 0)       be = 1;     newOpts.inSampleSize = be;// 设置缩放比例     // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了     bitmap = BitmapFactory.decodefile(srcPath,newOpts);     return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩   }    /**    * 图片按比例大小压缩方法(根据Bitmap图片压缩)    *    * @param image    * @return    */   public static Bitmap comp(Bitmap image) {      ByteArrayOutputStream baos = new ByteArrayOutputStream();     image.compress(Bitmap.CompressFormat.JPEG,baos);     if (baos.toByteArray().length / 1024 > 1024) {// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出       baos.reset();// 重置baos即清空baos       image.compress(Bitmap.CompressFormat.JPEG,30,baos);// 这里压缩50%,把压缩后的数据存放到baos中     }     ByteArrayinputStream isBm = new ByteArrayinputStream(baos.toByteArray());     BitmapFactory.Options newOpts = new BitmapFactory.Options();     // 开始读入图片,此时把options.inJustDecodeBounds 设回true了     newOpts.inJustDecodeBounds = true;     Bitmap bitmap = BitmapFactory.decodeStream(isBm,newOpts);     newOpts.inJustDecodeBounds = false;     int w = newOpts.outWIDth;     int h = newOpts.outHeight;     // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为     float hh = 150f;// 这里设置高度为800f     float ww = 150f;// 这里设置宽度为480f     // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可     int be = 1;// be=1表示不缩放     if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放       be = (int) (newOpts.outWIDth / ww);     } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放       be = (int) (newOpts.outHeight / hh);     }     if (be <= 0)       be = 1;     newOpts.inSampleSize = be;// 设置缩放比例     // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了     isBm = new ByteArrayinputStream(baos.toByteArray());     bitmap = BitmapFactory.decodeStream(isBm,newOpts);     return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩   }    public static byte[] Bitmap2Bytes(Bitmap bm) {     ByteArrayOutputStream baos = new ByteArrayOutputStream();     bm.compress(Bitmap.CompressFormat.PNG,baos);     return baos.toByteArray();   }    /**    * 按原比例压缩图片到指定尺寸    *    * @param context    * @param inputUri    * @param outputUri    * @param maxLenth    *      最长边长    */   public static voID reducePicture(Context context,Uri inputUri,Uri outputUri,int maxLenth,int compress) {     Options options = new Options();     options.inJustDecodeBounds = true;     inputStream is = null;     try {       is = context.getContentResolver().openinputStream(inputUri);       BitmapFactory.decodeStream(is,options);       is.close();       int sampleSize = 1;       int longestSIDe = 0;       int longestSIDeLenth = 0;       if (options.outWIDth > options.outHeight) {         longestSIDeLenth = options.outWIDth;         longestSIDe = 0;       } else {         longestSIDeLenth = options.outHeight;         longestSIDe = 1;       }       if (longestSIDeLenth > maxLenth) {         sampleSize = longestSIDeLenth / maxLenth;       }       options.inJustDecodeBounds = false;       options.inSampleSize = sampleSize;        is = context.getContentResolver().openinputStream(inputUri);       Bitmap bitmap = BitmapFactory.decodeStream(is,options);       is.close();        if (bitmap == null) {         Toast.makeText(context,"图片获取失败,请确认您的存储卡是否正常",Toast.LENGTH_SHORT).show();         return;       }        Bitmap srcBitmap = bitmap;       float scale = 0;       if (longestSIDe == 0) {         scale = (float) maxLenth / (float) (srcBitmap.getWIDth());       } else {         scale = (float) maxLenth / (float) (srcBitmap.getHeight());       }       Matrix matrix = new Matrix();       matrix.postscale(scale,scale);       bitmap = Bitmap.createBitmap(srcBitmap,srcBitmap.getWIDth(),srcBitmap.getHeight(),matrix,true);       // 如果尺寸不变会返回本身,所以需要判断是否是统一引用来确定是否需要回收       if (srcBitmap != bitmap) {         srcBitmap.recycle();         srcBitmap = null;       }        saveBitmapToUri(bitmap,outputUri,compress);       bitmap.recycle();       bitmap = null;     } catch (fileNotFoundException e) {       // Todo auto-generated catch block       e.printstacktrace();     } catch (IOException e) {       // Todo auto-generated catch block       e.printstacktrace();     }   }    private static boolean saveBitmapToUri(Bitmap bitmap,Uri uri,int compress)       throws IOException {     file file = new file(uri.getPath());     if (file.exists()) {       if (file.delete()) {         if (!file.createNewfile()) {           return false;         }       }     }      bufferedoutputstream outStream = new bufferedoutputstream(         new fileOutputStream(file));     bitmap.compress(Bitmap.CompressFormat.JPEG,compress,outStream);     outStream.flush();     outStream.close();      return true;   }  } 

接下来看看第二个写法压缩图片的工具类,如下

import java.io.ByteArrayinputStream; import java.io.ByteArrayOutputStream; import java.io.file; import java.io.fileNotFoundException; import java.io.fileOutputStream; import java.io.IOException; import java.sql.Date; import java.text.SimpleDateFormat;  import androID.graphics.Bitmap; import androID.graphics.Bitmap.Config; import androID.graphics.BitmapFactory; import androID.os.Environment;  /**  * 图像压缩工厂类  *  * @author  *  */ public class ImageFactory {    /**    * 从指定的图像路径获取位图    *    * @param imgPath    * @return    */   public Bitmap getBitmap(String imgPath) {     // Get bitmap through image path     BitmapFactory.Options newOpts = new BitmapFactory.Options();     newOpts.inJustDecodeBounds = false;     newOpts.inPurgeable = true;     newOpts.ininputShareable = true;     // Do not compress     newOpts.inSampleSize = 1;     newOpts.inPreferredConfig = Config.RGB_565;     return BitmapFactory.decodefile(imgPath,newOpts);   }    /**    * 压缩图片(质量压缩)    *    * @param bitmap    */   public static file compressImage(Bitmap bitmap) {     ByteArrayOutputStream baos = new ByteArrayOutputStream();     bitmap.compress(Bitmap.CompressFormat.JPEG,baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中     int options = 100;     while (baos.toByteArray().length / 1024 > 500) { // 循环判断如果压缩后图片是否大于500kb,大于继续压缩       baos.reset();// 重置baos即清空baos       options -= 10;// 每次都减少10       bitmap.compress(Bitmap.CompressFormat.JPEG,baos);// 这里压缩options%,把压缩后的数据存放到baos中       long length = baos.toByteArray().length;     }     SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");     Date date = new Date(System.currentTimeMillis());     String filename = format.format(date);     file file = new file(Environment.getExternalStorageDirectory(),filename + ".png");     try {       fileOutputStream fos = new fileOutputStream(file);       try {         fos.write(baos.toByteArray());         fos.flush();         fos.close();       } catch (IOException e) {          e.printstacktrace();       }     } catch (fileNotFoundException e) {        e.printstacktrace();     }     recycleBitmap(bitmap);     return file;   }    public static voID recycleBitmap(Bitmap... bitmaps) {     if (bitmaps == null) {       return;     }     for (Bitmap bm : bitmaps) {       if (null != bm && !bm.isRecycled()) {         bm.recycle();       }     }   }    /**    * 将位图存储到指定的图像路径中    *    * @param bitmap    * @param outPath    * @throws fileNotFoundException    */   public voID storeImage(Bitmap bitmap,String outPath) throws fileNotFoundException {     fileOutputStream os = new fileOutputStream(outPath);     bitmap.compress(Bitmap.CompressFormat.JPEG,os);   }    /**    * 通过像素压缩图像,这将改变图像的宽度/高度。用于获取缩略图    *    *    * @param imgPath    *      image path    * @param pixelW    *      目标宽度像素    * @param pixelH    *      高度目标像素    * @return    */   public Bitmap ratio(String imgPath,float pixelW,float pixelH) {     BitmapFactory.Options newOpts = new BitmapFactory.Options();     // 开始读入图片,此时把options.inJustDecodeBounds 设回true,即只读边不读内容     newOpts.inJustDecodeBounds = true;     newOpts.inPreferredConfig = Config.RGB_565;     // Get bitmap info,but notice that bitmap is null Now     Bitmap bitmap = BitmapFactory.decodefile(imgPath,newOpts);      newOpts.inJustDecodeBounds = false;     int w = newOpts.outWIDth;     int h = newOpts.outHeight;     // 想要缩放的目标尺寸     float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了     float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了     // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可     int be = 1;// be=1表示不缩放     if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放       be = (int) (newOpts.outWIDth / ww);     } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放       be = (int) (newOpts.outHeight / hh);     }     if (be <= 0)       be = 1;     newOpts.inSampleSize = be;// 设置缩放比例     // 开始压缩图片,注意此时已经把options.inJustDecodeBounds 设回false了     bitmap = BitmapFactory.decodefile(imgPath,newOpts);     // 压缩好比例大小后再进行质量压缩     // return compress(bitmap,maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除     return bitmap;   }    /**    * 压缩图像的大小,这将修改图像宽度/高度。用于获取缩略图    *    *    * @param image    * @param pixelW    *      target pixel of wIDth    * @param pixelH    *      target pixel of height    * @return    */   public Bitmap ratio(Bitmap image,float pixelH) {     ByteArrayOutputStream os = new ByteArrayOutputStream();     image.compress(Bitmap.CompressFormat.JPEG,os);     if (os.toByteArray().length / 1024 > 1024) {// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出       os.reset();// 重置baos即清空baos       image.compress(Bitmap.CompressFormat.JPEG,50,os);// 这里压缩50%,把压缩后的数据存放到baos中     }     ByteArrayinputStream is = new ByteArrayinputStream(os.toByteArray());     BitmapFactory.Options newOpts = new BitmapFactory.Options();     // 开始读入图片,此时把options.inJustDecodeBounds 设回true了     newOpts.inJustDecodeBounds = true;     newOpts.inPreferredConfig = Config.RGB_565;     Bitmap bitmap = BitmapFactory.decodeStream(is,newOpts);     newOpts.inJustDecodeBounds = false;     int w = newOpts.outWIDth;     int h = newOpts.outHeight;     float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了     float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了     // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可     int be = 1;// be=1表示不缩放     if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放       be = (int) (newOpts.outWIDth / ww);     } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放       be = (int) (newOpts.outHeight / hh);     }     if (be <= 0)       be = 1;     newOpts.inSampleSize = be;// 设置缩放比例     // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了     is = new ByteArrayinputStream(os.toByteArray());     bitmap = BitmapFactory.decodeStream(is,maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除     return bitmap;   }    /**    * 按质量压缩,并将图像生成指定的路径    *    * @param image    * @param outPath    * @param maxSize    *      目标将被压缩到小于这个大小(KB)。    * @throws IOException    */   public voID compressAndGenImage(Bitmap image,String outPath,int maxSize) throws IOException {     ByteArrayOutputStream os = new ByteArrayOutputStream();     // scale     int options = 100;     // Store the bitmap into output stream(no compress)     image.compress(Bitmap.CompressFormat.JPEG,os);     // Compress by loop     while (os.toByteArray().length / 1024 > maxSize) {       // Clean up os       os.reset();       // interval 10       options -= 10;       image.compress(Bitmap.CompressFormat.JPEG,os);     }      // Generate compressed image file     fileOutputStream fos = new fileOutputStream(outPath);     fos.write(os.toByteArray());     fos.flush();     fos.close();   }    /**    * 按质量压缩,并将图像生成指定的路径    *    * @param imgPath    * @param outPath    * @param maxSize    *      目标将被压缩到小于这个大小(KB)。    * @param needsDelete    *      是否压缩后删除原始文件    * @throws IOException    */   public voID compressAndGenImage(String imgPath,int maxSize,boolean needsDelete)       throws IOException {     compressAndGenImage(getBitmap(imgPath),outPath,maxSize);      // Delete original file     if (needsDelete) {       file file = new file(imgPath);       if (file.exists()) {         file.delete();       }     }   }    /**    * 比例和生成拇指的路径指定    *    * @param image    * @param outPath    * @param pixelW    *      目标宽度像素    * @param pixelH    *      高度目标像素    * @throws fileNotFoundException    */   public voID ratioAndGenThumb(Bitmap image,float pixelH)       throws fileNotFoundException {     Bitmap bitmap = ratio(image,pixelW,pixelH);     storeImage(bitmap,outPath);   }    /**    * 比例和生成拇指的路径指定    *    * @param image    * @param outPath    * @param pixelW    *      目标宽度像素    * @param pixelH    *      高度目标像素    * @param needsDelete    *      是否压缩后删除原始文件    * @throws fileNotFoundException    */   public voID ratioAndGenThumb(String imgPath,float pixelH,boolean needsDelete)       throws fileNotFoundException {     Bitmap bitmap = ratio(imgPath,outPath);      // Delete original file     if (needsDelete) {       file file = new file(imgPath);       if (file.exists()) {         file.delete();       }     }   }  } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的android图片压缩工具类分享全部内容,希望文章能够帮你解决android图片压缩工具类分享所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1143262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存