{"id":13632750,"url":"https://github.com/MROS/jpeg_tutorial","last_synced_at":"2025-04-18T05:33:06.924Z","repository":{"id":56083056,"uuid":"178069668","full_name":"MROS/jpeg_tutorial","owner":"MROS","description":"跟我寫 JPEG 解碼器 (Write a JPEG decoder with me)","archived":false,"fork":false,"pushed_at":"2022-05-22T15:19:57.000Z","size":19826,"stargazers_count":743,"open_issues_count":3,"forks_count":46,"subscribers_count":21,"default_branch":"master","last_synced_at":"2024-11-09T01:34:45.316Z","etag":null,"topics":["decoder","jpeg","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MROS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-27T20:26:44.000Z","updated_at":"2024-11-05T03:42:23.000Z","dependencies_parsed_at":"2022-08-15T12:50:32.669Z","dependency_job_id":null,"html_url":"https://github.com/MROS/jpeg_tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MROS%2Fjpeg_tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MROS%2Fjpeg_tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MROS%2Fjpeg_tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MROS%2Fjpeg_tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MROS","download_url":"https://codeload.github.com/MROS/jpeg_tutorial/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249436970,"owners_count":21271979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["decoder","jpeg","rust"],"created_at":"2024-08-01T22:03:14.119Z","updated_at":"2025-04-18T05:33:06.512Z","avatar_url":"https://github.com/MROS.png","language":"Rust","readme":"# 跟我寫 JPEG 解碼器\n\n## 緣起\n幾年前曾用 C++ 寫過一次 [JPEG 解碼器](https://github.com/MROS/jpeg_decoder)，還記得當時網路上對 JPEG 格式的介紹都雜亂無章、少東缺西，而標準書爲求完整嚴謹，寫的是又臭又長。就沒有讓我趕快寫完作業的法子嗎？最後我在 github 上撈到了一份 python 寫的解碼器，透過追蹤這份程式碼，才好不容易地把網路文章寫的不清楚的地方弄懂了。\n\n我在寫作本文時，特地又搜尋了一次網路文章，發現這幾年確實出現了幾篇比較好的文章，但再繼續深挖，就會發現講解 JPEG 的中文文章萬變不離其宗，都是從這篇 [JPEG 圖像解碼方案](http://read.pudn.com/downloads166/ebook/757412/jpeg/JPEG%CD%BC%CF%F1%BD%E2%C2%EB%B7%BD%B0%B8.pdf)修修補補來的，在理論的深度以及論述的清晰度都略有不足，因此嘗試挑戰看看，能否用自己的方式將 JPEG 講解的更清楚。但有些前人的例子非常不錯，會註明出處後繼續沿用。\n\n本文的目的是：**希冀讀者只要跟着本文的腳步，就能夠最快的打造出自己的 JPEG 解碼器**。此外，我也會在邊寫作本文邊再次實作 JPEG 解碼器的過程中，實作一些能協助除錯的小工具，一併開源讓讀者使用，解碼器的源碼也會盡量保持可讀性，可供讀者直接參考。\n\n如果還有時間，我也會嘗試撰寫一份 JPEG 的理論基礎，畢竟，能夠實作算法，並不代表理解了算法的原理，我當年便是如此，寫完了，但卻感覺沒學到什麼。而理論方面的文章還很缺乏，我願做先鋒，雖千萬人吾往矣。\n\n## 章節說明\n\n爲了便於閱讀，爲了讓讀者有種過關斬將，一直有進度的感覺，我把整套解碼過程切割成五個章節，還有附錄講解 JPEG 的理論基礎、優化技巧。\n\n- [（一）概述](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E4%B8%80%EF%BC%89%E6%A6%82%E8%BF%B0.md)：簡介 JPEG 解碼流程\n- [（二）讀取區段](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E4%BA%8C%EF%BC%89%E6%AA%94%E6%A1%88%E7%B5%90%E6%A7%8B.md)：簡介 JPEG 檔案結構\n- [（三）讀取量化表、霍夫曼表](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E4%B8%89%EF%BC%89%E8%AE%80%E5%8F%96%E9%87%8F%E5%8C%96%E8%A1%A8%E3%80%81%E9%9C%8D%E5%A4%AB%E6%9B%BC%E8%A1%A8.md)\n- [（四）讀取壓縮圖像數據](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E5%9B%9B%EF%BC%89%E8%AE%80%E5%8F%96%E5%A3%93%E7%B8%AE%E5%9C%96%E5%83%8F%E6%95%B8%E6%93%9A.md)\n- [（五）解碼](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E4%BA%94%EF%BC%89%E8%A7%A3%E7%A2%BC.md)\n- （附錄一）理論基礎\n- [（附錄二）優化技巧](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E9%99%84%E9%8C%84%E4%BA%8C%EF%BC%89%E5%84%AA%E5%8C%96%E6%8A%80%E5%B7%A7.md)\n- [（附錄三）參考資料](https://github.com/MROS/jpeg_tutorial/blob/master/doc/%E8%B7%9F%E6%88%91%E5%AF%ABjpeg%E8%A7%A3%E7%A2%BC%E5%99%A8%EF%BC%88%E9%99%84%E9%8C%84%E4%B8%89%EF%BC%89%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99.md)\n\n## 閱讀數學式\ngithub 並不支援在 markdown 中寫數學式，建議 clone 本專案之後，以 [typora](https://typora.io/) （在 typora 的偏好設定中開啓行內數學式） 或是其他 markdown 閱讀軟體來閱讀，會有更佳的體驗。\n\n## [配套程式碼](https://github.com/MROS/jpeg_tutorial)\n\n### 前置準備\n\n- 本配套程式碼以 rust 撰寫，請先安裝 [rust 工具鏈](https://www.rust-lang.org/tools/install)。\n\n### 下載程式碼\n``` sh\ngit clone https://github.com/MROS/jpeg_tutorial\n```\n\n### 安裝\n\n```sh\ncd jpeg_tutorial\ncargo install --path .\n```\n`cargo install` 會將編譯出的執行檔 `jpeg_tutorial` 放進 ~/.cargo/bin 之中，請確認 ~/.cargo/bin 已經在 $PATH 裡。\n\n### 執行\n\n#### 轉檔爲 ppm 格式\n\nppm 檔的預設檔名爲 out.ppm\n\n``` sh\njpeg_tutorial \u003cjpeg_path\u003e ppm\n```\n\n不加子命令，預設效果也是轉換爲 ppm\n\n```sh\njpeg_tutorial \u003cjpeg_path\u003e\n```\n\n#### 打印各區段數據\n\n```\njpeg_tutorial \u003cjpeg_path\u003e reader\n```\n\n#### 僅打印標記碼\n\n```\njpeg_tutorial \u003cjpeg_path\u003e marker\n```\n\n#### 打印指定 mcu 在解碼過程的各階段狀態\n\n```\njpeg_tutorial \u003cjpeg_path\u003e mcu \u003c縱座標\u003e \u003c橫座標\u003e\n```\n\n假設有一張圖片高度上有 8 個 mcu  、寬度上有 12 個 mcu ，用\n\n```sh\njpeg_tutorial \u003cjpeg_path\u003e mcu 7 11\n```\n\n來得到最右下角的 mcu 各階段狀態，注意到索引從 0 開始。\n","funding_links":[],"categories":["Rust","Tutorials"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMROS%2Fjpeg_tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMROS%2Fjpeg_tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMROS%2Fjpeg_tutorial/lists"}