若要在 JavaScript 中將影像轉換為 Base64 字串,標準作法是對 File 或 Blob 呼叫 FileReader.readAsDataURL,它會回傳一個格式為 data:image/<type>;base64,<payload> 的 data URL,其中影像的每三個位元組會變成四個 RFC 4648 字元。即使不撰寫任何程式碼,也能輕鬆達到相同的目標——也就是一個可貼到 JSON 承載、HTML img src 屬性或 CSS 背景中的純 Base64 字串——只要把檔案交給一個會為你執行編碼步驟的專用瀏覽器工具即可。這兩條路徑並存的原因在於,Base64 本身並非 JavaScript 的發明;它是 RFC 4648 規範中定義的一種傳輸字母表,任何語言——包含在你瀏覽器分頁中執行的 JavaScript——都能產生它。不同方法之間的差別在於,你必須自己串接多少驗證、MIME 偵測與剪貼簿處理。

how to convert image to base64 in javascript
免寫程式碼,在 JavaScript 中將影像轉為 Base64

你原本會撰寫的 JavaScript 方法

大多數「JavaScript 影像轉 Base64」的教學與 Stack Overflow 回答都涵蓋三種模式,而每一種都帶有一個會由專用工具為你處理的尖銳問題。

第一種模式使用包裝在 load 處理函式中的 FileReader.readAsDataURL(file)。它適用於任何 File 或 Blob,回傳包含 MIME 前綴的完整 data URL,且不需要伺服器往返。尖銳問題在於,回傳前綴中的 MIME 是直接取自作業系統或你的 accept 過濾器所傳入的值——若檔案其實是被重新命名為 photo.jpg 的 PNG,輸出仍會標示為 data:image/jpeg;base64,…

第二種模式將影像繪製到 canvas 元素,然後呼叫 canvas.toDataURL('image/png')。這讓你能同時調整大小、重新壓縮或更改格式,但它也會重寫位元組:EXIF 會被捨棄,調色盤項目會被量化,動畫 GIF 與 WebP 會失去動畫。若你需要原始位元組——而非重新編碼——canvas 就是錯誤的工具。

第三種模式使用 fetch(url).then(r => r.blob()).then(b => new FileReader().readAsDataURL(b))。這是處理跨來源影像的正確形狀,但僅在伺服器傳送寬鬆的 CORS 標頭時成立,否則它會靜默失敗。這三種做法都不會驗證位元組是否真的是 PNG、JPEG、GIF 或 WebP 容器:它們只信任宣告的 MIME、檔案副檔名或伺服器回應。

透過瀏覽器型轉換器跳過程式碼

當你不需要把轉換嵌入到更大的 JavaScript 管線中時,Image to Base64 Converter 會以三項優勢產生相同的字串:它檢查實際位元組以判斷容器,它要求瀏覽器本身在發布結果前先解碼影像,且它絕不會把檔案傳送到任何地方。檔案讀取、容器偵測、瀏覽器解碼、Base64 編碼與剪貼簿寫入,全部都在目前分頁中完成。當結果變更或工具關閉時,暫時性的 ObjectURL 會被撤銷。

這使得該工具非常適合用於 API 承載、JSON fixture、HTML 或 CSS 實驗、電子郵件範本、離線原型、測試資料,以及必須將既有影像以文字表示的除錯工作流程。它並非一般網站上一般影像託管的替代品,也不應被視為如此——請參閱下方關於大小的說明。

逐步將影像轉換為 Base64

  1. 在你的瀏覽器分頁中開啟 Image to Base64 Converter。
  2. 從檔案選擇器挑選一個本機的 PNG、JPEG、GIF 或 WebP 檔案。
  3. 選擇你要的是僅含 Base64 字元的純文字,還是完整的 data:image/<type>;base64,… data URL。
  4. 執行轉換,並確認偵測到的位元組格式、實際解碼後的尺寸、檔案大小與螢幕上的預覽都符合預期。
  5. 使用複製按鈕複製完整輸出。在 data URL 模式下,前綴中的 MIME 是取自已驗證的位元組——被重新命名為 photo.jpg 的 PNG 仍會產生 data:image/png;base64,…

若檔案過大、容器位元組被截斷、無法在瀏覽器中解碼,或超出尺寸限制,工具會顯示明確的錯誤並清除任何先前的成功結果,避免你不慎複製到過時的字串。

純 Base64 與 Data URL 輸出的差異

你可以要求轉換器以兩種形狀輸出,端看文字會被貼到哪裡。

模式你複製的內容適用情境
純 Base64僅含規範的 RFC 4648 字母:A–Z、a–z、0–9、+、/,當最後一組少於三個輸入位元組時再加上一或兩個結尾的 = 號。JSON 請求主體、API 承載、設定欄位、手動解碼管線。
Data URLdata:image/<type>;base64, 開頭的完整字串,後接相同的承載內容,其中 <type> 取自已驗證的容器位元組。HTML img src 屬性、CSS background-image 值、遠端影像被封鎖時的電子郵件範本。

編碼完全遵循 RFC 4648 字母表。三個輸入位元組會被分組並寫成四個字元,因此 N 位元組的檔案會產生 ceil(N / 3) × 4 個字元,包含任何尾端的 = 填補。編碼器會處理三個位元組對齊的有界區塊,而不是把整個緩衝區攤開成單一變動參數呼叫,因此數 MB 的影像不會溢位 JavaScript 呼叫堆疊。串接區塊只會改變結果的組裝方式,編碼後的位元組絕不會被縮短或換行。

輸入限制與邊界時的行為

轉換器套用了一組嚴格的限制,以保證能給出真正完成的輸出,而非半成品。每個限制都會被精確檢查:邊界值會被接受,超過一個單位則會被拒絕。

限制接受的值拒絕的值
輸入檔案大小5 MiB = 5,242,880 位元組5,242,881 位元組
解碼後邊長較長邊 20,000 px任一邊 20,001 px
解碼後總像素40,000,000 像素40,000,001 像素
純 Base64 長度6,990,508 字元6,990,509 字元
最長 data URL6,990,531 字元 (data:image/webp;base64, = 23 字元 + 6,990,508 承載字元)6,990,532 字元

你可以直接驗證 Base64 上限。5,242,880 個輸入位元組分成三個位元組一組,可得到 1,747,626 個完整群組,再加上 2 個剩餘位元組,編碼器會將其寫成 1,747,627 組、每組 4 個字元:1,747,627 × 4 = 6,990,508 個純 Base64 字元。加上 23 字元的 WebP 前綴 data:image/webp;base64,,最長的 data URL 輸出為 6,990,531 字元。過大的檔案會在讀取主體之前產生明確錯誤,並在讀取後再次檢查實際的 ArrayBuffer 長度。任何值都不會被悄悄截斷。

像素面積與邊長限制之所以重要,是因為壓縮後的位元組在瀏覽器將其解碼為點陣圖時會大幅膨脹。一個小檔案若代表極高或極寬的畫布,仍可能因尺寸檢查而失敗;一個大檔案若代表一張合理的影像,仍可能因面積檢查而失敗。能否成功解碼取決於壓縮,而非檔案選擇器。

Base64 何時真正有用,何時有害

Base64 編碼是傳輸技巧,不是壓縮技巧。每三個輸入位元組會變成四個文字字元,因此在加上任何 data URL 前綴之前,編碼後的文字大約比原始檔案大三分之一。當你明確需要文字表示時,這個成長是可接受的——例如把影像嵌入不接受二進位的 API JSON 承載、把一個小圖示內嵌進 CSS 檔以供離線使用,或把一張小照片複製到會移除遠端參考的電子郵件範本中。但在一般網頁傳遞上,它是不好的選擇,因為一般影像檔與 CDN URL 壓縮效率更佳、快取效果更強,且能與 HTML 平行串流。

轉換器也會在 Base64 承載中保留原始影像位元組。它不會繪製到 canvas、調整大小、重新壓縮、改變顏色、壓平透明度、選擇 GIF 影格、移除詮資料、修復損壞或最佳化檔案大小。當下游消費者支援動畫時,動畫 GIF 與 WebP 的位元組會保持動畫。若你想要更小的承載,請先用 Image Compressor 最佳化檔案。若你想要不同的尺寸,請先用 Image Resizer。把這些步驟分開處理,可以避免隱性重新壓縮,並讓編碼後的輸出可預期。

編碼前後的相關工作流程

在 Base64 轉換的前後,常會出現三個相鄰的工作。

  • 編碼前先縮小檔案。若你的目標是更短的 data URL,請先把影像送入 Image Compressor。編碼長度會直接隨來源位元組縮放,因此檔案減半大致會讓 Base64 字串減半。
  • 編碼前先調整大小。若來源畫布尺寸不符,請在編碼前使用 Image Resizer 設定精確的像素尺寸。Base64 承載將精確代表這些像素。
  • 反向解碼。若你收到一串 Base64 並需要取回原始影像,反向工作流程是 Base64 to Image Converter,它會驗證容器並顯示預覽。

若處理的是一般文字而非影像容器,請使用 Base64 Encode and Decode。若要產生靜態影像 ASCII 藝術,請參閱 Image to ASCIIText to ASCII Art Generator。若你需要完全不同的影像格式——SVG、AVIF、HEIC、BMP、TIFF、PDF——轉換器依設計不在其適用範圍內;請先使用專用的格式轉換器,以確保位元組真的符合消費端預期。

若你正在權衡選項,Base64 影像過大:在你的瀏覽器中取得真正的檔案 對此有詳細說明。