# 影片截幀 — 把影片裡的某一幀存成圖片

任意位置，一張原畫質靜幀。

> 把 MP4、MOV 或 WebM 的任意一幀存成原尺寸 PNG 或 JPEG。可以一幀一幀地挪，也可以每隔幾秒截一張。全在瀏覽器裡跑，什麼都不上傳。

本頁是一個完全在你的瀏覽器裡執行的互動式工具，地址是 https://abox.tools/zh-TW/grab-frame/。你交給它的任何內容都不會被上傳。下面是這個頁面用文字對該工具的全部說明；要使用它，請開啟這個地址。

## 你的影片**不會上傳**。這裡根本沒有伺服器。

幀的查詢、解碼和繪製，都由你自己的瀏覽器在你自己的硬體上完成。這裡沒有任何東西能取或能發，因為這個工具壓根就沒有網路功能。就算有路可走，頁面的另一端也根本沒有伺服器可以接收影片。

- ✗ 不上傳
- ✗ 不註冊
- ✗ 無水印
- ✓ 原始解析度
- ✓ 斷網可用

## 從影片裡截一幀的步驟

1. **選一個影片。** 把 MP4、MOV、M4V 或 WebM 拖到選擇框裡，或者自己找出來。瀏覽器直接從磁碟上讀，這期間沒有任何東西發往別處。
2. **找到那個瞬間。** 播放然後在想要的地方停下，或者拖動滑塊。MP4 的滑塊一格就是一幀，所以你看到的和你存下的之間不存在取整。方向鍵一次挪一幀，按住 `Shift` 一次挪十幀。
3. **挑一個格式。** PNG 會把解碼出來的幀原樣存下，這就是這裡說的「原畫質」。JPEG 和 WebP 更小，但會在影片自身的壓縮之上再壓一遍，用來預覽沒問題，用在之後還要再編輯的圖上就不合適。
4. **截一張，或者截一串。** 單張會直接進你的下載。「每 N 秒」會把片子走一遍，在每個刻度取一張，做一覽圖和縮圖時很好用，而且它們會打包成一個 ZIP，而不是彈一百次儲存提示。

## 說得更細的版本

[怎麼把影片裡的一幀存成圖片](https://abox.tools/zh-TW/guides/grab-a-frame-from-a-video/): 按原解析度從片子裡取一張靜幀：為什麼暫停後的截圖不是同一張圖、該存成什麼格式，以及怎麼正好停在你想要的那一幀。

## 工具箱裡還有

- [影片轉 GIF](https://abox.tools/zh-TW/video-to-gif/): 挑好段落、尺寸和幀率。
- [GIF 製作](https://abox.tools/zh-TW/gif-maker/): 把一組圖片變成一段動畫。
- [GIF 拆幀](https://abox.tools/zh-TW/split-gif/): 每一幀都單獨存成一張 PNG。
- [GIF 分析](https://abox.tools/zh-TW/gif-analyzer/): 幀、延時、調色盤，以及每個位元組的去向。

## 常見問題

### 我的影片會被傳到哪裡去嗎？

不會。它由你自己的瀏覽器在你自己的硬體上讀取和解碼。這個工具沒有服務端，頁面的 `Content-Security-Policy` 裡寫著它允許聯絡的每一個地址，沒有一個屬於本站。你要是寧可自己查也不願聽我們說，拔掉網線，照樣截一幀試試。

### 「原畫質」到底是什麼意思？

兩件事。一是這張圖按影片本身的解析度儲存，而不是按頁面上預覽的大小，4K 的片子給的就是 ⁦3840 x 2160⁩ 的圖。二是選了 PNG 的話，這一幀就是從解碼器出來時的樣子，檔案裡裝的正是影片裡裝的畫面，上面沒有再壓一層。對著播放器視窗截圖兩樣都得不到：尺寸是視窗的尺寸，而且是播放器縮放並做完色彩管理之後的畫面。

### 哪些影片格式可以截幀？

MP4、M4V 和 MOV 直接讀，裡面裝什麼都行：H.264、HEVC、AV1 或 VP9，只要你的瀏覽器能解那個編碼。這是精確路徑，工具能點名到具體某一幀。其他瀏覽器能播的東西，最典型的是 WebM，則靠把播放器挪過去、再把它顯示的內容畫下來，一樣能存出原尺寸的圖，但落到的是播放器選的那一幀，而不是你要的那一幀。瀏覽器既讀不了也播不了的檔案，實際上就是 AVI、WMV、FLV 和大多數 MKV，會帶一句說明直接拒掉。

### 能一幀一幀地挪嗎？

MP4 可以，而且是精確的：工具讀的是檔案自己的幀列表，所以方向鍵是在真正存在的那些畫面之間移動，哪怕片子的幀率忽高忽低也一樣，而按三十分之一秒固定步進就會越走越偏。走播放路徑時沒有這份列表，一次操作大約挪一幀，頁面也會明說。

### 我直拍的手機影片在這裡為什麼是正的？

因為旋轉是特意應用上去的。手機是橫著拍的，然後把「轉四分之一圈」寫進檔案裡，而不是真的把畫素轉過來，所以解碼器交出來的幀是躺著的，每個播放器都會在送到你螢幕的路上把它扶正。跳過這一步的工具，會存下一張時刻沒錯、但躺著的圖。這個工具會從軌道裡讀出旋轉值，在畫任何東西之前先應用。

### 影片的大小或時長有上限嗎？

工具裡沒有寫死的上限，檔案也不會一次性讀進記憶體，而是幾 MB 幾 MB 地走過去，所以長片子和短片子開得一樣快。你截下的圖在下載之前留在頁面裡，所以真正的天花板是幾百張 4K PNG，而不是影片本身。

### 截下來的圖之後能縮放或裁剪嗎？

這裡不行，隔壁可以。這個工具只是把幀原樣存下來；改尺寸或改形狀是另一件事，裡面有自己的取捨，[圖片尺寸調整](https://abox.tools/zh-TW/resize-image/)兩件都能做，同樣什麼都不上傳。想在不改畫面的前提下把檔案變小，用[圖片壓縮](https://abox.tools/zh-TW/compress-image/)。

### 它免費嗎，需要註冊嗎？

免費，沒有帳號，不用登入，沒有試用期，也沒有水印。本站帶廣告，經費就是從那裡來的，廣告拿不到任何關於你影片的資訊。

## 這條隱私承諾怎麼核實

- **你的影片沒有出去的路。** Content-Security-Policy 裡寫著這個頁面允許聯絡的每一個地址，沒有一個屬於本站。這裡沒有任何可以收走你檔案的接收端，就算有，程式碼裡也沒有把檔案送過去的東西。
- **這裡不會去取任何東西。** 這個工具壓根就沒有網路功能：沒有地址可填，沒有東西要下載，第一次用也不會拉什麼引擎。碰到你影片的每一個位元組，都是頁面載入時從這個源來的。
- **解碼在本地完成。** 幀要麼走你自己瀏覽器裡的 WebCodecs，要麼走本來就會給你放這個片子的那套播放引擎。畫面畫在這臺機器的 canvas 上，然後直接交給下載。
- **檔案是幾 MB 幾 MB 讀的。** 影片是這裡唯一一種不能保證塞得進記憶體的檔案，所以從來不整個載入。讀取器只取你要的那一幀前後的一小段視窗，這也是兩個 G 的片子和小片子開得一樣快的原因。
- **Google 載入了什麼，又拿不到什麼。** 廣告指令碼和統計指令碼來自 Google。關於你影片的資訊，一條也沒有交給它們，檔案、某一幀、名字、大小、時長、你停在哪一刻，都沒有。讀取、解碼、繪製的每一行程式碼都由這個源提供，也都擺在儲存庫裡。
- **捐助按鈕載入了什麼，又拿不到什麼。** 頁首那個「Buy me a coffee」按鈕由 cdnjs.buymeacoffee.com 的指令碼畫出來，字型取自 Google Fonts。它不過是個連結，不上報訪問，也拿不到關於你或你影片的任何東西。
- **斷網也照樣能用。** 斷開網路，這個頁面上的一切照常工作。這是最省事的一條證明。

**你可以自己核對。**上面這些不用你信。這個頁面是儲存庫裡的模板和配置產生出來的，構建指令碼你能讀，也能自己跑一遍，跑出來的結果就提交在 `dist` 分支上。拿實際發給你的內容，跟你自己從原始碼構建出來的結果對一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先讀的幾個檔案：`config/site.toml` 裡是 Content-Security-Policy，`src/shared/mp4-reader.js` 是在 MP4 裡找出各幀的讀取器，`src/frames.js` 是負責把你要的那一幀解出來的部分。兩者都沒有引入任何能發出請求的東西。
