English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Strumento di elaborazione delle immagini Android BitmapUtils

Classe di strumenti di elaborazione delle immagini Android BitmapUtils, per riferimento, i contenuti specifici sono come segue

Negli scenari Android, le immagini vengono utilizzate spesso, quindi riassumiamo brevemente qui. Senza dilungarci, passiamo al codice.

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;
/**
 * Creato da LvStudio il 7 novembre 2016.
 */
public class BitmapUtils {
  /**
   * Metodo di compressione dell'immagine con risoluzione dello schermo e qualità specificata
   *
   * @param context
   * @param image  Immagine Bitmap
   * @return
   */
  public static Bitmap comp(Context context, Bitmap image) {
    int maxLength = 1024 * 1024; // Dimensione massima prevista dell'immagine in memoria, in byte
    // Comprimi le dimensioni
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos); // Metodo di compressione della qualità, qui 100 rappresenta non compressione, i dati compressi vengono memorizzati in baos
    int options = 100;
    while (baos.toByteArray().length > maxLength) { // Giudizio di ciclo, continua se maggiore
      options -= 10; // Riduci di 10 ogni volta
      baos.reset(); // Riavvia baos, ovvero svuota baos
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);// PNG compressione options%
    }
    // Comprimi le dimensioni
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    BitmapFactory.Options opts = new BitmapFactory.Options(); // Oggetto delle opzioni (utilizzato durante il caricamento dell'immagine)
    opts.inJustDecodeBounds = true; // Modifica le opzioni, ottenere solo le dimensioni
    BitmapFactory.decodeStream(bais, null, opts);// Carica l'immagine (ottieni solo le dimensioni dell'immagine)
    // Ottieni le dimensioni dello schermo e compressa in proporzione
    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    int scaleX = opts.outWidth / manager.getDefaultDisplay().getWidth(); // Rapporto di zoom X (larghezza dell'immagine / larghezza dello schermo)
    int scaleY = opts.outHeight / manager.getDefaultDisplay().getHeight(); // Rapporto di zoom Y
    int scale = scaleX > scaleY ? scaleX : scaleY; // Fattore di ridimensionamento dell'immagine (scegli X o Y)
    opts.inJustDecodeBounds = false; // Modifica le opzioni, non decodificare solo i confini
    opts.inSampleSize = scale > 1 ? scale : 1; // Modifica le opzioni, il fattore di ridimensionamento quando si carica l'immagine
    return BitmapFactory.decodeStream(bais, null, opts); // Carica l'immagine (ottieni l'immagine compressa)
  }
  /**
   * Metodo di compressione dell'immagine con risoluzione dello schermo e qualità specificata
   *
   * @param context
   * @param path  Il percorso dell'immagine
   * @return
   */
  public static Bitmap comp(Context context, String path) {
    return compressImage(getUsableImage(context, path));
  }
  /**
   * Ottieni il Bitmap della risoluzione dello schermo
   *
   * @param context
   * @param path  Il percorso dell'immagine
   * @return
   */
  public static Bitmap getUsableImage(Context context, String path) {
    BitmapFactory.Options opts = new BitmapFactory.Options(); // Oggetto delle opzioni (utilizzato durante il caricamento dell'immagine)
    opts.inJustDecodeBounds = true; // Modifica le opzioni, ottenere solo le dimensioni
    BitmapFactory.decodeFile(path, opts); // Carica l'immagine (ottieni solo la dimensione dell'immagine)
    DisplayMetrics metrics = new DisplayMetrics();
    metrics = context.getApplicationContext().getResources().getDisplayMetrics();
    int scaleX = opts.outWidth / metrics.widthPixels; // Fattore di ridimensionamento dell'asse X (larghezza dell'immagine / larghezza dello schermo)
    int scaleY = opts.outHeight / metrics.heightPixels; // Fattore di ridimensionamento dell'asse Y
    int scale = scaleX > scaleY ? scaleX : scaleY; // Fattore di ridimensionamento dell'immagine (scegli X o Y)
    opts.inJustDecodeBounds = false; // Modifica le opzioni, non decodificare solo i confini
    opts.inSampleSize = scale > 1 ? scale : 1; // Modifica le opzioni, il fattore di ridimensionamento quando si carica l'immagine
    return BitmapFactory.decodeFile(path, opts); // Carica l'immagine (ottieni l'immagine ridimensionata)
  }
  /**
   * Comprimi la chiarezza dell'immagine a una dimensione specificata
   *
   * @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); // Metodo di compressione della qualità, qui 100 rappresenta non compressione, i dati compressi vengono memorizzati in baos
    int options = 100;
    while (baos.toByteArray().length > maxLength) { // Cicla per verificare se l'immagine compressa è maggiore di 1mb, se lo è continua a comprimere
      options -= 10; // Riduci di 10 ogni volta
      baos.reset(); // Riavvia baos, ovvero svuota baos
      image.compress(Bitmap.CompressFormat.JPEG, options, baos); // Comprimi l'immagine con options%, metti i dati compressi nel baos
    }
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); // Metti i dati compressi baos in ByteArrayInputStream
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); // Converti i dati di ByteArrayInputStream in immagine
    return bitmap;
  }
  /**
   * Metodo di compressione dell'immagine specifica risoluzione e qualità
   *
   * @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();
    // Dimensioni di zoom
    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);
  }
}

Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento, e spero che tu sostenga fortemente il tutorial urla.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare