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