HEIC 格式的圖片怎麼辦?使用 heic2any.js 轉換為 JPEG 或 PNG

更新於 發佈於 閱讀時間約 12 分鐘

本篇要解決的問題

「本文介紹了如何使用 heic2any.js,一個 JavaScript 套件,可以將 HEIC 格式的圖片轉換為 JPEG 或 PNG 格式。同時提供了程式碼範例和使用方法,方便大家進行實際操作。」

上面那段是 ChatGPT 提供的頁面 description,因為看上去蠻有這麼一回事的,就拿來當本篇第一段重點。(是有沒有這麼懶)

簡單來說,就是前陣子 August 遇到了一個需求,要把 HEIC 的圖檔呈現在網頁上,也是因為遇到這個需求,才知道,咦?原來 HEIC 的圖片格式不能直接放在網頁上啊?(驚)

詢問了前同事後,知道了 heic2any.js 這個套件,然後進到套件的 GitHub 頁面後,咦?沒有寫使用說明啊?(驚 again)

然後,又因為懶,所以直接請 ChatGPT 寫一個 heic2any.js 的範例,結果,出來的程式碼是錯的!(驚 again * 2)

沒辦法,只好翻了一下套件的原始碼,再參考 ChatGPT 的寫法,去研究怎麼使用。

相信看到這篇的你,也是對官方沒有提供說明文件而感到震驚跟打擊,所以本篇除了會寫一個 Demo 出來,也會提供研究出來的程式碼。

大家取用本篇的程式碼前,希望可以分享本篇,或對 Demo 的 GitHub 專案打個星星。

畢竟這也是 August 花了時間整理出來的。

heic2any:https://github.com/alexcorvi/heic2any

本篇實作 Demo:https://letswritetw.github.io/letswrite-heic2any/


什麼是 HEIC?

以下是 ChatGPT 給的解釋:

HEIC 是 High Efficiency Image Format 的縮寫,是一種現代的圖像格式,由國際標準組織 MPEG(Moving Picture Experts Group)所定義。HEIC 格式通常使用在 iOS 11 及以上版本的 iPhone、iPad 和 macOS High Sierra 及以上版本的 Mac 上,作為照片和圖像的預設格式。

HEIC 格式相比傳統的 JPEG 格式具有更好的壓縮效率,可以在保持同樣圖像質量的情況下,大幅減小檔案大小。此外,HEIC 格式還支援更多的高級功能,例如多幅圖像的合成、深度圖和 Live Photo 等。

不過,HEIC 格式目前在一些應用上還存在一些限制,例如在某些瀏覽器和操作系統上無法直接顯示,需要進行轉換才能使用。因此,對於需要與多種平台和應用進行兼容性的使用者,可能需要將 HEIC 格式的圖片轉換為其他常見的圖像格式,例如 JPEG 或 PNG。

HEIC 格式的圖片在 Windows 和 Android 系統上也需要進行轉換才能直接顯示。

簡單來說,就是 iPhone、Mac 宇宙產出來的無生命但卻讓工程師處理起來要多一道工的格式。But,HEIC 格式比 JPEG 格式確實有很多優點,只是目前還存在一些兼容性問題,所以也不能說這個產物是投錯胎了。

大部份情況會是後端在收到圖,要存在圖庫或轉為 Base64 存在資料庫前,會先轉為 PNG 或 JPG 來儲存,之後 API 返回的圖檔路徑或是 Base64 就不會再是 HEIC。

不過,人生就是人生,難免會有存進去前漏了轉檔的意外,就會需要由前端來處理。


使用 heic2any.js

安裝 heic2any.js 的方式就跟我們使用其它 JavaScript 套件一樣,可以用 CDN 直接引用,或是用 npm package install 後再用 import 使用。

這邊,建議用 CDN 的方式,因為 heic2any.js 的檔案很~~~~大,未壓縮的檔案大小是 2.43 MB,壓縮過的也有 1.15 MB。用 CDN 來處理才不會對自己的主機產生太大的流量。

CDN

<script src="https://cdnjs.cloudflare.com/ajax/libs/heic2any/0.0.3/heic2any.min.js"></script>

npm

$ npm install heic2any

$ yarn add heic2any


import heic2any from 'heic2any';

引用了 JS 後,使用 heic2any.js 的函式如下:

// 讀取圖片檔案
const file = document.querySelector('input[type=file]').files[0];

// 轉換圖片格式為 JPEG
heic2any.convert({
blob: file,
toType: 'image/jpeg',
quality: 0.9
}).then(function(blob) {
// 使用轉換後的 Blob 物件
const imgSrc = URL.createObjectURL(blob);
}).catch(function (error) {
// 轉換失敗時的處理
});

toType:轉換成什麼格式,可以有 image/jpeg、image/png,是 png 的話,quality 的參數會無效。

quality:轉檔的品質,只在 toType 是 image/jpeg 時有效,值是 0 – 1。


狀況 1:使用者從 iPhone 上傳圖

使用者從 iPhone 選取圖片然後上傳,有機會遇到檔案是 HEIC 的格式。

這時,可以在前端傳給後端前先轉檔,或是後端收到圖片後再轉檔。

本篇用 heic2any.js 就是前端轉好再給後端的方式。

呈現的結果可以在 Demo 頁上看到,這邊不再說明,直接上程式碼:

HTML

<input class="hidden" id="file" type="file" accept="image/heic"/>

JS

const fileInput = document.getElementById('file');

fileInput.addEventListener('change', async (e) => {
const type = document.getElementById('type').value;
const file = e.target.files[0];
const result = await heic2any({
blob: file,
toType: toType: 'image/jpeg',
quality: 1
});
const uri = URL.createObjectURL(result);

// 執行下載
const filename = file.name.split('.heic')[0];
const link = document.createElement('a');
link.download = `檔名.${type}`;
link.href = uri;
link.click();

// 清空 file input 的值
fileInput.value = '';
});

狀況 2:API 回應的圖檔,是 HEIC 的 Base64 格式

第二種狀況,之前使用者所傳的圖檔就是 HEIC 的格式,而後端在轉成 Base64 儲存前未轉檔,所以之後 API 給的圖片值是 HEIC 的。

JS

// imgBase64 就是 HEIC 的 Base64 值,因為太長,就只顯示開頭的部份
const imgBase64 = "data:image/heic;base64,AAAAGGZ0eXBoZ......";

// 用 fetch 將 Base64 轉成 blob
const base64ToBlob = await fetch(imgBase64).then(res => res.blob());
const defaultImg = await heic2any({
blob: base64ToBlob,
toType: 'image/jpeg',
quality: 1
});

// 執行下載
const src = URL.createObjectURL(defaultImg);
const link = document.createElement('a');
link.download = `檔名.${type}`;
link.href = src;
link.click();

這邊有一個偷懶的寫法,就是把 HEIC 的 Base64 用 fetch 的方式轉成 blob 格式。

之所以說懶,是因為用 fetch 只需要寫一行。

一般常看到轉 Base64 的方法其實是 atob():

const imgBase64 = "data:image/heic;base64,AAAAGGZ0eXBoZ......";

// 用 atob 將 Base64 轉為 blob
const base64ToBlob = (base64) => {
const binary = atob(base64.split(',')[1]);
const mime = base64.split(',')[0].match(/:(.*?);/)[1];
const len = binary.length;
const buffer = new ArrayBuffer(len);
const view = new Uint8Array(buffer);
for (let i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
return new Blob([buffer], { type: mime });
};

const defaultImg = await heic2any({
blob: base64ToBlob(imgBase64),
toType: 'image/jpeg',
quality: 1
});

本篇 Demo 及原始碼

本篇的程式碼有放上 GitHub 上,也用 GitHub Pages 產生了 Demo,請自行取用,但希望在取用前能分享本篇,或在 GitHub 上點個星星,你的一個小小動作對本站都是大大的鼓勵。

原始碼:https://github.com/letswritetw/letswrite-heic2any

Demo:https://letswritetw.github.io/letswrite-heic2any/

留言
avatar-img
留言分享你的想法!
avatar-img
Let's Write 的沙龍
9會員
19內容數
沙龍到底是…做什麼用的勒?
Let's Write 的沙龍的其他內容
2024/08/24
了解如何在 GitLab 中設置和使用 CodiumAI PR-Agent 進行 AI Code Review,自動檢查和改進程式碼。本文提供詳細步驟,包括環境設置、提交必要檔案,以及如何使用 OpenAI API Key 進行配置。
Thumbnail
2024/08/24
了解如何在 GitLab 中設置和使用 CodiumAI PR-Agent 進行 AI Code Review,自動檢查和改進程式碼。本文提供詳細步驟,包括環境設置、提交必要檔案,以及如何使用 OpenAI API Key 進行配置。
Thumbnail
2024/08/07
了解如何使用 Cloudflare Workers AI 與 Whisper 建立免費開源的語音辨識功能。本文詳細說明註冊步驟、部署流程及程式碼修改,讓你輕鬆將語音轉換成文字。
Thumbnail
2024/08/07
了解如何使用 Cloudflare Workers AI 與 Whisper 建立免費開源的語音辨識功能。本文詳細說明註冊步驟、部署流程及程式碼修改,讓你輕鬆將語音轉換成文字。
Thumbnail
2024/06/05
學習如何使用 Tensorflow.js 的 COCO-SSD 模型在網頁上進行圖片物件辨識,包括基本使用方法、進階應用及實作範例,輕鬆辨識圖片中的人數和物件。
Thumbnail
2024/06/05
學習如何使用 Tensorflow.js 的 COCO-SSD 模型在網頁上進行圖片物件辨識,包括基本使用方法、進階應用及實作範例,輕鬆辨識圖片中的人數和物件。
Thumbnail
看更多
你可能也想看
Thumbnail
Modern technologies, like the HEIC format used by Apple, allow you to maintain high image quality with smaller file sizes. However, this format isn’t
Thumbnail
Modern technologies, like the HEIC format used by Apple, allow you to maintain high image quality with smaller file sizes. However, this format isn’t
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
Enhance This HiDiffusion SDXL是一個AI模型,結合HiDiffusion和SDXL兩種圖像生成模型,可以根據既有影像和文字描述生成新的圖像,可用來提高圖像解析度、修復瑕疵、轉換風格和自由創造新的圖像。
Thumbnail
Enhance This HiDiffusion SDXL是一個AI模型,結合HiDiffusion和SDXL兩種圖像生成模型,可以根據既有影像和文字描述生成新的圖像,可用來提高圖像解析度、修復瑕疵、轉換風格和自由創造新的圖像。
Thumbnail
全新軟體PDFtoPDF.ai使用先進的PDF壓縮技術,將笨重的PDF圖像轉換為易於管理的可編輯文字,同時保持文件質量。使用PDFtoPDF.ai,專業人士和個人用戶能輕鬆管理大量文件,提高工作效率。
Thumbnail
全新軟體PDFtoPDF.ai使用先進的PDF壓縮技術,將笨重的PDF圖像轉換為易於管理的可編輯文字,同時保持文件質量。使用PDFtoPDF.ai,專業人士和個人用戶能輕鬆管理大量文件,提高工作效率。
Thumbnail
Haiper AI 是一款免費的影片生成工具,是由 Google DeepMind 研究人員開發,只只需要輸入文字提示詞,就能生成各種場景的高質量的影片。
Thumbnail
Haiper AI 是一款免費的影片生成工具,是由 Google DeepMind 研究人員開發,只只需要輸入文字提示詞,就能生成各種場景的高質量的影片。
Thumbnail
如果你常常需要把照片轉成不同的格式,例如從JPG轉成PNG,或者從HEIC轉成JPG,那麼你可能會覺得這個過程很麻煩,尤其是如果你有很多照片要轉換的話,幸好,有一個方法可以讓你快速而簡單地完成這個任務,那就是使用捷徑app,在本文末可以取得此捷徑。 捷徑app是一個可以讓你自動化各種工作流程的應用
Thumbnail
如果你常常需要把照片轉成不同的格式,例如從JPG轉成PNG,或者從HEIC轉成JPG,那麼你可能會覺得這個過程很麻煩,尤其是如果你有很多照片要轉換的話,幸好,有一個方法可以讓你快速而簡單地完成這個任務,那就是使用捷徑app,在本文末可以取得此捷徑。 捷徑app是一個可以讓你自動化各種工作流程的應用
Thumbnail
這篇文章教你如何使用 DOM to Image 進行網頁截圖。內容包括如何安裝和使用 DOM to Image,注意事項,以及一個實用的 Demo 和原始碼。文章還探討了 Notion AI 生成的文章,並在最後提供了一個關於生成式 AI 影響的彩蛋。
Thumbnail
這篇文章教你如何使用 DOM to Image 進行網頁截圖。內容包括如何安裝和使用 DOM to Image,注意事項,以及一個實用的 Demo 和原始碼。文章還探討了 Notion AI 生成的文章,並在最後提供了一個關於生成式 AI 影響的彩蛋。
Thumbnail
這篇文章教你如何使用 heic2any.js 來轉換 HEIC 格式的圖片。內容包括 HEIC 格式的介紹、如何使用 heic2any.js、處理從 iPhone 上傳的 HEIC 格式圖片,以及處理 API 回應的 HEIC Base64 格式圖檔的方法。文章提供了實用的 Demo 和原始碼。
Thumbnail
這篇文章教你如何使用 heic2any.js 來轉換 HEIC 格式的圖片。內容包括 HEIC 格式的介紹、如何使用 heic2any.js、處理從 iPhone 上傳的 HEIC 格式圖片,以及處理 API 回應的 HEIC Base64 格式圖檔的方法。文章提供了實用的 Demo 和原始碼。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News