Android图片处理工具类BitmapUtils

Android图片的处理工具类BitmapUtils,供大家参考,具体内容如下

项目中经常会用到图片,所以在这先简单的总结一下。闲言少叙,上代码。

package com.lvstudio.myapp.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.view.WindowManager;

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;

/**
 * Created by LvStudio on 2016/11/7.
 */

public class BitmapUtils {

  /**
   * 屏幕分辨率和指定清晰度的图片压缩方法
   *
   * @param context
   * @param image  Bitmap图片
   * @return
   */
  public static Bitmap comp(Context context, Bitmap image) {
    int maxLength = 1024 * 1024; // 预定的图片最大内存,单位byte
    // 压缩大小
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
    int options = 100;
    while (baos.toByteArray().length > maxLength) { // 循环判断,大于继续压缩
      options -= 10;// 每次都减少10
      baos.reset();// 重置baos即清空baos
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);//PNG 压缩options%
    }
    // 压缩尺寸
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    BitmapFactory.Options opts = new BitmapFactory.Options(); // 选项对象(在加载图片时使用)
    opts.inJustDecodeBounds = true; // 修改选项, 只获取大小
    BitmapFactory.decodeStream(bais, null, opts);// 加载图片(只得到图片大小)
    // 获取屏幕大小,按比例压缩
    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    int scaleX = opts.outWidth / manager.getDefaultDisplay().getWidth(); // X轴缩放比例(图片宽度/屏幕宽度)
    int scaleY = opts.outHeight / manager.getDefaultDisplay().getHeight(); // Y轴缩放比例
    int scale = scaleX > scaleY ? scaleX : scaleY; // 图片的缩放比例(X和Y哪个大选哪个)

    opts.inJustDecodeBounds = false; // 修改选项, 不只解码边界
    opts.inSampleSize = scale > 1 ? scale : 1; // 修改选项, 加载图片时的缩放比例
    return BitmapFactory.decodeStream(bais, null, opts); // 加载图片(得到压缩后的图片)
  }

  /**
   * 屏幕分辨率和指定清晰度的图片压缩方法
   *
   * @param context
   * @param path  图片的路径
   * @return
   */
  public static Bitmap comp(Context context, String path) {
    return compressImage(getUsableImage(context, path));
  }

  /**
   * 获取屏幕分辨率的Bitmap
   *
   * @param context
   * @param path  图片的路径
   * @return
   */
  public static Bitmap getUsableImage(Context context, String path) {
    BitmapFactory.Options opts = new BitmapFactory.Options(); // 选项对象(在加载图片时使用)
    opts.inJustDecodeBounds = true; // 修改选项, 只获取大小
    BitmapFactory.decodeFile(path, opts); // 加载图片(只得到图片大小)
    DisplayMetrics metrics = new DisplayMetrics();
    metrics = context.getApplicationContext().getResources().getDisplayMetrics();
    int scaleX = opts.outWidth / metrics.widthPixels; // X轴缩放比例(图片宽度/屏幕宽度)
    int scaleY = opts.outHeight / metrics.heightPixels; // Y轴缩放比例
    int scale = scaleX > scaleY ? scaleX : scaleY; // 图片的缩放比例(X和Y哪个大选哪个)

    opts.inJustDecodeBounds = false; // 修改选项, 不只解码边界
    opts.inSampleSize = scale > 1 ? scale : 1; // 修改选项, 加载图片时的缩放比例
    return BitmapFactory.decodeFile(path, opts); // 加载图片(得到缩放后的图片)
  }

  /**
   * 压缩图片清晰度,到指定大小
   *
   * @param image
   * @return
   */
  public static Bitmap compressImage(Bitmap image) {
    int maxLength = 1024 * 1024; // (byte)

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
    int options = 100;
    while (baos.toByteArray().length > maxLength) { // 循环判断如果压缩后图片是否大于1mb,大于继续压缩
      options -= 10;// 每次都减少10
      baos.reset();// 重置baos即清空baos
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
    }
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
    return bitmap;
  }

  /**
   * 指定分辨率和清晰度的图片压缩方法
   *
   * @param fromFile
   * @param toFile
   * @param reqWidth
   * @param reqHeight
   * @param quality
   */
  public static void transImage(String fromFile, String toFile, int reqWidth, int reqHeight, int quality) {
    Bitmap bitmap = BitmapFactory.decodeFile(fromFile);
    int bitmapWidth = bitmap.getWidth();
    int bitmapHeight = bitmap.getHeight();
    // 缩放的尺寸
    float scaleWidth = (float) reqWidth / bitmapWidth;
    float scaleHeight = (float) reqHeight / bitmapHeight;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    // 产生缩放后的Bitmap对象
    Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false);
    // 保存到文件
    bitmap2File(toFile, quality, resizeBitmap);
    if (!bitmap.isRecycled()) {
      // 释放资源,以防止OOM
      bitmap.recycle();
    }
    if (!resizeBitmap.isRecycled()) {
      resizeBitmap.recycle();
    }
  }

  /**
   * Bitmap转换为文件
   *
   * @param toFile
   * @param quality
   * @param bitmap
   * @return
   */
  public static File bitmap2File(String toFile, int quality, Bitmap bitmap) {
    File captureFile = new File(toFile);
    FileOutputStream out = null;
    try {
      out = new FileOutputStream(captureFile);
      if (bitmap.compress(Bitmap.CompressFormat.JPEG, quality, out)) {
        out.flush();
        out.close();
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return captureFile;
  }

  /**
   * Drawable转换为Bitmap
   *
   * @param drawable
   * @return
   */
  public static Bitmap drawableToBitamp(Drawable drawable) {
    int w = drawable.getIntrinsicWidth();
    int h = drawable.getIntrinsicHeight();
    Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
        : Bitmap.Config.RGB_565;
    Bitmap bitmap = Bitmap.createBitmap(w, h, config);
    // 注意,下面三行代码要用到,否在在View或者surfaceview里的canvas.drawBitmap会看不到图
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, w, h);
    drawable.draw(canvas);
    return bitmap;
  }

  // Bitmap、Drawable、InputStream、byte[] 之间转换

  /**********************************************************/
  // 1. Bitmap to InputStream
  public static InputStream bitmap2Input(Bitmap bitmap, int quality) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, quality, baos);
    return new ByteArrayInputStream(baos.toByteArray());
  }

  public static InputStream bitmap2Input(Bitmap bitmap) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return new ByteArrayInputStream(baos.toByteArray());
  }

  // 2. Bitmap to byte[]
  public static byte[] bitmap2ByteArray(Bitmap bitmap, int quality) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, quality, baos);
    return baos.toByteArray();
  }

  public static byte[] bitmap2ByteArray(Bitmap bitmap) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return baos.toByteArray();
  }

  // 3. Drawable to byte[]
  public static byte[] drawable2ByteArray(Drawable drawable) {
    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    return out.toByteArray();
  }

  // 4. byte[] to Bitmap
  public static Bitmap byteArray2Bitmap(byte[] bytes) {
    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
  }
}

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

您可能感兴趣的文章:

  • Android中使用Bitmap类将矩形图片转为圆形的方法
  • Android图片加载的缓存类
  • 非常实用的Android图片工具类
  • Android开发之多媒体文件获取工具类实例【音频,视频,图片等】
  • Android开发之图片压缩工具类完整实例
  • Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】
  • Android开发之超强图片工具类BitmapUtil完整实例
  • Android开发之图片切割工具类定义与用法示例
  • Android编程图片加载类ImageLoader定义与用法实例分析
  • Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】
(0)

相关推荐

  • Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】

    本文实例讲述了Android编程图片操作类定义与用法.分享给大家供大家参考,具体如下: 主界面类:拍照及选择相册图片 import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import androi

  • Android中使用Bitmap类将矩形图片转为圆形的方法

    一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public static Bitmap makeRoundCorner(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int left = 0, top = 0, right = width, bot

  • Android编程图片加载类ImageLoader定义与用法实例分析

    本文实例讲述了Android编程图片加载类ImageLoader定义与用法.分享给大家供大家参考,具体如下: 解析: 1)图片加载使用单例模式,避免多次调用时产生死锁 2)核心对象 LruCache 图片加载时先判断缓存里是否有图片,如果有,就使用缓存里的 没有就加载网络的,然后置入缓存 3)使用了线程池ExecutorService mThreadPool技术 4)使用了Semaphore 信号来控制变量按照先后顺序执行,避免空指针的问题 如何使用: 在Adapter里加载图片时 复制代码 代

  • Android开发之图片切割工具类定义与用法示例

    本文实例讲述了Android开发之图片切割工具类定义与用法.分享给大家供大家参考,具体如下: 该工具类比较常见于拼图游戏中使用.这里演示了类基本的定义与使用方法. 图片切割工具类定义: public class ImageSplitter { /** * 将图片切成 , piece *piece * * @param bitmap * @param piece * @return */ public static List<ImagePiece> split(Bitmap bitmap, in

  • 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图片工具类

    本文实例为大家分享了Android图片工具类的具体代码,供大家参考,具体内容如下 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; import android.grap

  • Android开发之多媒体文件获取工具类实例【音频,视频,图片等】

    本文实例讲述了Android开发之多媒体文件获取工具类.分享给大家供大家参考,具体如下: package com.android.ocr.util; import java.io.File; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import

  • Android开发之超强图片工具类BitmapUtil完整实例

    本文实例讲述了Android开发之超强图片工具类BitmapUtil.分享给大家供大家参考,具体如下: 说明:为了方便大家使用,本人把大家常用的图片处理代码集中到这个类里 使用了LruCache与SoftReference /** * 图片加载及转化工具 ----------------------------------------------------------------------- 延伸:一个Bitmap到底占用多大内存?系统给每个应用程序分配多大内存? Bitmap占用的内存为:

  • Android图片加载的缓存类

    本文为大家分享了Android图片加载的缓存类,供大家参考,具体内容如下 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReferenc

  • Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】

    本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类.分享给大家供大家参考,具体如下: 说明:此工具类是本人开发中总结下来的,还有其它的跳转亲给我留言,希望大家一起把这个工具类打造成最全的跳转工具,谢谢! package com.android.chat.utils; import java.io.File; import java.io.Serializable; import android.app.Activity; import android.content.Co

随机推荐