最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android圖片處理工具類BitmapUtils

 更新時間:2017年12月25日 09:18:55   作者:呂沖  
這篇文章主要為大家詳細介紹了Android圖片的處理工具類BitmapUtils,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Android圖片的處理工具類BitmapUtils,供大家參考,具體內(nèi)容如下

項目中經(jīng)常會用到圖片,所以在這先簡單的總結(jié)一下。閑言少敘,上代碼。

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; // 預定的圖片最大內(nèi)存,單位byte
    // 壓縮大小
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中
    int options = 100;
    while (baos.toByteArray().length > maxLength) { // 循環(huán)判斷,大于繼續(xù)壓縮
      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);// 質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中
    int options = 100;
    while (baos.toByteArray().length > maxLength) { // 循環(huán)判斷如果壓縮后圖片是否大于1mb,大于繼續(xù)壓縮
      options -= 10;// 每次都減少10
      baos.reset();// 重置baos即清空baos
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中
    }
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把壓縮后的數(shù)據(jù)baos存放到ByteArrayInputStream中
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream數(shù)據(jù)生成圖片
    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);
    // 產(chǎn)生縮放后的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轉(zhuǎn)換為文件
   *
   * @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轉(zhuǎn)換為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[] 之間轉(zhuǎn)換

  /**********************************************************/
  // 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);
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android中導航組件Navigation的實現(xiàn)原理

    Android中導航組件Navigation的實現(xiàn)原理

    大家好,本篇文章主要講的是Android中導航組件Navigation的實現(xiàn)原理,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Android開發(fā)實現(xiàn)布局中為控件添加選擇器的方法

    Android開發(fā)實現(xiàn)布局中為控件添加選擇器的方法

    這篇文章主要介紹了Android開發(fā)實現(xiàn)布局中為控件添加選擇器的方法,涉及Android開發(fā)中布局設(shè)置的相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android彈出窗口實現(xiàn)方法

    Android彈出窗口實現(xiàn)方法

    這篇文章主要介紹了Android彈出窗口實現(xiàn)方法,涉及Android TextView及鼠標事件的響應相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android BroadcastReceiver常見監(jiān)聽整理

    Android BroadcastReceiver常見監(jiān)聽整理

    這篇文章主要介紹了Android BroadcastReceiver常見監(jiān)聽整理的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • android 實現(xiàn)側(cè)邊彈窗特效代碼

    android 實現(xiàn)側(cè)邊彈窗特效代碼

    側(cè)邊彈窗是在左邊,需要定位好位置,實現(xiàn)原理其實就是進出動效,用位移加透明度效果來控制,下面通過代碼給大家介紹android 實現(xiàn)側(cè)邊彈窗,需要的朋友參考下吧
    2021-06-06
  • Android 界面開發(fā)顏色整理

    Android 界面開發(fā)顏色整理

    本文主要介紹Android 界面開發(fā)的顏色,這里整理了很多顏色以供大家參考,希望Android 開發(fā)的工作者可以參考使用
    2016-07-07
  • Android中簡單的電話管理與短信管理App編寫實例

    Android中簡單的電話管理與短信管理App編寫實例

    這篇文章主要介紹了Android中簡單的電話管理與短信管理App編寫實例,包括監(jiān)聽電話的呼叫狀態(tài)以及短信群發(fā)聯(lián)系人選擇等基本功能的實現(xiàn),代碼突出要點,需要的朋友可以參考下
    2016-04-04
  • 一些有效的Android啟動優(yōu)化策略分享

    一些有效的Android啟動優(yōu)化策略分享

    在當今激烈競爭的移動應用市場,應用的啟動速度直接影響著用戶的第一印象和滿意度,Android的啟動優(yōu)化是開發(fā)者必須關(guān)注的關(guān)鍵領(lǐng)域,本文將詳細介紹一些強大有效的Android啟動優(yōu)化策略,幫助你優(yōu)化應用的啟動過程,為用戶創(chuàng)造更出色的體驗,需要的朋友可以參考下
    2023-08-08
  • Android APP數(shù)字解鎖實例詳解

    Android APP數(shù)字解鎖實例詳解

    這篇文章主要介紹了Android 應用數(shù)字解鎖實例詳解的相關(guān)資料,這里附有實例代碼及實現(xiàn)效果圖,需要的朋友可以參考下
    2016-11-11
  • Android開發(fā)實現(xiàn)判斷通知欄是否打開及前往設(shè)置頁面的方法

    Android開發(fā)實現(xiàn)判斷通知欄是否打開及前往設(shè)置頁面的方法

    這篇文章主要介紹了Android開發(fā)實現(xiàn)判斷通知欄是否打開及前往設(shè)置頁面的方法,涉及Android通知欄的打開、判斷、設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01

最新評論

阿图什市| 高清| 河北区| 阳山县| 土默特右旗| 银川市| 原平市| 新津县| 金湖县| 雷山县| 固镇县| 华池县| 宜昌市| 城口县| 搜索| 五台县| 沾益县| 广德县| 湾仔区| 德阳市| 拉孜县| 逊克县| 清流县| 夹江县| 曲阜市| 宜兰县| 朝阳区| 博爱县| 乌拉特中旗| 鄂尔多斯市| 福清市| 大港区| 衡南县| 广灵县| 河池市| 东城区| 石渠县| 镇沅| 贞丰县| 天祝| 仙游县|