精华内容
下载资源
问答
  • 图片压缩方法

    2015-04-23 08:51:44
    Android不错的图片压缩方法 一、图片质量压缩 [java] view plaincopyprint? /**   * 质量压缩方法   *   * @param image   * @return   */   public ...

    Android不错的图片压缩方法


    一、图片质量压缩

    1. /** 
    2.      * 质量压缩方法 
    3.      * 
    4.      * @param image 
    5.      * @return 
    6.      */  
    7.     public static Bitmap compressImage(Bitmap image) {  
    8.   
    9.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    10.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
    11.         int options = 90;  
    12.   
    13.         while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩  
    14.             baos.reset(); // 重置baos即清空baos  
    15.             image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中  
    16.             options -= 10;// 每次都减少10  
    17.         }  
    18.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中  
    19.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, nullnull);// 把ByteArrayInputStream数据生成图片  
    20.         return bitmap;  
    21.     }  



    二、按比例大小压缩 (路径获取图片)

    1. /** 
    2.      * 图片按比例大小压缩方法 
    3.      * 
    4.      * @param srcPath (根据路径获取图片并压缩) 
    5.      * @return 
    6.      */  
    7.     public static Bitmap getimage(String srcPath) {  
    8.   
    9.         BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    10.         // 开始读入图片,此时把options.inJustDecodeBounds 设回true了  
    11.         newOpts.inJustDecodeBounds = true;  
    12.         Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空  
    13.   
    14.         newOpts.inJustDecodeBounds = false;  
    15.         int w = newOpts.outWidth;  
    16.         int h = newOpts.outHeight;  
    17.         // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
    18.         float hh = 800f;// 这里设置高度为800f  
    19.         float ww = 480f;// 这里设置宽度为480f  
    20.         // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
    21.         int be = 1;// be=1表示不缩放  
    22.         if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放  
    23.             be = (int) (newOpts.outWidth / ww);  
    24.         } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放  
    25.             be = (int) (newOpts.outHeight / hh);  
    26.         }  
    27.         if (be <= 0)  
    28.             be = 1;  
    29.         newOpts.inSampleSize = be;// 设置缩放比例  
    30.         // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
    31.         bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
    32.         return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩  
    33.     }  



    三、按比例大小压缩 (Bitmap)

    1. /** 
    2.      * 图片按比例大小压缩方法 
    3.      * 
    4.      * @param image (根据Bitmap图片压缩) 
    5.      * @return 
    6.      */  
    7.     public static Bitmap compressScale(Bitmap image) {  
    8.   
    9.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    10.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
    11.   
    12.         // 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出  
    13.         if (baos.toByteArray().length / 1024 > 1024) {  
    14.             baos.reset();// 重置baos即清空baos  
    15.             image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 这里压缩50%,把压缩后的数据存放到baos中  
    16.         }  
    17.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
    18.         BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    19.         // 开始读入图片,此时把options.inJustDecodeBounds 设回true了  
    20.         newOpts.inJustDecodeBounds = true;  
    21.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    22.         newOpts.inJustDecodeBounds = false;  
    23.         int w = newOpts.outWidth;  
    24.         int h = newOpts.outHeight;  
    25.         Log.i(TAG, w + "---------------" + h);  
    26.         // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
    27.         // float hh = 800f;// 这里设置高度为800f  
    28.         // float ww = 480f;// 这里设置宽度为480f  
    29.         float hh = 512f;  
    30.         float ww = 512f;  
    31.         // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
    32.         int be = 1;// be=1表示不缩放  
    33.         if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放  
    34.             be = (int) (newOpts.outWidth / ww);  
    35.         } else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放  
    36.             be = (int) (newOpts.outHeight / hh);  
    37.         }  
    38.         if (be <= 0)  
    39.             be = 1;  
    40.         newOpts.inSampleSize = be; // 设置缩放比例  
    41.         // newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565  
    42.   
    43.         // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
    44.         isBm = new ByteArrayInputStream(baos.toByteArray());  
    45.         bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    46.   
    47.         return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩  
    48.   
    49.         //return bitmap;  
    50.     }  
    展开全文
  • 降低PNG图片存储大小方法,图片压缩方法,如何降低PNG图片存储大小?前提是分辨率和尺寸大小不变,图形的透明部分不变。请看如下办法,亲测可用。1. 将PNG图片用PS打开。2. 图像-模式-8位/通道 (这样在后续存储时才...

    降低PNG图片存储大小方法,图片压缩方法,如何降低PNG图片存储大小?前提是分辨率和尺寸大小不变,图形的透明部分不变。请看如下办法,亲测可用。

    ###1. 将PNG图片用PS打开。
    ###2. 图像-模式-8位/通道 (这样在后续存储时才有gif存储选项)
    这里写图片描述
    ###3. 将图片另存为GIF。
    这里写图片描述
    ###4. 选项中选择局部可感知或者全部可感知。
    这里写图片描述
    ###5. 强制选择“无”,勾选透明度。
    这里写图片描述
    ###6. 存储后的gif文件和原png文件对比,从20.6k变为了1.8k。
    这里写图片描述
    ###7. 最后,把文件后缀的gif命名为png。
    这里写图片描述
    ###这样,既保证了分辨率、大小,又保证透明部分依旧透明!

    关注公众号 【从入门到精通】 获取最新技术资料

    展开全文
  • 靠谱的图片压缩方法图片压缩.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Image经典图片压缩方法
  • iOS 图片压缩方法

    2019-09-26 07:42:35
    两种图片压缩方法: 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size)。 压缩图片质量 : NSData *data = UIImageJPEGRepresentation(image, compression); UIImage *resultImage = [UIImage ...

    两种图片压缩方法:

       两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size)。

     压缩图片质量 :

       NSData *data = UIImageJPEGRepresentation(image, compression);

       UIImage *resultImage = [UIImage imageWithData:data];  

      通过 UIImage 和  NSData 的相互转化,减小  JPEG 图片的质量来压缩图片。

      UIImageJPEGRepresentation::   第二个参数 compression 取值 0.0~1.0,值越小表示图片质量越低,图片文件自然越小。

     压缩图片尺寸:

        UIGraphicsBeginImageContext(size);

        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];

        resultImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

       给定所需的图片尺寸 size,resultImage 即为原图 image 绘制为 size 大小的图片。

     压缩图片使图片文件小于指定大小:

       如果对图片清晰度要求不高,要求图片的上传、下载速度快的话,上传图片前需要压缩图片。压缩到什么程度要看具体情况,但一般给设定一个图片文件最大值,例如100KB。可以用上诉两种方法来压缩图片。假设图片转化的 NSData 对象为 data,通过 data.length 即可得到图片的字节大小。

      压缩图片质量

       比较容易想到的方法是,通过循环来逐渐减小图片质量,直到图片稍小于指定大小(maxLength)。

       + (UIImage *)compressImageQuality:(UIImage *)image   toByte:(NSInteger)maxLength {

                CGFloat compression = 1;

                NSData *data = UIImageJPEGRepresentation(image, compression);

                while (data.length > maxLength && compression > 0) {

                      compression -= 0.02;

                      data = UIImageJPEGRepresentation(image, compression);

                     // When compression less than a value, this code dose not work

                  }

                 UIImage *resultImage = [UIImage imageWithData:data];

                  return resultImage;

           }

      这样循环次数多,效率低,耗时长。

      可以通过二分法来优化。

      OC 实例:

      + (UIImage *)compressImageQuality:(UIImage *)image toByte:(NSInteger)maxLength {

           CGFloat compression = 1;

           NSData *data = UIImageJPEGRepresentation(image, compression);

           if (data.length < maxLength) return image;

            CGFloat max = 1;

            CGFloat min = 0;

            for (int i = 0; i < 6; i++) {

                compression = (max + min) / 2;

                data = UIImageJPEGRepresentation(image, compression);

               if (data.length < maxLength * 0.9) {

                   min = compression;

                } else if (data.length > maxLength) {

                   max = compression;

                } else {

                   break;

                }

                }

               UIImage *resultImage = [UIImage imageWithData:data];

               return resultImage;

            }

      swift  实例:

       static func compressImageQuality(_ image: UIImage, toByte maxLength: Int) -> UIImage {

           var compression: CGFloat = 1

           guard var data = UIImageJPEGRepresentation(image, compression),

               data.count > maxLength else { return image }

           var max: CGFloat = 1

           var min: CGFloat = 0

           for _ in 0..<6 {

                compression = (max + min) / 2

                data = UIImageJPEGRepresentation(image, compression)!

                if CGFloat(data.count) < CGFloat(maxLength) * 0.9 {

                       min = compression

                } else if data.count > maxLength {

                      max = compression

               } else {

                       break

                }

          }

              return UIImage(data: data)!

          }

      当图片大小小于 maxLength,大于 maxLength * 0.9 时,不再继续压缩。最多压缩 6 次,1/(2^6) = 0.015625 < 0.02,也能达到每次循环  compression 减小 0.02 的效果。这样的压缩次数比循环减少compression 少,耗时短。

      需要注意的是,当图片质量低于一定程度时,继续压缩没有效果。也就是说,compression 继续减少,data也不再继续减小。压缩图片质量的优点在于,尽可能保留图片清晰度,图片不会明显模糊;缺点在于,不能保证图片压缩后小于指定大小。

     压缩图片尺寸:

       与之前类似,比较容易想到的方法是,通过循环逐渐减小图片尺寸,直到图片稍小于指定大小(maxLength)。具体代码省略。同样的问题是循环次数多,效率低,耗时长。可以用二分法来提高效率,具体代码省略。这里介绍另一种方法,比二分法更好,

      压缩次数少,而且可以使图片压缩后刚好小于指定大小(不只是 < maxLength,>  maxLength * 0.9)。

    OC  代码实例:

       + (UIImage *)compressImageSize:(UIImage *)image toByte:(NSUInteger)maxLength {

           UIImage *resultImage = image;

           NSData *data = UIImageJPEGRepresentation(resultImage, 1);

           NSUInteger lastDataLength = 0;

           while (data.length > maxLength && data.length != lastDataLength) {

                lastDataLength = data.length;

                CGFloat ratio = (CGFloat)maxLength / data.length;

                CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),(NSUInteger)(resultImage.size.height * sqrtf(ratio)));

                // Use NSUInteger to prevent white blank

                UIGraphicsBeginImageContext(size);

                // Use image to draw (drawInRect:), image is larger but more compression time

               // Use result image to draw, image is smaller but less compression time

               [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];

               resultImage = UIGraphicsGetImageFromCurrentImageContext();

               UIGraphicsEndImageContext();

                data = UIImageJPEGRepresentation(resultImage, 1);

                  }

                return resultImage;

            } 

    swift 代码实例:

           static func compressImageSize(_ image: UIImage, toByte maxLength: Int) -> UIImage {

                  guard var data = UIImageJPEGRepresentation(image, 1) else { return image }

                  var resultImage: UIImage = image

                  var lastDataLength: Int = 0

              while data.count > maxLength, data.count != lastDataLength {

                   lastDataLength = data.count

                   let ratio: CGFloat = CGFloat(maxLength) / CGFloat(data.count)

                   let size: CGSize = CGSize(width: Int(resultImage.size.width * sqrt(ratio)), height: Int(resultImage.size.height * sqrt(ratio)))

                   UIGraphicsBeginImageContext(size)

                   resultImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

                   resultImage = UIGraphicsGetImageFromCurrentImageContext()!

                   UIGraphicsEndImageContext()

                   data = UIImageJPEGRepresentation(resultImage, 1)!

                 }

               return resultImage

           }

         

    [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];  是用新图 resultImage 绘制,也可以用原图 image 来绘制。用原图绘制,压缩后图片更接近指定大小,但是压缩次数较多,耗时较长。一张大小为 6064 KB 的图片,压缩图片尺寸,原图绘制与新图绘制结果如下:

        

    指定大小(KB)原图绘制压缩后大小(KB)原图绘制压缩次数新图绘制压缩后大小(KB)新图绘制压缩次数
    500 498 6 498 3
    300 299 4 296 3
    100 99 5 98 3
    50 49 6 48 3

     

    两种绘制方法压缩后大小很接近,与指定大小也很接近,但原图绘制压缩次数可达到新图绘制压缩次数的两倍。建议使用新图绘制,减少压缩次数。压缩后图片明显比压缩质量模糊。

       需要注意的是绘制尺寸的代码

      CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)), (NSUInteger)(resultImage.size.height * sqrtf(ratio)));

    每次绘制的尺寸 size,要把宽 width 和 高 height  转换为整数防止绘制出的图片有白边。

    压缩图片尺寸可以使图片小于指定大小,但会使图片明显模糊(比压缩图片质量模糊)。

    两种图片压缩方法结合

      如果要保证清晰度,建议选择压缩图片质量。如果要使图片一定小于指定大小,压缩图片尺寸可以满足。对于后一种需求,还可以先压缩图片质量,如果已经小于指定大小,就可得到清晰的图片,否则再压缩图片尺寸。

      OC 代码实例 :

       + (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength {

        // Compress by quality

          CGFloat compression = 1;

          NSData *data = UIImageJPEGRepresentation(image, compression);

          if (data.length < maxLength) return image;

           CGFloat max = 1;

           CGFloat min = 0;

          for (int i = 0; i < 6; i++) {

               compression = (max + min) / 2;

               data = UIImageJPEGRepresentation(image, compression);

                if (data.length < maxLength * 0.9) {

                      min = compression;

                 } else if (data.length > maxLength) {

                      max = compression;

                  } else {

                      break;

                   }

              }

               UIImage *resultImage = [UIImage imageWithData:data];

               if (data.length < maxLength) return resultImage;

              // Compress by size

               NSUInteger lastDataLength = 0;

               while (data.length > maxLength && data.length != lastDataLength) {

                   lastDataLength = data.length;

                   CGFloat ratio = (CGFloat)maxLength / data.length;

                  CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)), (NSUInteger)(resultImage.size.height * sqrtf(ratio)));

                 // Use NSUInteger to prevent white blank

                  UIGraphicsBeginImageContext(size);

                 [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];

                 resultImage = UIGraphicsGetImageFromCurrentImageContext();

                 UIGraphicsEndImageContext();

                 data = UIImageJPEGRepresentation(resultImage, compression);

         }

                 return resultImage;

    }

     

         swift 代码实例 :

     static func compressImage(_ image: UIImage, toByte maxLength: Int) -> UIImage {

                  var compression: CGFloat = 1

                  guard var data = UIImageJPEGRepresentation(image, compression),

                 data.count > maxLength else { return image }

                 // Compress by size

                var max: CGFloat = 1

                var min: CGFloat = 0

                for _ in 0..<6 {

                    compression = (max + min) / 2

                    data = UIImageJPEGRepresentation(image, compression)!

                   if CGFloat(data.count) < CGFloat(maxLength) * 0.9 {

                       min = compression

                   } else if data.count > maxLength {

                       max = compression

                   } else {

                        break

                   }

          }

          var resultImage: UIImage = UIImage(data: data)!

          if data.count < maxLength { return resultImage }

          // Compress by size

         var lastDataLength: Int = 0

         while data.count > maxLength, data.count != lastDataLength {

              lastDataLength = data.count

              let ratio: CGFloat = CGFloat(maxLength) / CGFloat(data.count)

              let size: CGSize = CGSize(width: Int(resultImage.size.width * sqrt(ratio)), height: Int(resultImage.size.height * sqrt(ratio)))

              UIGraphicsBeginImageContext(size)

              resultImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

              resultImage = UIGraphicsGetImageFromCurrentImageContext()!

             UIGraphicsEndImageContext()

             data = UIImageJPEGRepresentation(resultImage, compression)! }

             return resultImage

    }

     

    转载于:https://www.cnblogs.com/LiZeYuBlog/p/8268996.html

    展开全文
  • Java图片压缩方法

    2021-03-13 16:21:32
    Java图片压缩方法 InputStream inputStream = file.getInputStream(); // 把图片读入到内存中 BufferedImage bufImg = ImageIO.read(inputStream); // 压缩代码 // 存储图片文件byte数组 ByteArrayOut

    Java图片压缩方法

                    InputStream inputStream = file.getInputStream();
    
                    // 把图片读入到内存中
                    BufferedImage bufImg = ImageIO.read(inputStream);
                    // 压缩代码
                    // 存储图片文件byte数组
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    //防止图片变红
                    BufferedImage newBufferedImage = new BufferedImage(217, 190, BufferedImage.TYPE_INT_RGB);
                    newBufferedImage.createGraphics().drawImage(bufImg, 0, 0, 217, 190, Color.WHITE, null);
                    //先转成jpg格式来压缩,然后在通过OSS来修改成源 文件本来的后缀格式
                    ImageIO.write(newBufferedImage, "jpg", bos);
                    //获取输出流
                    inputStream = new ByteArrayInputStream(bos.toByteArray());
    
    展开全文
  • 本篇文章主要介绍了iOS 图片压缩方法的示例代码,主要有两种压缩图片的方法,有兴趣的可以了解一下,有兴趣的可以了解一下。
  • Android图片压缩方法

    2016-07-11 14:05:55
    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法、比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩)。 第一:质量压缩方法: private Bitmap compressImage...
  • iOS图片压缩方法

    2017-02-04 14:58:49
    iOS图片压缩方法 http://www.cnblogs.com/silence-cnblogs/p/6346729.html 介绍压缩图片质量和尺寸的方法。如果要保证图片清晰度,可以先压缩图片质量,再压缩图片尺寸。App图片压缩裁剪原理和上传方案,以及那些...
  • 一个简单易用的JS图片压缩方法
  • Excel 表格图片压缩方法 Excel 表格图片压缩方法
  • AutoResizeImage(),MVC项目中自带的一种图片压缩方法,无需引用或者下载便可以在项目的视图层运用。近期在制作一个信息录入文本域,既然是要替用户上传信息的,自然少不了文件选择器功能的调用,往文本域中插入一个...
  • 本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法、比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩)。 第一:质量压缩方法: private Bitmap compressImage...
  • android图片压缩方法

    2013-09-04 14:21:00
    android图片压缩方法 android 图片压缩方法: 第一:质量压缩法: 1 private Bitmap compressImage(Bitmap image) { 2 3 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 4...
  • iOS 图片压缩方法_0

    2017-01-26 18:53:01
    iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size)。 压缩图片质量 NSData *data = UIImageJPEGRepresentation(image, compression); UIImage *resultImage...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,011
精华内容 2,404
关键字:

图片压缩方法