Android BitmapUtils工具类使用详解

本文实例为大家分享了Android BitmapUtils工具类的具体代码,供大家参考,具体内容如下

public final class BitmapUtils {
  public static final String TAG = "BitmapUtil";
  private static int sShotScreenWidth = 480;
  private static int sShotScreenHeight = 720;
  private static int sShotScreenSize = sShotScreenWidth * sShotScreenHeight;

  @SuppressLint("StaticFieldLeak")
  private static Context mContext;
  @SuppressLint("StaticFieldLeak")
  private static Activity mActivity;

  public void init(Context context,Activity ac) {
    mContext=context;
    mActivity=ac;

    DisplayMetrics dm = new DisplayMetrics();
    ac.getWindowManager().getDefaultDisplay().getMetrics(dm);
    //获取屏幕分辨率
    sShotScreenWidth = dm.widthPixels;
    sShotScreenHeight = dm.heightPixels;
    sShotScreenSize = sShotScreenWidth * sShotScreenHeight;
  }

  /**
   * 图片合成
   *
   * @param bitmap 位图1
   * @param mark 位图2
   * @return Bitmap
   */
  public static Bitmap createBitmap(Bitmap bitmap, Bitmap mark) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    int mW = mark.getWidth();
    int mH = mark.getHeight();
    Bitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个长宽一样的位图

    Canvas cv = new Canvas(newbitmap);
    cv.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入bitmap
    cv.drawBitmap(mark, w - mW , h - mH , null);// 在右下角画入水印mark
    cv.save(Canvas.ALL_SAVE_FLAG);// 保存
    cv.restore();// 存储
    return newbitmap;
  }

  /**
   * 放大缩小图片
   * @param bitmap 位图
   * @param w 新的宽度
   * @param h 新的高度
   * @return Bitmap
   */
  public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    Matrix matrix = new Matrix();
    float scaleWidht = ((float) w / width);
    float scaleHeight = ((float) h / height);
    matrix.postScale(scaleWidht, scaleHeight);
    return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
  }

  /**
   * 旋转图片
   * @param bitmap 要旋转的图片
   * @param angle 旋转角度
   * @return bitmap
   */
  public static Bitmap rotate(Bitmap bitmap,int angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
        bitmap.getHeight(), matrix, true);
  }

  /**
   * 圆形图片
   *@param source 位图
   * @param strokeWidth 裁剪范围 0表示最大
   * @param bl 是否需要描边
   * @param bl 画笔粗细
   * @param bl 颜色代码
   * @return bitmap
   */
  public static Bitmap createCircleBitmap(Bitmap source, int strokeWidth, boolean bl,int edge,int color) {

    int diameter = source.getWidth() < source.getHeight() ? source.getWidth() : source.getHeight();
    Bitmap target = Bitmap.createBitmap(diameter, diameter, Config.ARGB_8888);
    Canvas canvas = new Canvas(target);//创建画布

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    canvas.drawCircle(diameter / 2, diameter / 2, diameter / 2, paint);//绘制圆形
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取相交裁剪
    canvas.drawBitmap(source, strokeWidth, strokeWidth, paint);
    if(bl) {
      if (color == 0) color = 0xFFFEA248;//默认橘黄色
      paint.setColor(color);
      paint.setStyle(Paint.Style.STROKE);//描边
      paint.setStrokeWidth(edge);
      canvas.drawCircle(diameter / 2, diameter / 2, diameter / 2, paint);
    }
    return target;
  }

  /**
   * 圆角图片
   * @param bitmap 位图
   * @param rx x方向上的圆角半径
   * @param ry y方向上的圆角半径
   * @param bl 是否需要描边
   * @param bl 画笔粗细
   * @param bl 颜色代码
   * @return bitmap
   */
  public static Bitmap createCornerBitmap(Bitmap bitmap,int rx,int ry,boolean bl,int edge,int color) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);//创建画布

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    RectF rectF = new RectF(rect);
    canvas.drawRoundRect(rectF, rx, ry, paint);//绘制圆角矩形
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));//取相交裁剪
    canvas.drawBitmap(bitmap, rect, rect, paint);
    if(bl) {
      if (color == 0) color = 0xFFFEA248;//默认橘黄色
      paint.setColor(color);
      paint.setColor(color);
      paint.setStyle(Paint.Style.STROKE);//描边
      paint.setStrokeWidth(edge);
      canvas.drawRoundRect(rectF, rx, ry, paint);
    }
    return output;
  }

  /**
   * 按比例裁剪图片
   * @param bitmap 位图
   * @param wScale 裁剪宽 0~100%
   * @param hScale 裁剪高 0~100%
   * @return bitmap
   */
  public static Bitmap cropBitmap(Bitmap bitmap, float wScale, float hScale) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    int wh = (int) (w * wScale);
    int hw = (int) (h * hScale);

    int retX = (int) (w * (1 - wScale) / 2);
    int retY = (int) (h * (1 - hScale) / 2);

    return Bitmap.createBitmap(bitmap, retX, retY, wh, hw, null, false);
  }

  /**
   * 获得带倒影的图片方法
   * @param bitmap 位图
   * @param region 倒影区域 0.1~1
   * @return bitmap
   */
  public static Bitmap createReflectionBitmap(Bitmap bitmap,float region) {

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    Matrix matrix = new Matrix();
    matrix.preScale(1, -1);//镜像缩放
    Bitmap reflectionBitmap = Bitmap.createBitmap(
                         bitmap,0
                        , (int)(height*(1-region))//从哪个点开始绘制
                        , width
                        ,(int) (height*region)//绘制多高
                        , matrix, false);

    Bitmap reflectionWithBitmap = Bitmap.createBitmap(width,height+ (int) (height*region),
                              Config.ARGB_8888);
    Canvas canvas = new Canvas(reflectionWithBitmap);
    canvas.drawBitmap(bitmap, 0, 0, null);
    canvas.drawBitmap(reflectionBitmap, 0, height , null);

    LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                        reflectionWithBitmap.getHeight()
                        , 0x70ffffff, 0x00ffffff, TileMode.CLAMP);

    Paint paint = new Paint();
    paint.setShader(shader);
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));//取两层绘制交集。显示下层。
    canvas.drawRect(0, height, width, reflectionWithBitmap.getHeight() , paint);
    return reflectionWithBitmap;
  }

  /**
   * 图片质量压缩
   * @param bitmap
   * @param many 百分比
   * @return
   */
  public static Bitmap compressBitmap(Bitmap bitmap, float many){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, (int)many*100, baos);
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
    return BitmapFactory.decodeStream(isBm, null, null);
  }

  /**
   * 高级图片质量压缩
   *@param bitmap 位图
   * @param maxSize 压缩后的大小,单位kb
   */
  public static Bitmap imageZoom(Bitmap bitmap, double maxSize) {
    // 将bitmap放至数组中,意在获得bitmap的大小(与实际读取的原文件要大)
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    // 格式、质量、输出流
    bitmap.compress(Bitmap.CompressFormat.PNG, 70, baos);
    byte[] b = baos.toByteArray();
    // 将字节换成KB
    double mid = b.length / 1024;
    // 获取bitmap大小 是允许最大大小的多少倍
    double i = mid / maxSize;
    // 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
    doRecycledIfNot(bitmap);
    if (i > 1) {
      // 缩放图片 此处用到平方根 将宽带和高度压缩掉对应的平方根倍
      // (保持宽高不变,缩放后也达到了最大占用空间的大小)
      return scaleWithWH(bitmap,bitmap.getWidth() / Math.sqrt(i),
              bitmap.getHeight() / Math.sqrt(i));
    }
    return null;
  }

  /***
   * 图片缩放
   *@param bitmap 位图
   * @param w 新的宽度
   * @param h 新的高度
   * @return Bitmap
   */
  public static Bitmap scaleWithWH(Bitmap bitmap, double w, double h) {
    if (w == 0 || h == 0 || bitmap == null) {
      return bitmap;
    } else {
      int width = bitmap.getWidth();
      int height = bitmap.getHeight();

      Matrix matrix = new Matrix();
      float scaleWidth = (float) (w / width);
      float scaleHeight = (float) (h / height);

      matrix.postScale(scaleWidth, scaleHeight);
      return Bitmap.createBitmap(bitmap, 0, 0, width, height,
          matrix, true);
    }
  }

  /**
   * YUV视频流格式转bitmap
   * @param data YUV视频流格式
   * @return width 设置宽度
   * @return width 设置高度
   */
  public static Bitmap getBitmap(byte[] data, int width, int height) {
    Bitmap bitmap;
    YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
    //data是onPreviewFrame参数提供
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    yuvimage.compressToJpeg(new Rect(0, 0, yuvimage.getWidth(), yuvimage.getHeight()), 100, baos);//
    // 80--JPG图片的质量[0-100],100最高
    byte[] rawImage = baos.toByteArray();
    BitmapFactory.Options options = new BitmapFactory.Options();
    SoftReference<Bitmap> softRef = new SoftReference<Bitmap>(BitmapFactory.decodeByteArray(rawImage, 0, rawImage
        .length, options));
    bitmap = softRef.get();
    return bitmap;
  }

  /**
   * 图片路径转bitmap
   * @param file 图片的绝对路径
   * @return bitmap
   */
  public static Bitmap getAssetImage(String file) {
    Bitmap bitmap = null;
    AssetManager am = mActivity.getAssets();
    try {
      InputStream is = am.open(file);
      bitmap = BitmapFactory.decodeStream(is);
      is.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return bitmap;
  }

  /**
   * bitmap保存到指定路径
   * @param file 图片的绝对路径
   * @param file 位图
   * @return bitmap
   */
  public static boolean saveFile(String file, Bitmap bmp) {
    if(TextUtils.isEmpty(file) || bmp == null) return false;

    File f = new File(file);
    if (f.exists()) {
      f.delete();
    }else {
      File p = f.getParentFile();
      if(!p.exists()) {
        p.mkdirs();
      }
    }
    try {
      FileOutputStream out = new FileOutputStream(f);
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
      out.flush();
      out.close();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      return false;
    }
    return true;
  }

  /**
   * 回收一个未被回收的Bitmap
   *@param bitmap
   */
  public static void doRecycledIfNot(Bitmap bitmap) {
    if (!bitmap.isRecycled()) {
      bitmap.recycle();
    }
  }
}

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

(0)

相关推荐

  • 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 BitmapUtils工具类使用详解

    本文实例为大家分享了Android BitmapUtils工具类的具体代码,供大家参考,具体内容如下 public final class BitmapUtils { public static final String TAG = "BitmapUtil"; private static int sShotScreenWidth = 480; private static int sShotScreenHeight = 720; private static int sShotScr

  • Android网络工具类NetworkUtils详解

    网络工具类NetworkUtils,供大家参考,具体内容如下 提供的方法: 打开网络设置界面 openWirelessSettings 判断网络是否可用 isAvailable 判断网络是否连接 isConnected 判断网络是否是4G is4G 判断wifi是否连接状态 isWifiConnected 获取移动网络运营商名称 getNetworkOperatorName 获取移动终端类型 getPhoneType 获取当前的网络类型(WIFI,2G,3G,4G) getNetWorkType

  • Java多线程同步工具类CountDownLatch详解

    目录 简介 核心方法 CountDownLatch如何使用 CountDownLatch运行流程 运用场景 总结 简介 CountDownLatch是一个多线程同步工具类,在多线程环境中它允许多个线程处于等待状态,直到前面的线程执行结束.从类名上看CountDown既是数量递减的意思,我们可以把它理解为计数器. 核心方法 countDown():计数器递减方法. await():使调用此方法的线程进入等待状态,直到计数器计数为0时主线程才会被唤醒. await(long, TimeUnit):在

  • Android屏幕分辨率工具类使用详解

    Android开发中我们经常需要用到将dip.px相互换算.获取手机屏幕的宽度.高度以及状态栏高度等,如下是基于屏幕这一块整理的一个类. package com.per.loadingwebviewdome; import android.content.Context; import android.util.DisplayMetrics; import java.lang.reflect.Field; /** * @author: xiaolijuan * @description: 屏幕分

  • java Arrays工具类实例详解

    Arrays工具类属于java中常用的工具类 public static void sort(int[] a) public static void sort(int[] a,int fromIndex, int toIndex) public static void sort(long[] a) public static void sort(long[] a,int fromIndex, int toIndex) public static void sort(short[] a) publ

  • Java中JSON处理工具类使用详解

    本文实例为大家分享了JSON处理工具类的具体代码,供大家参考,具体内容如下 import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.seri

  • javaScript手机号码校验工具类PhoneUtils详解

    本文实例为大家分享了javaScript手机号码校验工具类PhoneUtils的具体代码,供大家参考,具体内容如下 //PhoneUtils命名空间 PhoneUtils = { phoneRegexs: { //中国电信号码段 CHINA_TELECOM_PATTERN: /^(?:\+86)?1(?:33|53|7[37]|8[019])\d{8}$|^(?:\+86)?1700\d{7}$/, //中国联通号码段 CHINA_UNICOM_PATTERN: /^(?:\+86)?1(?:3

  • javaScript字符串工具类StringUtils详解

    本文实例为大家分享了javaScript字符串工具类的具体代码,供大家参考,具体内容如下 StringUtils = { isEmpty: function(input) { return input == null || input == ''; }, isNotEmpty: function(input) { return !this.isEmpty(input); }, isBlank: function(input) { return input == null || /^\s*$/.t

  • javaScript日期工具类DateUtils详解

    本文实例为大家分享了javaScript日期工具类的具体代码,供大家参考,具体内容如下 DateUtils = { patterns: { PATTERN_ERA: 'G', //Era 标志符 Era strings. For example: "AD" and "BC" PATTERN_YEAR: 'y', //年 PATTERN_MONTH: 'M', //月份 PATTERN_DAY_OF_MONTH: 'd', //月份的天数 PATTERN_HOUR_O

  • Java日期处理工具类DateUtils详解

    本文实例为大家分享了Java日期处理工具类DateUtils的具体代码,供大家参考,具体内容如下 import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * <日期时间处理工具类> */ public class DateUtils { /** * Dat

随机推荐