热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android图片处理工具类BitmapUtils

这篇文章主要为大家详细介绍了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);
  }
}

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


推荐阅读
  • 免费获取:全面更新的Linux集群视频教程及配套资源
    本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
  • ArchSummit深圳2014将于7月18日拉开帷幕,所有讲师已确认,涵盖9个热门话题,共36场精彩报告。InfoQ中文站提供了详细的讲师和报告列表。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 在学习LVM(逻辑卷管理)技术的过程中,我对MD(多设备)、DM(设备映射器)以及逻辑设备和RAID的实现有了深入的理解。LVM2架构主要由DM主模块及其多个子模块组成,其中linear子模块用于创建线性设备,类似于简单的磁盘分区拼接。此外,还探讨了其他子模块如striped、mirror等在提高性能和数据冗余方面的应用。通过实际操作,我掌握了LVM的基本配置和管理方法,能够灵活应对不同存储需求。 ... [详细]
  • ipvsadm命令简介:ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。在fedora14、Linux6.0之后系统中 ... [详细]
  • 本文详细探讨了 HAProxy 的基本概念及其与 LVS(Linux Virtual Server)的比较,特别是在内核空间与用户空间的工作差异。文章还深入介绍了 HAProxy 独有的数据结构——弹性二叉树,以及其在高并发场景下的表现。 ... [详细]
  • 集群与负载均衡技术解析
    本文探讨了集群(Cluster)的概念,即通过网络连接的一组计算机系统,它们作为一个整体提供服务,实现分布式计算。文章还详细介绍了负载均衡技术,旨在提高网络服务的效率和可靠性。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 负载均衡基础概念与技术解析
    随着互联网应用的不断扩展,用户流量激增,业务复杂度显著提升,单一服务器已难以应对日益增长的负载需求。负载均衡技术应运而生,通过将请求合理分配到多个服务器,有效提高系统的可用性和响应速度。本文将深入探讨负载均衡的基本概念和技术原理,分析其在现代互联网架构中的重要性及应用场景。 ... [详细]
  • LVS-DR数据包流向分析介绍
    下文给大家带来LVS-DR数据包流向分析介绍,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍, ... [详细]
  • 【Linux332】LVS的DR配置详解(ipvsadm+arptables)
    文章目录1.DR简 ... [详细]
  • 领导让了解一下业务连续性与系统高可用性的关系,在网上查了好久,还是有点迷茫,请教一下各位大神 ... [详细]
  • java大数据量调优(超赞值得收藏)
    从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节: ... [详细]
author-avatar
手机用户2502905845
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有