首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android 從 URL 載入圖片並生成縮略圖

     編輯:Java 相關知識

Android 網路圖片載入與縮略圖生成工具方法

在 Android 開發中,常需從網路下載圖片並顯示縮略圖以節省記憶體。本方法示範如何透過 HttpURLConnection 下載位元組資料,再利用 BitmapFactory.Options.inSampleSize 進行次採樣解碼,有效防止 OutOfMemoryError。

工具方法原始碼

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class ImageUtil {

    /**
     * 從 URL 載入圖片並生成縮略圖
     * @param urlString 圖片網址
     * @param targetSize 期望縮略圖最大邊長(像素)
     * @return 縮略圖 Bitmap,失敗回傳 null
     */
    public static Bitmap loadThumbnail(String urlString, int targetSize) {
        if (urlString == null || urlString.isEmpty()) return null;

        ByteArrayOutputStream outputStream = null;
        BufferedInputStream bis = null;
        InputStream is = null;

        try {
            URL url = new URL(urlString);
            is = url.openStream();
            bis = new BufferedInputStream(is, 4096);
            outputStream = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }
            outputStream.flush();
            byte[] imageData = outputStream.toByteArray();

            // 第一次解碼:僅取得圖片尺寸
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options);

            // 計算 inSampleSize
            int height = options.outHeight;
            int sampleSize = (int) (height / (float) targetSize);
            if (sampleSize <= 0) sampleSize = 1;
            else if (sampleSize > 3) sampleSize = 3; // 限制最大縮放倍數
            options.inSampleSize = sampleSize;
            options.inJustDecodeBounds = false;

            // 第二次解碼:取得縮略圖
            return BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options);

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } catch (OutOfMemoryError e) {
            System.gc();
            return null;
        } finally {
            closeQuietly(outputStream);
            closeQuietly(bis);
            closeQuietly(is);
        }
    }

    private static void closeQuietly(java.io.Closeable c) {
        if (c != null) try { c.close(); } catch (IOException ignored) {}
    }
}

使用範例

// 在背景執行緒中呼叫(如 AsyncTask、RxJava、Coroutines)
String imageUrl = "https://example.com/large_photo.jpg";
Bitmap thumb = ImageUtil.loadThumbnail(imageUrl, 200); // 200px 縮略圖
if (thumb != null) {
    imageView.setImageBitmap(thumb);
}

關鍵技術點

  1. inJustDecodeBounds:第一次解碼只讀取圖片寬高,不載入像素資料,極省記憶體。
  2. inSampleSize:設定為 2 表示寬高各縮減一半,像素數減為 1/4;為 2 的冪次時效能最佳。
  3. 記憶體保護:捕捉 OutOfMemoryError 並呼叫 System.gc() 嘗試回收。
  4. 串流關閉:finally 區塊確保所有串流正確關閉,避免洩漏。

現代替代方案

實務專案建議使用成熟圖片載入庫(Glide、Picasso、Coil),它們內建快取、生命週期感知、佔位圖等功能,寫法更簡潔:

Glide.with(context).load(url).override(200).into(imageView);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved