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

圖片壓縮後體積仍大?關鍵在於指定正確的 ImageFormat

     編輯:關於.NET

使用 Image.GetThumbnailImage 產生縮圖後呼叫 Save(string path) 無參數多載,預設以 PNG 格式 儲存,導致輸出檔案遠大於預期(甚至超過原圖),且瀏覽器可能無法正確顯示。解決方法:根據原圖副檔名明確指定 ImageFormat 參數。

問題重現


// 錯誤示範:預設 PNG 儲存
Image img = Image.FromFile(@"e:\1.jpg");
Image thumb = img.GetThumbnailImage(120, 120, null, IntPtr.Zero);
thumb.Save(@"e:\2.jpg"); // 實際存成 PNG,副檔名 .jpg 具誤導性
// 原圖 800x700 80KB → 縮圖 120x110 應 <10KB,實際卻 45KB

正確做法:依副檔名對應 ImageFormat


public void CreateThumbnailImage(string sourcePath, string destPath, int width, int height)
{
    using (Image img = Image.FromFile(sourcePath))
    {
        Image thumb = img.GetThumbnailImage(width, height, null, IntPtr.Zero);
        string ext = Path.GetExtension(sourcePath).ToLowerInvariant();
        ImageFormat format = GetImageFormat(ext);
        thumb.Save(destPath, format); // 關鍵:指定格式
    }
}

private static ImageFormat GetImageFormat(string extension)
{
    switch (extension)
    {
        case ".jpg": case ".jpeg": return ImageFormat.Jpeg;
        case ".png": return ImageFormat.Png;
        case ".gif": return ImageFormat.Gif;
        case ".bmp": return ImageFormat.Bmp;
        case ".tiff": return ImageFormat.Tiff;
        case ".wmf": return ImageFormat.Wmf;
        case ".emf": return ImageFormat.Emf;
        case ".exif": return ImageFormat.Exif;
        case ".ico": return ImageFormat.Icon;
        default: return ImageFormat.Png; // 預設回退
    }
}

修正後,同樣縮圖體積降至 4.6 KB,符合預期。

補充:GIF 透明圖片處理

  • GIF 格式不支援半透明(Alpha 通道),僅支援單一透明色。
  • 若原圖為透明 GIF 需保留透明效果,必須儲存為 PNG(副檔名改 .png),否則透明區塊會變黑/白。
  • 程式碼中可加入邏輯:偵測原圖 Image.Flags.HasFlag(ImageFlags.HasTranslucent) 且為 GIF 時,強制輸出 PNG。

總結

  1. 永遠明確指定 ImageFormat,不要依賴副檔名或預設值。
  2. 使用 using 確保 Image 物件正確釋放非託管資源。
  3. 透明圖片轉檔時,優先選擇 PNG 保真度最高。
  4. 大量處理時考慮 EncoderParameters 調整 JPEG 品質(如 85L)平衡體積與視覺品質。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved