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, 100, 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, null, 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, null, newOpts);
    return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
  } 

  public static byte[] Bitmap2Bytes(Bitmap bm) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, 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, null, 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, null, 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, 0, 0, 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, 100, 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, options, 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, 100, 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 pixelW, float pixelH) {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, 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, null, 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, null, newOpts);
    // 压缩好比例大小后再进行质量压缩
    // return compress(bitmap, 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, options, os);
    // Compress by loop
    while (os.toByteArray().length / 1024 > maxSize) {
      // Clean up os
      os.reset();
      // interval 10
      options -= 10;
      image.compress(Bitmap.CompressFormat.JPEG, options, 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, String outPath, 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, String outPath, float pixelW, 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, String outPath, float pixelW, float pixelH, boolean needsDelete)
      throws FileNotFoundException {
    Bitmap bitmap = ratio(imgPath, pixelW, pixelH);
    storeImage(bitmap, outPath); 

    // Delete original file
    if (needsDelete) {
      File file = new File(imgPath);
      if (file.exists()) {
        file.delete();
      }
    }
  } 

} 

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

您可能感兴趣的文章:

  • Android开发之图片压缩工具类完整实例
  • android图片压缩的3种方法实例
  • android bitmap compress(图片压缩)代码
  • Android图片压缩上传之基础篇
  • Android中3种图片压缩处理方法
  • android 将图片压缩到指定的大小的示例
  • Android图片压缩方法并压缩到指定大小
  • Android实现图片压缩(bitmap的六种压缩方式)
  • Android图片压缩以及优化实例
  • Android WebP 图片压缩与传输
(0)

相关推荐

  • Android实现图片压缩(bitmap的六种压缩方式)

    Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式: 其中,A代表透明度:R代表红色:G代表绿色:B代表蓝色. ALPHA_8 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度 ARGB_4444 表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个

  • Android中3种图片压缩处理方法

    Android中图片的存在形式: 1:文件形式:二进制形式存在与硬盘中. 2:流的形式:二进制形式存在与内存中. 3:Bitmap的形式 三种形式的区别: 文件形式和流的形式:对图片体积大小并没有影响.也就是说,如果你手机SD卡上的图片通过流的形式读到内存中,在内存中的大小也是原图的大小. 注意:不是Bitmap的形式. Bitmap的形式:图片占用的内存会瞬间变大. 以下是代码的形式: /** * 图片压缩的方法总结 */ /* * 图片压缩的方法01:质量压缩方法 */ private Bi

  • android图片压缩的3种方法实例

    android 图片压缩方法: 第一:质量压缩法: 复制代码 代码如下: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int op

  • Android WebP 图片压缩与传输

    1. 简介 直到4g时代,流量依然是宝贵的东西.而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题. 我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大. 走在时代前列的谷歌给出了一个不错的答案--WebP. WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%.而在我自己的测试里,有时候能小50%. 2. 大企业背书 WebP在2010年发布第一个版本,到现在已经6年

  • Android图片压缩方法并压缩到指定大小

    一.图片质量压缩 /** * 质量压缩方法 * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

  • Android开发之图片压缩工具类完整实例

    本文实例讲述了Android图片压缩工具类.分享给大家供大家参考,具体如下: 这里共享一个图片压缩工具类: package com.sanweidu.TddPay.util2; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class Im

  • android 将图片压缩到指定的大小的示例

    从网上收集后自己写的一个方法: 1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 /** * 根据分辨率压缩图片比例 * * @param imgPath * @param w * @param h * @return */ private static Bitmap compressByResolution(String imgPath, int w, int h) { BitmapFactory.Options opts = new BitmapFactory.Options();

  • Android图片压缩上传之基础篇

    在android程序开发中我们经常见到需要上传图片的场景,在这里有个技术点,需要把图片压缩处理,然后再进行上传.这样可以减少流量的消耗,提高图片的上传速度等问题. 关于android如何压缩,网上的资料也是很多,但大多数都是代码片段,讲解压缩步骤,而没有一个实用的工具类库.那么如何将压缩算法封装成一个实用工具库呢?其中会遇到些什么问题,比如: 1.需要压缩的图片有多少 2.压缩后的图片是覆盖还是保存到另外的目录 3.如果是另存目录需要将原始图片删除吗 4.如果改变压缩后的图片的尺寸大小是按照原图

  • Android图片压缩以及优化实例

    前言 图片压缩在Android技术中已经属于烂大街,上周看了2个开源库然后对自己项目的压缩做了对比,发现一些新东西,记录与此. 为何要压缩 1.体积的原因 如果你的图片是要准备上传的,那动辄几M的大小肯定不行的,况且图片分辨率大于设备分辨率的话毫无意义. 2.内存原因 如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和: bitmap内存大小 = 图

  • android bitmap compress(图片压缩)代码

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片.有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小.减少图片的大小有两种方法,1. 照小图片: 2. 压缩大图片. 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些: 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍

随机推荐