亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

用C語言實現(xiàn)PNG/JPEG轉(zhuǎn)BMP:從解碼原理到工程實踐

用C語言實現(xiàn)PNG/JPEG轉(zhuǎn)BMP:從解碼原理到工程實踐 簡介這是一份面向C語言學(xué)習者和圖像處理開發(fā)者的圖片格式轉(zhuǎn)換工程圍繞PNG與JPEG轉(zhuǎn)BMP的核心任務(wù)同時涵蓋圖片縮放、旋轉(zhuǎn)等常見操作。工程基于VC6.0開發(fā)包含完整C語言源碼、libpng與jpeglib庫文件、頭文件及可執(zhí)行程序壓縮包共243個文件約14.15MB目錄按源碼、庫、示例圖片和工程配置分類既有16張測試用PNG/JPG原圖也有轉(zhuǎn)換后的BMP結(jié)果及配套音頻素材便于直接運行和對照驗證。目前已有2646人學(xué)習下載。通過學(xué)習這套源碼可以掌握PNG的IHDR/IDAT塊解析、JPEG的DCT與量化解碼流程、BMP文件頭及像素數(shù)據(jù)的寫入規(guī)則如4字節(jié)行對齊以及最近鄰插值、雙線性插值和仿射變換等圖像處理算法的C語言實現(xiàn)從解碼到編碼全流程均有代碼呈現(xiàn)。對于準備課程設(shè)計、畢業(yè)設(shè)計或想深入理解圖像編碼原理、文件I/O與內(nèi)存操作的開發(fā)者這是一份可直接參考的完整實例。1. 用 C 語言實現(xiàn) PNG/JPEG 轉(zhuǎn) BMP為什么說是件反直覺的苦差事圖片格式轉(zhuǎn)換這件事表面上是“讀文件、改個頭、寫文件”實際做起來才發(fā)現(xiàn) BMP 這個“最笨”的格式反而是照妖鏡。PNG 有濾波、有 zlib 壓縮、有 Adam7 隔行JPEG 有 Huffman 表、有量化矩陣、有 4:2:0 色度抽樣而 BMP 只認原始像素數(shù)組。把前面兩種格式解碼成原始 RGB 再交給 BMP等于把一個圖片格式轉(zhuǎn)換工具做成了“半個解碼器”。很多人在網(wǎng)上找現(xiàn)成的 C 語言轉(zhuǎn)換源碼包下載后一跑就花屏、偏色、錯行根本不是代碼寫錯而是對格式規(guī)范理解得不到位。這篇文章拿一份具體的轉(zhuǎn)換工程拆解來龍去脈從解碼管線到 BMP 落盤細節(jié)再到三類高頻踩坑記錄。適合嵌入式開發(fā)者、圖像算法入門者以及所有想在 C 語言層面徹底搞懂圖片格式的人。新手能照步驟跑通熟手可以跳過基礎(chǔ)部分直接看邊界和參數(shù)坑。2. 拆開這份轉(zhuǎn)換工程文件構(gòu)成與整體管線拿到一份號稱“C 語言實現(xiàn) PNG/JPEG 轉(zhuǎn) BMP”的資源第一件事不是打開 main.c而是把整個目錄結(jié)構(gòu)摸清。源碼包的質(zhì)量從文件組織方式就能看出一大半很多 GitHub 上隨手傳的工程只有一兩個 .c 文件里面塞了上千行裸代碼真要去改一個參數(shù)要翻半天。這份工程屬于能直接動手復(fù)現(xiàn)的類型各個模塊分得比較干凈下面逐個細說。2.1 目錄結(jié)構(gòu)哪些文件是核心哪些是輔助先看整體組織典型的劃分方式是把解碼器、編碼器、公共工具、入口邏輯分開。以下目錄結(jié)構(gòu)是工程里最常見、也最值得保留的一種組織方式converter/ ├── src/ │ ├── main.c # 入口解析命令行參數(shù)調(diào)度轉(zhuǎn)換流程 │ ├── png_decoder.c/h # PNG 解碼IDAT 解壓、濾波反解、顏色轉(zhuǎn)換 │ ├── jpeg_decoder.c/h # JPEG 解碼Huffman 解碼、反量化、逆 DCT │ ├── bmp_writer.c/h # BMP 編碼文件頭、信息頭、像素數(shù)據(jù)落盤 │ └── common.c/h # 公共工具文件讀寫、內(nèi)存分配、錯誤碼定義 ├── test/ │ ├── sample_png/ # 各種 color type 的 PNG 測試圖 │ ├── sample_jpeg/ # 各種抽樣方式的 JPEG 測試圖 │ └── verify.py # 像素級對比腳本 └── Makefile這里最關(guān)鍵的是 png_decoder 和 jpeg_decoder這兩個模塊決定了轉(zhuǎn)換質(zhì)量。main.c 里沒有放任何解碼邏輯只做參數(shù)解析和流程編排這種寫法值得借鑒。很多初學(xué)者寫的轉(zhuǎn)換工具把所有代碼堆在 main 函數(shù)里最后連自己都分不清哪一段是濾波反解、哪一段是顏色空間轉(zhuǎn)換。有幾個工程還帶了進階擴展比如 bmp_writer 里不只有 24 位真彩輸出還留了 8 位調(diào)色板模式的開關(guān)這意味著能把 RGB888 量化成 256 色輸出。這個功能對「嵌入式 LCD 顯示」這個場景非常有用因為很多屏幕只有 8 位或 16 位色深后面我會單獨講調(diào)色板部分怎么驗證。2.2 從文件到像素轉(zhuǎn)換管線的三段式設(shè)計整個系統(tǒng)的核心管線分三段輸入解碼、像素處理、BMP 編碼。先看轉(zhuǎn)換流程圖這個圖在腦中的比寫在紙上的重要因為調(diào)試問題時要靠它定位階段PNG 文件 → PNG 解碼器 → RGB888 像素緩沖 → BMP 編碼器 → BMP 文件 JPEG 文件 → JPEG 解碼器 → RGB888 像素緩沖 → BMP 編碼器 → BMP 文件為什么要統(tǒng)一成 RGB888 中間格式這是處理圖片格式轉(zhuǎn)換的常見做法BMP 只是最終包裝PNG 和 JPEG 解碼出來的數(shù)據(jù)統(tǒng)一轉(zhuǎn)成 RGB888中間層的代碼復(fù)用率最高。如果需要擴展成輸出 PPM、TGA 等其他格式只需要再寫一個編碼器解碼部分完全不用動??创a時優(yōu)先看數(shù)據(jù)流的走向。先打開 png_decoder.c從頭文件里的結(jié)構(gòu)體定義開始看// 解碼輸出的統(tǒng)一像素緩沖結(jié)構(gòu) typedef struct { int width; // 圖像寬度像素為單位 int height; // 圖像高度像素為單位 int channels; // 通道數(shù)3 RGB4 RGBA unsigned char *data; // 像素數(shù)據(jù)按行存儲 } ImageBuffer; // PNG 關(guān)鍵信息結(jié)構(gòu)體 typedef struct { int bit_depth; // 位深8、16 等 int color_type; // 顏色類型0灰度2真彩3索引6真彩alpha int interlace_method; // 0非隔行1Adam7 隔行 int width; int height; } PNGInfo;參數(shù)說明channels 字段非常關(guān)鍵——PNG 的 color type 為 6RGBA時解碼出來有 4 個通道但 BMP 通常落地為 3 通道。這個通道數(shù)變換要在像素處理階段完成而不是在解碼器里改原因是 alpha 通道的取舍策略丟棄還是預(yù)乘應(yīng)該由轉(zhuǎn)換策略決定而不是解碼器自己決定。整個管線的順序是PNG 解碼器負責把壓縮的 IDAT 數(shù)據(jù)還原成帶有濾波信息的原始掃描線然后逐行做濾波反解最后根據(jù) color type 轉(zhuǎn)成 RGB888。JPEG 解碼器則是從熵解碼開始逐步過反量化、逆 DCT、顏色空間轉(zhuǎn)換。兩類解碼器輸出統(tǒng)一格式后BMP 編碼器只管落盤不需要知道數(shù)據(jù)是從 PNG 還是 JPEG 來的。3. PNG 轉(zhuǎn) BMP 的實現(xiàn)拆解從 IDAT 到像素數(shù)組PNG 轉(zhuǎn) BMP 的關(guān)鍵路徑是解析文件頭、解壓 IDAT、處理濾波、轉(zhuǎn)換顏色類型。這里面的難點不在文件頭而在“解壓后怎么處理”。PNG 的像素數(shù)據(jù)走 zlib 壓縮后并不是直接就是 RGB 數(shù)組每一行開頭還帶了一個濾波類型字節(jié)。這一章把整個鏈路走一遍重點落在濾波反解和顏色轉(zhuǎn)換上。3.1 PNG 解碼的關(guān)鍵步驟簽名驗證、IHDR 解析、IDAT 解壓PNG 文件開頭是固定的 8 字節(jié)簽名0x89 P N G \r \n 0x1a \n。代碼里驗證簽名的方式是int png_check_signature(const unsigned char *data, size_t size) { static const unsigned char sig[8] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; if (size 8) return -1; return memcmp(data, sig, 8) 0 ? 0 : -1; }簽名驗證不通過就直接返回“不是 PNG 文件”的錯誤碼。這個看似基礎(chǔ)的檢查實際能過濾掉很多無效輸入我在調(diào)試時遇到過把 JPEG 改名成 .png 傳進來的情況沒有簽名檢查的話后面解碼會直接內(nèi)存越界。簽名之后是 IHDR 塊。IHDR 是第一個關(guān)鍵塊固定 13 字節(jié)數(shù)據(jù)長度包含寬、高、位深、顏色類型、壓縮方法、濾波方法、隔行方法。解析方式和寫在紙上的格式規(guī)范完全對應(yīng)int parse_ihdr(const unsigned char *buf, PNGInfo *info) { info-width (buf[0] 24) | (buf[1] 16) | (buf[2] 8) | buf[3]; info-height (buf[4] 24) | (buf[5] 16) | (buf[6] 8) | buf[7]; info-bit_depth buf[8]; info-color_type buf[9]; // buf[10] 是壓縮方法PNG 規(guī)范里固定為 0 // buf[11] 是濾波方法PNG 規(guī)范里固定為 0 info-interlace_method buf[12]; return 0; }參數(shù)說明寬高都是大端序存儲所以不能直接當小端讀。很多轉(zhuǎn)換代碼在這個地方直接取 buf[0] 作為低字節(jié)遇到寬高大于 255 的圖就翻車。位深和顏色類型要組合起來判斷合法性位深為 8 時支持所有顏色類型位深為 16 時只支持灰度、真彩、真彩alpha——遇到不合法的組合直接拒絕不要試圖去“猜”。解壓 IDAT 是 PNG 解碼的性能瓶頸。zlib 解壓后的數(shù)據(jù)是“原始掃描線 濾波類型字節(jié)”交錯的形式。解壓方式用 zlib 庫是最省事的但如果你要寫的是嵌入式環(huán)境下的轉(zhuǎn)換器用 miniz 是更常見的選擇——miniz 是單文件庫嵌入工程方便API 跟 zlib 兼容#include miniz.h int png_decompress_idat(const unsigned char *compressed, size_t comp_len, unsigned char **raw, size_t *raw_len) { // 用 miniz 的 tinfl_decompress_mem_to_heap 直接解到堆上 mz_ulong estimated comp_len * 4 1024; // 初始估算不夠會自動增長 *raw (unsigned char *)tinfl_decompress_mem_to_heap(compressed, comp_len, (mz_ulong *)raw_len, 0); if (!*raw) return -1; return 0; }邏輯說明這段代碼調(diào)tinfl_decompress_mem_to_heap一次性解出全部數(shù)據(jù)。估算大小不是精確值庫內(nèi)部會處理膨脹的情況但如果你的工程對內(nèi)存敏感可以改成用tinfl_decompress分塊解配合已知的原始大小分配合適緩沖。原始大小怎么算就是每行寬度×通道數(shù)×位深/8 1 個濾波字節(jié)乘以高度前提是知道 color type 對應(yīng)的通道數(shù)——這就是前面 PNGInfo 存在的意義。3.2 濾波反解的五種類型與逐行恢復(fù)算法IDAT 解壓后的數(shù)據(jù)不能直接當像素用。每一行開頭多了一個濾波類型字節(jié)而每一行的像素值是經(jīng)過濾波處理的差分值必須逐行反向處理。這就是 PNG 和 BMP 之間最本質(zhì)的一層差異BMP 存的是絕對像素值PNG 存的是“經(jīng)過濾波后的值”。濾波類型共有五種0 無濾波、1 左側(cè)差分、2 上方差分、3 平均、4 Paeth 預(yù)測?;謴?fù)算法的核心邏輯是逐字節(jié)重建int png_unfilter_line(unsigned char *line, unsigned char *prev_line, int bytes_per_pixel, int line_bytes, int filter_type) { int i; for (i 0; i line_bytes; i) { unsigned char raw line[i]; unsigned char left (i bytes_per_pixel) ? line[i - bytes_per_pixel] : 0; unsigned char up (prev_line) ? prev_line[i] : 0; unsigned char up_left (prev_line i bytes_per_pixel) ? prev_line[i - bytes_per_pixel] : 0; switch (filter_type) { case 0: // 無濾波直接使用不需要修正 break; case 1: // Sub: 原始值 左側(cè)值 line[i] raw left; break; case 2: // Up: 原始值 上方值 line[i] raw up; break; case 3: // Average: 原始值 (左 上) / 2 line[i] raw ((left up) 1); // 注意是除以 2 后向下取整 break; case 4: { // Paeth: 原始值 左/上/左上三者間的預(yù)測值 int p left up - up_left; int pa abs(p - left); int pb abs(p - up); int pc abs(p - up_left); unsigned char predictor; if (pa pb pa pc) predictor left; else if (pb pc) predictor up; else predictor up_left; line[i] raw predictor; break; } } } return 0; }邏輯說明注意循環(huán)的順序必須從左到右逐字節(jié)處理。Sub 濾波里后面的字節(jié)依賴前面已經(jīng)恢復(fù)的字節(jié)如果先處理右邊就全錯了。Up 和 Average 依賴上一行的對應(yīng)位置所以必須按行從上到下處理絕不能并行。Paeth 的預(yù)測值選擇規(guī)則是取左邊、上方、左上三者中與“左上-左上”預(yù)測值最接近的那個。參數(shù)說明bytes_per_pixel不是固定值它取決于 color type——灰度 1 字節(jié)、真彩 3 字節(jié)、真彩alpha 4 字節(jié)。8 位索引色也是 1 字節(jié)。16 位深度時每個通道占 2 字節(jié)bytes_per_pixel 要翻倍。這個參數(shù)錯了濾波反解出來的圖像會出現(xiàn)“像素錯位 偏色”的混合癥狀這是最常見的翻車現(xiàn)場之一。濾波處理完后如果原圖是非隔行的此時數(shù)據(jù)已經(jīng)是完整的圖像像素。但很多測試圖用的是 Adam7 隔行編碼解出來的數(shù)據(jù)是 7 個不完整的子圖必須先合成再繼續(xù)。合成方式是按 Adam7 的 7 個 pass把每個 pass 的像素放到最終位置代碼里維護一個 8x8 的偏移表7 個 pass 覆蓋 64 個位置。不少轉(zhuǎn)換器直接不支持隔行 PNG報一個“不支持的隔行模式”錯誤就退出。從工程角度對不支持的功能直接報錯比輸出花屏要好得多。3.3 顏色類型轉(zhuǎn)換灰度、索引色、RGBA 統(tǒng)一成 RGB888PNG 的 color type 為 2真彩時濾波后的數(shù)據(jù)就是 RGB888直接拷貝到 ImageBuffer 即可。但灰度type 0、索引色type 3、真彩alphatype 6都要額外處理?;叶茸詈唵蚊總€像素的 RGB灰度值。索引色要查 PLTE 塊先解析調(diào)色板// 解析 PLTE 塊最多 256 項每項 3 字節(jié) (R,G,B) int parse_plte(const unsigned char *data, size_t len, unsigned char palette[][3]) { if (len % 3 ! 0) return -1; int count len / 3; if (count 256) count 256; for (int i 0; i count; i) { palette[i][0] data[i * 3]; palette[i][1] data[i * 3 1]; palette[i][2] data[i * 3 2]; } return count; } // 索引色轉(zhuǎn) RGB888 void indexed_to_rgb(const unsigned char *src, unsigned char *dst, int pixel_count, const unsigned char palette[][3]) { for (int i 0; i pixel_count; i) { unsigned char idx src[i]; dst[i * 3] palette[idx][0]; dst[i * 3 1] palette[idx][1]; dst[i * 3 2] palette[idx][2]; } }RGBA 轉(zhuǎn) RGB 的處理方式在轉(zhuǎn)換策略上有分歧。直接丟棄 alpha 是最簡單的做法但如果原圖帶有透明背景丟掉 alpha 后透明區(qū)域的 RGB 值可能是任意值常見是黑或白轉(zhuǎn)出來的 BMP 會有一個黑色或白色的底。處理時先看 PLTE 和 tRNS 塊有沒有指定透明色再看 alpha 通道的值至少要把 alpha0 的像素 RGB 值統(tǒng)一設(shè)置成白色后續(xù)如果要嵌到其他場景里再合成這樣做翻車概率小一些void rgba_to_rgb(const unsigned char *src, unsigned char *dst, int pixel_count) { for (int i 0; i pixel_count; i) { unsigned char r src[i * 4]; unsigned char g src[i * 4 1]; unsigned char b src[i * 4 2]; unsigned char a src[i * 4 3]; if (a 0) { // 全透明像素RGB 置為白色避免出現(xiàn)隨機黑點 dst[i * 3] dst[i * 3 1] dst[i * 3 2] 0xFF; } else { dst[i * 3] r; dst[i * 3 1] g; dst[i * 3 2] b; } } }邏輯說明嚴格來說如果 alpha 是 0 到 255 之間的半透明值正確的做法是把 RGB 跟背景色做 alpha 混合。但大多數(shù)圖片格式轉(zhuǎn)換工具對半透明的策略就是“丟掉 alpha 信息保留未預(yù)乘的 RGB”這一點要在代碼注釋里寫明。半透明區(qū)域的 RGB 值在 PNG 里的定義是“未預(yù)乘的顏色”丟掉 alpha 后顏色會偏亮或偏暗這是 PNG 轉(zhuǎn) BMP 的一個固有信息損失不是 bug。4. JPEG 轉(zhuǎn) BMP 的實現(xiàn)拆解Huffman 解碼與 DCT 的完整鏈路JPEG 轉(zhuǎn) BMP 比 PNG 要復(fù)雜一個量級。PNG 的復(fù)雜度在線性濾波JPEG 的復(fù)雜度在熵解碼之后的非線性環(huán)節(jié)Huffman 解碼、差分 DC、Zigzag 掃描、反量化、逆 DCT、YCbCr 轉(zhuǎn) RGB、色度上采樣。任何一個環(huán)節(jié)錯了輸出圖不是整體偏色就是出現(xiàn) 8x8 的塊狀噪聲。這一章不搞簡化版按完整解碼鏈路走你可以對照自己手里的工程逐段檢查。4.1 從文件頭到量化表SOI、DQT、DHT 的解析順序JPEG 文件由段Segment組成。解析的基本模式是掃描標記Marker根據(jù)標記類型分發(fā)到不同的處理函數(shù)。以下是常見標記的說明標記名稱說明0xD8SOI文件起始固定出現(xiàn)在開頭0xE0~0xEFAPPn應(yīng)用數(shù)據(jù)段常見為 JFIF 信息0xDBDQT定義量化表至少要有一個0xC0SOF0幀起始包含寬高等關(guān)鍵信息0xC4DHT定義 Huffman 表0xDASOS掃描起始圖像數(shù)據(jù)從這里開始0xD9EOI文件結(jié)束JPEG 規(guī)定量化表和 Huffman 表必須先于 SOS 出現(xiàn)但 DHT 可以拆成多段分別定義。寫解析器時要注意不能假設(shè)所有表在一個段里就給齊了。解碼器的狀態(tài)機按“讀標記→讀段長→分發(fā)”循環(huán)這是整個 JPEG 解碼器的基礎(chǔ)骨架。量化表的解析要注意的一個細節(jié)是表 ID 和精度打包在一個字節(jié)里。高 4 位是精度08 位116 位低 4 位是表 ID。解碼時要分別取出來int parse_dqt(const unsigned char *buf, int len, QuantTable tables[4]) { int offset 0; while (offset len) { int pq buf[offset] 4; // 精度08bit116bit int tq buf[offset] 0x0F; // 表 ID0~3 offset; if (pq 0) { for (int i 0; i 64; i) { tables[tq].values[i] buf[offset i]; } offset 64; } else { // 16 位量化表每個值占 2 字節(jié)大端序 for (int i 0; i 64; i) { tables[tq].values[i] (buf[offset i * 2] 8) | buf[offset i * 2 1]; } offset 128; } } return 0; }參數(shù)說明JPEG 量化表是自然序而非 Zigzag 序在反量化之前要先把系數(shù)恢復(fù)到 8x8 的自然位置。這個問題我在初寫時踩過不熟悉編碼規(guī)范的話容易直接把量化表當 Zigzag 序用行頻和列頻就顛倒了。解決方式是在反量化前重排 Zigzag 序。4.2 熵解碼與逆 DCTDC 差分累積、Zigzag 重排、IDCT 公式JPEG 的核心是離散余弦變換DCT。編碼時把圖像分成 8x8 塊每個塊做 DCT 變換得到 64 個頻域系數(shù)再對系數(shù)量化和熵編碼。解碼時流程倒過來先熵解碼得到 64 個系數(shù)然后反量化再做逆 DCT 得到像素塊。這里的系數(shù)排列是 Zigzag 序做 IDCT 前要重排static const unsigned char zigzag[64] { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; // 反量化 Zigzag 重排 void dequantize_block(const int *coeff_zz, const QuantTable *qtable, int coeff_natural[64]) { for (int i 0; i 64; i) { int natural_idx zigzag[i]; coeff_natural[zigzag[i]] coeff_zz[i] * qtable-values[zigzag[i]]; } }邏輯說明coeff_zz是從熵解碼器出來的系數(shù)按 Zigzag 序號排列重排到自然序后行號 idx / 8列號 idx % 8這個順序才能喂給逆 DCT 函數(shù)。DC 系數(shù)是差分編碼的——當前塊的 DC 值要加上上一個塊的值才是真正的 DC。這是 JPEG 解碼器和 PNG 濾波反解中“逐行必須串行”相似的約束但是按塊串行int prev_dc[4] {0, 0, 0, 0}; // 最多 4 個分量 // 每處理完一個塊后 prev_dc[component] diff_dc;這個 prev_dc 數(shù)組要按分量分開維護不能用一個全局變量。Y、Cb、Cr 各自的 DC 預(yù)測器是獨立的混在一起會出現(xiàn)深色圖像上出現(xiàn)橫向漸變的條紋。逆 DCT 的整數(shù)實現(xiàn)有很多種浮點版本最簡單也最不容易出錯。如果性能有要求可以用 AAN 整數(shù)近似算法但精度不如浮點void idct_8x8(const int block[64], unsigned char out[64]) { double tmp[64]; for (int u 0; u 8; u) { for (int v 0; v 8; v) { double sum 0.0; for (int x 0; x 8; x) { for (int y 0; y 8; y) { double cu (x 0) ? 0.7071067811865476 : 1.0; double cv (y 0) ? 0.7071067811865476 : 1.0; sum block[x * 8 y] * cu * cv * cos((2 * x 1) * u * M_PI / 16.0) * cos((2 * y 1) * v * M_PI / 16.0); } } tmp[u * 8 v] 0.25 * sum; } } for (int i 0; i 64; i) { int val (int)(tmp[i] 128.5); out[i] (unsigned char)(val 0 ? 0 : (val 255 ? 255 : val)); } }邏輯說明這個雙重循環(huán)沒有做任何優(yōu)化但正確性有保證。輸出要加 128 的偏移量因為 DCT 變換假設(shè)輸入范圍是 [-128, 127]輸出要轉(zhuǎn)回 [0, 255]。0.5是做四舍五入而不是截斷不加的話會出現(xiàn)整體偏暗的一致性問題。4.3 色度抽樣與顏色空間4:2:0 上采樣和 YCbCr 轉(zhuǎn) RGBJPEG 最坑的地方是色度抽樣。大多數(shù) JPEG 圖像用 4:2:0 抽樣——亮度 Y 每個像素都有色度 Cb、Cr 每 2x2 像素塊共享一個值。解碼時必須先把 Cb、Cr 向上采樣到和 Y 同尺寸再做顏色轉(zhuǎn)換。void upsample_chroma(const unsigned char *cb_small, const unsigned char *cr_small, unsigned char *cb_big, unsigned char *cr_big, int width_big, int height_big, int h_scale, int v_scale) { for (int y 0; y height_big; y) { int sy y / v_scale; for (int x 0; x width_big; x) { int sx x / h_scale; cb_big[y * width_big x] cb_small[sy * (width_big / h_scale) sx]; cr_big[y * width_big x] cr_small[sy * (width_big / h_scale) sx]; } } }邏輯說明最簡單的最近鄰上采樣。效果可以接受但有些工程會做雙線性插值抗鋸齒效果更好。上采樣維度計算要嚴格按 h_scale 和 v_scale 來4:2:0 時 h_scale2v_scale2色度平面寬高各減半4:2:2 時 h_scale2v_scale1 只有寬度減半。如果從 SOF0 里拿到的是“1x1、2x1、1x2、2x2”這類抽樣因子而非直接寬高要做映射判斷// SOF0 里每個分量的抽樣因子 unsigned char h_sampling sof_data[comp_index * 3 1] 4; unsigned char v_sampling sof_data[comp_index * 3 1] 0x0F; // 寬高由 Y 分量決定色度分量的實際尺寸按采樣因子換算YCbCr 轉(zhuǎn) RGB 的公式在工程里寫死了但注意 JPEG 的 YCbCr 是 ITU-R BT.601 范圍不同于 JPEG 編碼時的全范圍。轉(zhuǎn)換公式// 輸入: Y 范圍 [0,255], Cb/Cr 范圍 [0,255] (未做 128 偏移) // 輸出: RGB 范圍 [0,255]需要做裁減以防止越界 int r (int)(Y 1.402 * (Cr - 128)); int g (int)(Y - 0.344136 * (Cb - 128) - 0.714136 * (Cr - 128)); int b (int)(Y 1.772 * (Cb - 128));邏輯說明Cb 和 Cr 在熵解碼后是帶符號的數(shù)值范圍轉(zhuǎn)為無符號時要加上 128 的偏移。如果不做偏移顏色會變成一種“負片色調(diào)”這是 JPEG 轉(zhuǎn) BMP 最容易肉眼發(fā)現(xiàn)的問題之一。轉(zhuǎn)換后的 RGB 要做 0~255 限幅因為逆 DCT 的浮點誤差和色度上采樣的插值會算出越界值。碰到底部有 SOS 段卻拿不到 DHT 表的情況說明源 JPEG 用了“一次性 Huffman 表”的特殊編碼方式把表放在 SOS 之后。這種情況現(xiàn)實中很少見但部分相機直出的 JPEG 會這么干。真遇到了解碼器不能原地崩潰要返回一個“不支持的 JPEG 變體”錯誤并注明原因——這里用 Haffman 表延遲解析的工程極少普通轉(zhuǎn)換場景直接拒絕問題不大。5. 轉(zhuǎn)換避坑指南最值得記下的五條實測踩坑記錄這一章是實際調(diào)試中反復(fù)遇到的經(jīng)典問題從“花屏”到“錯位”到“偏色”每條都帶具體原因和解決方法。如果你拿到的轉(zhuǎn)換工程有問題按這個清單逐個排查。5.1 BMP 文件打不開文件頭長度和像素偏移算錯現(xiàn)象生成的 BMP 能被圖片查看器識別但提示“文件損壞”或“不支持該格式”。用十六進制工具看文件頭部發(fā)現(xiàn) bfOffBits 和實際像素數(shù)據(jù)起始位置對不上。原因BMP 文件頭寫入了標準 14 字節(jié) BITMAPFILEHEADER 加 40 字節(jié) BITMAPINFOHEADER但沒有考慮調(diào)色板的存在。如果輸出為 8 位索引色像素數(shù)據(jù)前面還有 1024 字節(jié)的調(diào)色板數(shù)據(jù)bfOffBits 應(yīng)該是 14 40 1024 1078而不是默認的 54。解決寫 BMP 頭之前先確認輸出位深和是否帶調(diào)色板bfOffBits 按實際數(shù)據(jù)布局計算。注意 biSizeImage 字段也要同步修正否則某些嚴格校驗的查看器如部分嵌入式的解碼庫會提前截斷。文件大小 bfSize bfOffBits biSizeImage這三處數(shù)值必須自洽。5.2 圖像行錯位行字節(jié)數(shù)沒有按 4 字節(jié)對齊現(xiàn)象轉(zhuǎn)換出來的 BMP 整體向左傾斜每一行圖相對于上一行偏移了幾個像素而且偏移量隨行號遞增。用查看器打開時能隱約認出畫面內(nèi)容但整幅圖呈“階梯形”。原因BMP 規(guī)定每行的字節(jié)數(shù)必須是 4 的倍數(shù)。假設(shè)寬度為 101 像素、24 位真彩101 × 3 303 字節(jié)303 不是 4 的倍數(shù)需要補齊到 304 字節(jié)補 1 個 0x00。如果你的代碼直接按“兩字節(jié)對齊甚至不對齊”寫入BMP 讀取器每一行都會從錯誤的位置讀下一行階梯形就是這樣產(chǎn)生的。解決在寫入每一行像素后計算需要補齊的字節(jié)數(shù)用 0x00 填充。經(jīng)驗公式rowSize ((width × bytesPerPixel 3) / 4) × 4行間隔 rowSize - width × bytesPerPixel。驗證時輸出一組已知像素值如第一行全部像素設(shè)為紅色看偏移是否消除。5.3 JPEG 圖像整體發(fā)綠YCbCr 偏移量沒加現(xiàn)象圖像內(nèi)容能看清輪廓但整體色調(diào)嚴重偏綠膚色變成了奇怪的顏色暗部有一層綠色底色。原因YCbCr 轉(zhuǎn) RGB 時漏了把 Cb、Cr 減去 128。JPEG 中 Cb、Cr 是“零中心”的128 對應(yīng)零偏置不減去 128 相當于色度信號整體偏移轉(zhuǎn)換后 G 通道被抬高因為 G 的公式里 Cb、Cr 是減項引發(fā)偏綠。紅色的物體往往會變暗藍色的物體變黑整個色調(diào)都亂了。解決轉(zhuǎn) RGB 前確認 Cb、Cr 都減了 128。如果庫函數(shù)里已經(jīng)有這個處理檢查是不是重復(fù)減了兩次——有些工程從熵解碼器拿到的 Cb、Cr 已經(jīng)做了偏移處理再減一次會變成反向偏移同樣產(chǎn)生偏色問題。驗證方式找一張色卡圖或標準測試圖轉(zhuǎn)換后取幾個已知色塊的 RGB 值跟原圖對比。5.4 PNG 隔行掃描圖轉(zhuǎn)換出來后只有部分區(qū)域有內(nèi)容現(xiàn)象轉(zhuǎn)換結(jié)果是 8x8 的“方格拼圖”看起來像采樣率降低部分區(qū)域有內(nèi)容部分區(qū)域是空白。改換另一個非隔行的 PNG 測試圖時一切正常。原因解碼器只處理了 7 個 pass 中的部分數(shù)據(jù)。Adam7 隔行把圖像拆成 7 個 pass每個 pass 是原圖在特定行列位置的子采樣。如果代碼把 7 個 pass 的數(shù)據(jù)當作 7 張獨立圖像拼接或重疊寫入結(jié)果就變成拼圖效果。解決正確實現(xiàn) Adam7 合成。每個 pass 都有各自的行列起始位置和步長需要按 pass 序號查表確定寫入目標位置。如果不支持隔行掃描正確做法是掃描 IHDR 的 interlace 字段當值為 1 時直接返回“暫不支持 Adam7 隔行”而不是輸出錯誤結(jié)果。大多數(shù)工具類轉(zhuǎn)換器不支持隔行是可以接受的但要明確告知用戶。5.5 JPEG 解碼出現(xiàn) 8x8 的塊狀噪聲現(xiàn)象圖像整體能識別但所有 8x8 像素塊之間有明顯亮度差異看起來像“馬賽克”特別是平坦區(qū)域如天空、純色背景邊界非常明顯。原因逆 DCT 的精度不夠或者反量化之后忘了做 IDCT、直接拿頻域系數(shù)當像素值。還有種可能是 Zigzag 重排錯誤導(dǎo)致 DCT 系數(shù)位置顛倒。低頻系數(shù)放錯位置會影響整體亮度高頻系數(shù)放錯位置會出現(xiàn)顆粒狀紋理。解決逐段檢查解碼管線。最有效的定位方式是把 IDCT 后的數(shù)據(jù)暫時輸出成文件肉眼觀察塊效應(yīng)是否存在如果 IDCT 后正常、BMP 寫入后出現(xiàn)塊效應(yīng)問題在 BMP 寫入環(huán)節(jié)的字節(jié)序如果 IDCT 后就有塊效應(yīng)檢查 Zigzag 重排表和量化表的使用順序。6. 進階驗證方法像素級對比腳本與調(diào)色板位深擴展這一章講兩個價值點怎么驗證轉(zhuǎn)換結(jié)果是否真正正確以及怎么把轉(zhuǎn)換器擴展到 8 位調(diào)色板 BMP。前幾章解決了“能轉(zhuǎn)”的問題這一章解決“轉(zhuǎn)得對”和“轉(zhuǎn)得更實用”的問題。6.1 像素級自動對比PSNR 和 MAE 校驗?zāi)_本人眼盯著圖看容易漏掉細節(jié)差異特別是 JPEG 轉(zhuǎn) BMP 這種有損轉(zhuǎn)換如果解碼器有輕微精度損失人眼很難分辨但像素級對比能立刻暴露問題。Python 腳本適合做這件事——C 的轉(zhuǎn)換器產(chǎn)生 BMPPython 用 Pillow 庫打開原圖和轉(zhuǎn)換結(jié)果逐像素對比并計算 PSNR峰值信噪比from PIL import Image import math def compare_images(src_path, dst_path): src Image.open(src_path).convert(RGB) dst Image.open(dst_path).convert(RGB) if src.size ! dst.size: print(f尺寸不一致: {src.size} vs {dst.size}) return src_pixels list(src.getdata()) dst_pixels list(dst.getdata()) mse 0 max_diff 0 for p1, p2 in zip(src_pixels, dst_pixels): d sum((a - b) ** 2 for a, b in zip(p1, p2)) mse d max_diff max(max_diff, max(abs(a - b) for a, b in zip(p1, p2))) mse / (len(src_pixels) * 3) psnr 10 * math.log10((255 ** 2) / mse) if mse 0 else float(inf) print(fMSE: {mse:.4f}, PSNR: {psnr:.2f} dB, 單像素最大差: {max_diff})參數(shù)說明PSNR 值大于 40dB 表示差異非常小30~40dB 基本可接受但可能有輕微色差低于 30dB 意味著解碼器有實質(zhì)性錯誤。max_diff能捕捉極端情況——比如某個像素差 100 以上說明在某個顏色通道上處理邏輯有問題。這個腳本的價值在調(diào) JPEG 解碼器時特別明顯。JPEG 是有損格式不能要求轉(zhuǎn)換結(jié)果和原圖像素級一致但 PSNR 穩(wěn)定在 40dB 以上用高質(zhì)量原圖測試說明解碼器的精度損失只是量化和浮點運算帶來的沒有結(jié)構(gòu)性錯誤。如果 PSNR 在 25dB 以下基本可以斷定解碼鏈路里有 bug按前面的避坑清單逐項排查。6.2 調(diào)色板模式與位深擴展從 24 位真彩到 8 位索引色真彩 BMP 文件體積大嵌入式場景常需要 8 位索引色 BMP。從 RGB888 量化到 256 色的方式直接用中位切分算法Median Cut或八叉樹量化。中位切分更適合從零實現(xiàn)// 中位切分量化把 RGB 空間遞歸劃分成 256 個桶 typedef struct { int r_min, r_max, g_min, g_max, b_min, b_max; int pixel_count; unsigned char r_avg, g_avg, b_avg; } ColorBox; int build_palette(unsigned char *pixels, int pixel_count, unsigned char palette[256][3]) { ColorBox boxes[256]; // 初始化一個覆蓋全部像素的 box按 RGB 范圍做遞歸切分 // 每次選像素數(shù)最多、顏色范圍最大的 box沿最長的通道切 // 最終每個 box 的平均 RGB 作為調(diào)色板項 return 0; // 返回實際使用的顏色數(shù) }邏輯說明中位切分的本質(zhì)是每次選一個 box找到“像素數(shù)最多”或“顏色范圍最大”的那個沿范圍最長的顏色通道切成兩個 box直到湊滿 256 個。處理上要注意一個細節(jié)統(tǒng)計像素顏色時用桶化將 8 位通道降到 5 位左右能顯著加快速度代價是輕微的色彩精度損失。調(diào)色板構(gòu)建后每個像素取“距離最近”的調(diào)色板項距離可以按歐氏距離或帶權(quán)重的距離計算——人眼對綠色更敏感可以給 G 通道高權(quán)重。寫 8 位 BMP 時文件布局變?yōu)?4 字節(jié)文件頭 40 字節(jié)信息頭 1024 字節(jié)調(diào)色板 像素索引數(shù)組。biBitCount 設(shè)為 8biClrUsed 設(shè)為 256。像素數(shù)據(jù)不是 RGB 三元組而是每個字節(jié)一個調(diào)色板索引。如果轉(zhuǎn)換器不支持調(diào)色板量化正確做法是明確返回“僅支持 24 位真彩輸出”而不是自動降級成灰度或截斷數(shù)據(jù)。這也是工程邊界管理的一部分——明確不做什么比硬做但做錯要好得多。從那以后我每次寫格式轉(zhuǎn)換工具都會強制在工程里放一個 test 目錄和一個像素級校驗?zāi)_本。原圖、中間結(jié)果、最終輸出三者的像素數(shù)據(jù)隨時可對比比對通過才算功能完成。否則在 JPEG 解碼器里改一個 Zigzag 表改完到底對不對不跑像素級對比是很難判斷的。這份工程的代碼組織方式和解碼細節(jié)可以作為你手頭轉(zhuǎn)換需求的起點——但它不是銀彈遇到特殊變體的圖片色彩配置 ICC、16 位 PNG、漸進式 JPEG還是要回來補解碼器邊界。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美夜夜狠| 岛国福利在线精品播放| 亚州情色j区| 国产绿奴视频在线观看| 亚洲精品九九九| 91欧美www| 亚洲日韩青青草色月| 久久国内| 天天干夜夜操网| 91人精品妻入口| julia国产在线 | 激情小说亚洲色图| 少妇蹲下买菜露大唇0| 75大香蕉| 久久动漫精品视频这里只有精品| 亚洲 欧美 中文 日韩超碰 | 97se亚洲综合自| 97资源免费视频| 色综合91| 欧美性爱超碰97| 91骚妇| 免费视频在线观看啊啊啊啊啊| 天天色,天天干,天天干| 乱欲一区二区| 免费av大片| 国产探花精品在线| 成人三一级一片aaa| 眼镜人妻101.com| 精品九九国产无码| 5278欧美一区二区三区| 三级三级三级日本99| 日日操丁香五月天| 98一区二区精品| 久悠悠av| 嗯嗯啊啊视频一区二区三区| 久久中文色图| 欧美精品久久| 玖玖无码超碰| 九九亚洲| 久久黄色视频一区二区三区| 国产69精品久久久久99尤物| 久久久久国产一区二| 黄片免费看黄片免费看| 人妻天天操天天爽视频免费 | 日韩本不卡视频在线观看 | 超碰久久综合| av资源在线播放天堂| 五月色网| 欧洲综合视频| 欧美熟妇亚洲版| 午夜毛片高清免费不卡| 久久9精品网站| 欧美综合色图片| 国产熟女无套内射| 不卡av在线中文字幕| 93人人操人人| 韩日精品四区| 色欧美在线| 九九九九免费| 欧美精品成人在线播放| 丰满的三级少妇欧美久久久| 九九九九88| 操逼999| 亚州欧美在线| 偷拍三区| 狠狠综合网| 天天看人人操屄犊摸阴| 亚洲色图片区| 美女熟妇色| 黄色性爱网网| 国产极品久久久| 黑人粗大V S日韩女优视频| 91狠狠综合久久| 欧美性xxxxx狂欢| av天堂手机版追回 | 91热色| 操狠狠| 国产精品高潮久久AV| 蜜臀在线看片| 国产精品99精品视频网站| 久久人人舔人人爽舔人人av片| 女人爽到高潮潮喷18禁网站 | 日韩av电影成人在线| 欧美成人一区二区三区在线播放| 神马久久网| 99999亚洲另类| 天天看天天干| 丁香五月激情综合| 超碰偷拍| 亚洲国产欧美中文永久| 欧美天堂超碰97| 欧美性爱超碰97| 日本五十路熟女一区二区| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产少妇与亚洲av| 欧亚韩国999| 日本爽爽爽爽爽爽免费视频| 日韩99999色| 亚洲欧美在线丝袜| 亚洲综合色婷婷| 九九九精品一区二区无码| 韩国一级做a久久久久| 黄片www.| 岛国不卡超碰护士AV在线播放| 午夜AV人气不卡| 九九久久国产精品怡红院| 国产精品久久久久999| 69视频入口| 探花精品视频| 男人的天堂Va| 精精夜夜| 视频黄色国产一级| 国产精品久久久久999| 亚洲最新Av| 人妻啊啊人妻啊| 精品国产乱码久久久久久久久久毛片| 性爱av在线免费观看| 制服中出中文人人精品| 十八岁啪啪视频免费看| 日日噜噜夜夜久久亚洲一区二区| 在线无码网站| 综合九九| 亚洲宅男天堂| 家庭乱伦麻豆| a人欧美综合天堂麻豆| 91视频伊人| 97精品国产手机| wwwxxx日本爽| 亚洲清纯综合| 中文久久一区| 亚洲欧洲精品视频发布| 成人小电影网站tex| 91粉嫩萝控精品福利网站_精品影音先锋国 | 啊啊啊不要好爽日韩无码一区| а√天堂资源官网在线资源| 欧美曰韩国产精品| 高清国产av无码| 97欧美综合| 97人肏| 最新av网站在线观看| 亚洲欧美国产va在线| 久久6热视频免费观看| 久久久九九| 无码 有码 国产18p| 男人天堂东京热| 日韩AV电影网站| 欧美日韩黄片精品在线| 超碰97极品9| www鬼畜国产男人的天堂| 一级黄色性爱裸体视频| 2026国产精品视频| 丁香六月婷婷| 性饥渴少妇av无码毛片| 欧美精品,四区。五区| 久久五月综合| 不卡中文字幕aⅴ在线| 亚洲欧美日韩电影网站一区 | 免费精品99| 秋霞色色影院| 老鸭窝日丰县女人| 91N五十路| AV一起草在线| 一本久道久久综合狠狠爱一密臀精| 黄色污污污污污污网站| 丁香五月婷婷基地| 99老司机精品视频在线观看| 亚洲不雅视频1区二区| av亚洲天堂资源网站| 亚洲中文日韩精品| 精品久久久久av影院| 中日韓欧美高清| 天天天堂影视日韩亚洲91| 天天看综合网| 久久99综合| 操逼免费视频无码国产| 色综合加勒比| 人人操人人操人妻人| 日本一天色道久久久精品视频| 亚洲国产一区二区三区四区国产| 国产精品嫩草久久久久| 少妇久久久久久| 国产嫩草精品A88AV| 伊人一区二区三区| 91艹逼精品| 九九热精品在线| 国产97视频免费观看| 国产视频人人网| 亚州性9| 蜜桃网熟妇| 欧美91精彩| 涩爱AV在线| 99这里只有精品| 国产精选三级在线观看| 插穴性爱视频在线观看| 欧洲欧美视频一区二区| 色操逼网| 黄色人人| 天天操夜夜嗨| 亚洲成人av电影在线| 成年人黄色视频免费| 欧美97爱| 亚洲春色欧美激情自拍| 亚洲精品性爱片| 12一15性XXXX粉嫩国产| 国产午夜在线观看视频| 国产野战露脸在线播放| 青娱乐亚洲自拍| 欧美日韩操逼动图| 在线精品福利免费播放| 久久婷婷热| 国产AV超爽| www.色操逼| 另类一区| 久草成人福利导航| 台湾肥佬网一区二区三区| 色盈盈影院| 中国黑人三级片网站上区| 激情综合av| 亚州高清色综合| 很很很很操| 久操影视| 精品久久久久久久| 91丨国产丨白浆秘 洗澡动漫| 91丨人妻丨国产丨丝袜| 岛国黄片网站| 欧美性爱视频免费一区一A| 乱伦日本色图AⅤ| 欧美亚洲中文字幕| A啊啊在线观看| 美女网站黄页| 肉动漫无遮挡h在线观看| 国产主播福利| 精品v日韩欧美国产| 超碰九色| 裸体1区| 色97欧美| 人人看黄色视频| 亚洲欧综合另类无码一区| 在线精品福利免费播放| 天天看少妇| 色欲人妻一区二区在线| 蜜臀99久久精品久久久久久| 私人尤物在线精品不卡| 一区二区三区四区免费视频| 亚洲天堂电影精品一区| 亚洲资源网| 蜜臀99久| 男人高清无码一区二区| 99热在线播放| 亚洲色悠悠久久88| 2021国产成人精品久久| 一区三区啪啪| 欧美大香蕉97| 亚洲一区二区av| 岛国免费黄色网址| 大胆91| 色婷婷一区二区三区久久午夜| 91丝袜在线播放| 国产传媒午夜理伦精品| 麻豆久久久一区二区| 夜草欧美| 又大又长又粗又爽又黄| 久久日韩毛| 色呦色呦色精品| av影片在线观看不卡| 日韩免费看黄片| 丝袜综合色图| 不卡在线观看视频| 六月丁香网| 超碰久在线天天做| 日韩欧美大力操| 夜夜中出国产| 国产精品久久久久9999小说| 蜜乳av首页| 久久久草草精品| 内射小黄片| 青青操青娱乐| 亚洲97精品| 五月天成人综合| 天天舔日美女视频| 丁香五月久久| 欧美亚洲天天| 亚洲,欧美,春色,另类| 青青草华人在线欧美在线| 亚洲,日韩,欧美,成人播放| 亚洲欧洲美腿丝袜| 操一操摸一摸| 91久久久久久久久久久| …亚洲黄色厕厕女女在线播…| 国产一区二区在线电影| 97天天在线| 高清国产成人无码| 超碰久久精品| 日本熟妇人妻中出视频| 亚州色综合| 激情五月天婷婷| 国产乱子伦一区二区三区在线观看| 九九热九九| 97中文字幕九区| 99热99在线| 亚洲日韩电影| 天天日天天射天天干| 国产乱伦搜索结果91P| 中文字幕丝袜人妻| 能在线播放的国产三级| 玖玖综合视频| 欧美AB在线观看| 日本精品一级二级三级| 久久女同性恋一二区| 综合免费无码中文| 亚洲欧洲日韩中文字幕一区| 日韩天堂av电影在线观看| 青娱乐999| 丰满少妇高潮无码| 人妻中文字幕日韩电影| 青青草久草| 人人操天天爽| 中文自拍欧美影视| 东北熟女91| 二区熟妇韩日| av无码精品久久久久| 99re99在线视频| 亚洲春色激情小说| AAAAAAAAA黄片| 国产精品69久久久久孕妇欧美| 九九色热| 国产美女裸体秘 永久无遮挡| www被窝色com| 九九视品黄色| 亚洲欧美国产其他二区| 人人操欧美风骚| 国产一区二区久久| 超碰97资源大奶| 天天色播亚洲综合网站| 午夜国产综合视频在线观看| 大香蕉99re| 91麻豆天美传媒HD| 中文字幕在线高清男人的天堂| 91天美| 欧美日韩97在线| juliaann精品熟女一区| 99操| 欧美日韩操逼嗦吊| 欧洲亚洲国产综合在线| 午夜九九九九九九| 99精品综合久久久久五月天| 日韩人妻精品中文字幕| 丝袜狠狠草尤物人妻av91| 凸凹视频在线观看| α√在线| 丰满人妻一区二区三区性色| 国产精品福利视频| 综合色91| 色97欧美| 欧美高清91| 久久人妻一区二区三区高清| 亚洲日韩久久精品一区| 国产精品久久久久久久久久久久久久久久久久| 亚洲 日韩 欧美 国产综合体| 日韩三A大片在线观看| 亚洲色电影在线| 亚洲男人天堂2| 欧美色图 人妻| 中文有码第五页| 日韩女优在线| 国产怡红院| 久久精品国产精品亚洲艾通辽熟妇| 日本性爱不卡视频| 91丨熟女丨丰满熟女| 操操吧亚洲乱伦视频| 天天干天天舔| 大屁股人妻女教师撅着屁股| 亚洲综合91| 春色91| 人妻激情视频| 国产一区二区精品久久久不卡蜜臀| 亚洲素人网| 国产性爱欧美性爱在线| 精品女同一区| 一区二区三区一亚洲中文字幕、综合区灬| 狠狠爱夜夜干| 91少妇高潮| 男人的天堂com| 九九九九九九综合| 老鸭窝成人免费毛片视频| 97久久久久| 欧美色综合网| 久久久久97| 大香蕉一级黄色片久久| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲在饯| 午夜男女爽爽大片免费观看| 免费久久一级毛片大黄| 国产精品久久久久久久毛片1| 中国乱伦一区二区| 天天爽天天操| av情色影音| 久久鲁夜| 999久久芭蕾| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 色偷综合| 日韩成人小视频| 日韩欧美传媒一区国产| 午夜超爽| 欧美性爱五月天| 800zy一区二区| 91精品成人| 风月影院男女十八禁| 久草老司机| 啪啪自拍九九综合| 成人精品一区二区91毛片不卡| 美女操逼福利视频| 日本在线一二 | 久久视频,这里只有精品 | 岛国黄色短视频| 精品性爱无码在线播放| 岛国小电影| 欧洲亚洲综合| 日本不卡二区| 99久久精品国产高潮| 猛交交| 亚洲综合性网址| 欧美成人精品一区| 日韩一级片在线看| 人妻无码后入| 久久老熟女| 国产对白刺激视频| 天天舔天天日天天射| 精品少妇人妻一区二区三区| 日本精品一级二级三级| 国产又色又爽又舒服的三级视频 | 激情小说在线视频| 蜜桃av综合网发布| 日日夜夜草草草| 国产久久久久久| 国产区91柔拿会所技师| 久热久一区二区三区| 国产吹潮女在线观看| 天天看天天日| 中日无幕一二三四区| 久久久国产护士丝袜美腿一| 中文字幕一区二区免费在线| 欧美日韩国第一区| 九九亚洲| 色综合99| 亚洲综合伊人无码久久| 少妇滛荡视频| 午夜精品久久久久久久| 精品高清一区二区三区三州| 成人网欧美风情| 久草午夜| 精品99999久久久久久| 日韩日韩日韩-国产乱码精品一区二区| 74成人在线| 男人的天堂.com| 思思热国产高清| 久久99热这里只频精品6学生| 999熟女精品| 日韩色欲久久一二三四区| 国产精品亚洲四五区在线观看| 偷拍盗拍亚洲色图图片| 人妻久久久久久久久久久久久久久| 久久久精品视频欧州站| 精品国产乱码久久久久久口爆网站 | 亚洲色图欧美色图在线播放| 99re国产中文字幕| 五月丁香啪啪网| 亚洲天堂一区二区| 亚洲色啪| 男人的天堂2019| 亚洲情色五月天| 美女天天干| 91偷拍欧美亚洲| 黄色电影在线播放综合网站 | 91精品女厕偷拍视频| 亚洲第一二区另类图| 国产美女自拍AV| 日本九九久久99| 亚洲精品官网在线观看| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场| 亚洲天堂7777| 九t超碰| 国产不卡精品91| 欧美成人A√在线一区二区| 91久久18禁| 在线看片国产精品每日更新| 极品出轨视频网站| 日韩天堂av电影在线观看| 岛国在线国产| 欧美色图99| 蜜臀久久一区二区| 无码人妻精品一区二区中文| 可乐操亚洲蜜911| 欧美色三级片91| 天天色天天干天天爱| 天天大干大香蕉| 日韩人妻大香蕉| 91久久免费视频互動交流| 久偷拍欧美日韩三区| 探花激情视频| 欧美爱三级日韩久久| 少妇免费视频| 欧美性夜| 久久久久久日韩| 国产蜜臀在线| 色妺妺在线视频| 黄片免费视频2019| 97操b| 亚洲宗合电影| 亚洲日韩精品在线播放| 欧美精品三级黄片| 免费的很黄很污的全部视频| 伊人欧美大香蕉视频| 色婷婷综合久久久久中文一区二区 | 自拍视频一区在线观看| 亚洲在线欧美| 久久9999 | 男人天堂综合| 久久久久13| 国产三级多多影院2022国产AA一级毛片无码 | 免费?级毛片无码?∨蜜芽试看| 97久久综合网| 亚洲精品1区| 色穴精品| 丁香六月婷婷| 欧美v亚洲v日韩v最新在线二区| 凹凸视频在线一区二区| 久久午夜神马| 91天天爽| 97久久天天综合色天天综合色电影| 日本天天人人狠狠在线日美女 | 日韩内| 亚洲综合69| 中文一区二区婷婷视频| 久久九九99| 福利在线黄片| 国模无码一区二区三区在线| 日韩精品国产一区二区| 不卡中文字幕aⅴ在线| 日韩91网站| 久区视频| 超碰色97| 一本久道久久综合狠狠爱一密臀精| 中文一区二区| 亚洲天堂资源| 青青草久草AV| 欧美综合在线第一页| 熟女一区二区三区| 亚洲色资源| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 色爱三区| 日韩成人大片在线观看| 午夜黄色免费在线观看| 一个人免费HD91视频| 在线看片国产精品每日更新| 激情国产乱伦Av| 久久成人午夜精品影院| 日韩国产欧美伦理在线| 国产熟女完整版中字| 免费观看国产小粉嫩喷水精品午| 人人 操人人 操人人| 五十路六十路七十路熟婆| 黄色成人网久久久久久| 一区操逼| 综合 欧美 亚洲 日本| 国产麻豆福利av在线播放| 乱伦3P视频| 国产福利精品最新在线| 日韩人妻资源在线看| 欧美黑人性猛交91| 国产精品。| 欧美色日| 78m成人视线| 91狠狠| 欧美性生活男人的天堂| 二男一女成人A片| 久精品无码av一区二免费国产在线观看 | 久久夜嗨| 九9精品| 精品传媒在线一区| 亚洲啪AⅤ永久无码| 成年女人黄网站| 91精品大奶人妻| 情色日播放AV| 少妇第一页| 91精品国产91熟女| 午夜男女爽爽爽影院视频| 国产理论视频在线播放| 亚洲宅男天堂| 久久99精品九九久久久婷婷| 风韵犹存大大大大香蕉| 无码免费在线观看黄色片| 国产精品香蕉热久久新品| 色欧美天天| 四虎AV影视国产精品亚洲精品| 伊人96在线| 中文字幕三四区| 在线人人人人人人精品超 | 亚洲欧美不卡线| 97在线观看播放视频| AV九九| 97精品综合久久网| 一区二区高清视频| 中国国国产一级特黄毛片| 91蜜臀熟女| 亚洲AV色图一区| 久久久久久99AV无码免费网站| 国产AV久久野战精品| 天天综合在线4| 亚洲诱惑天堂| av无线看| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 久热精品在线| 无码操逼网| 欧亚乱色熟一区二区三四区| 亚洲综合在线91| 日韩欧美tv一区二区在线观看| 97超碰国产精品| 色九色久| 亚洲天堂7777| 97公开久久| 日本成熟少妇A∨网站| 91日本在线观看| 欧洲亚洲人人爽爽视频| 亚洲精品尤物yw在线影院| 国产suv精品一区二区四| 日曰骚久久精品| 久久久久久久国产a∨| 免费看污网址| 亚洲成aⅴ人片不卡无码| 四虎影视在线| 国产91福利小视频在线观看| 伊人久久88国产女| 蜜臀AV一区二区三区| 99久久久无码国产精品性男| 天天拍天| 亚洲成熟国产精品美女| 欧美性天天影院| 国产99精品一区二区三区免费| 夜夜操av亚洲一区二区| 欧美性xxxxx狂欢| 久久久99久9| 亚洲欧洲成人在线电影| 免费视频在线观看啊啊啊啊啊| 超碰人妻久久| 婷婷三区| 国产v片在线免费观看| 亚洲天堂自拍| 老熟妇一区二区三区…| 97精选久久| 粉嫩不卡一区二区性爱| 91男女| 国产67194| 诱惑网综合| 国产精品一区二区在钱播放| 强奸抽插av| 欧美91网站| 久久久久九九九| 久久男人| 久久久久久久少妇| 久久精品国产99精品亚洲蜜...| 超碰中文字幕人妻草一区| 亚洲第一狼人丝袜美女另类| 死我十八禁| 五月开心网| 久久性爱视频99| 久久熟女久| 91久久久久久久| 超碰色综合| 抽插爽| 天美麻花大全视频| 男人的天堂 在线一区| 久久久久久久久久久久黄色| 成人八戒网站| 婷婷激情四射| 翔田千里爆乳巨臀无码| Julia Annxxxxx| 欧美男人一区| 欧美一级黄片视频在线| 超碰导航97| 中文字幕版| 在线国产探花| 无码动漫av中文字幕| 尤物视频偷拍免费| 日韩精品三区四区| 久久国内| 免费人成毛片乱码| 97视频免费在线| 欧美一区二区在线资源| 国产精品青草综合久久| 天天夜躁日日躁狠狠2002| 97草草| 欧美日韩理论一区| 色色色色综合网| 最新日日夜夜天天干干| 果冻传媒A片麻豆熟妇人妻| 日韩精品第3页| 男人的天堂网免费| 亚洲最大的综合性av| 日韩欧美性爱电影在线观看| 超碰综合97在线| 欧美爆操91| 日本欧美成人片AAAA| 超碰成人公开| 日韩国产精品人妻无码久久久| 2020中文字幕在线| 青青草男人天堂| 久热久一区二区三区| 巨爆乳肉感一区二区三区竹菊影视| 日韩免费福利在线观看| 91人人| 97se亚洲| 国产AB视频| 91久久国产综合精品| 欧美综合97www| 六月婷婷激情| 免费视频a级毛片免费视频| 26uuu性| 国产美女口爆吞精视频| 日韩亚洲欧美中文字幕| 色97干| 夜夜夜夜久久久久| 偷拍新久久| 91女优在线观看| 久草草一二三四区久久| 91丝袜激情在线| 天天综合网91入口| 殴美日韩m| 午夜呻吟欧美| 97超碰护士| 老熟妇91| 91亚洲人| 久久久久久精| 中文乱码字字幕在线第5页| 酒色综合网| 99re免费| 人人爱人人乐人人操| 国产偷拍网站| 26uuu成人影片| 亚洲精品一区二区精品| 中文字幕五月婷婷免费| 人妻一二三区| 九色精品视频导航1| 先锋色眉乱伦资源| 在线强奷到舒服的无码视频| 国产1769在线| 九九热精品| 亚洲18禁| 黄色不卡视频| 国产精品久久久久999| 97射欧美| 色爱亚洲| 91人精品妻入口| 人妻 中文 日韩| 日日碰狠狠添天天爽超| 欧美色婷婷| 欧美三级一级| 亚洲熟女乱综合一区二区三区| 亚洲drav色图| 亚洲欧美伦综合| 国产精品第一区第一页| 欧美日韩亚洲一区二区在线观看| 东亚亚洲无码高清| 91国产精品在线看| 极品粉嫩少妇视频| 色九色久| av网站免费线看| 老司机深夜影院18未满| 九九精品热| 成人久久无码www| 天天天堂影视日韩亚洲91| 怡红院成人视频| 91啦人妻| 五月丁香激情综合| 国产AV天美| 亚洲骚男同com| 日韩三级伊人| 狠狠色噜噜狠狠狠狠狠色综合久久| 狠狠色丁香| 久久久久密臀一区二区| 四虎av在线| 国产高清精品一区二区三区毛片 | 亚洲欧美在线综合| 亚洲se91| 乱欲一区二区| 色噜噜人妻av 中文字幕| 综合激情一一91| 亚洲日韩电影| 日韩性爱电影一区| 日本一区99| 天天欧美| 日本色色色视频| 青苹果影院男人的天堂| 九九热精品视频六| 久久久久久亚洲中文| 亚洲综合色男人网| 91天堂丝袜美腿| 中文字幕一区二区日韩网| 久热99| 亚洲AV人人澡人人爱| 三级日韩一区二区三区| 另类小说五月天| 这里只有精品视频在线观看麻豆| 红杏大香蕉| 欧美偷偷网| 天天躁日日躁AAAAXXXX国产| 国产超碰国产97| 香蕉精品二区二区| 探花一区在线| 欧美久久久| 欧美日韩*字幕一区| 在线观看十八禁| 蜜臀99久久国产| 久久‘黄片视频| 日本九九久久99| 精品国产一区二区三区在线播出| baisiav| 国产精品久久久久久久久久久久久久吹 | 日韩小电影| 九月婷婷综合| 农村少妇久久久久久久| 黄色一级视| 97免费视频在线观看视频| 国产日韩在线播放av| 丝袜综合| 国内偷自视频区视频综合 | 特级特黄一级毛片免费| 国产91精品久久久久久久网曝门| 国产午夜在线观看| 青青草在线成人视频| 校园春色亚洲| 国产欧美一区二区| 午夜小电影在线插入淫高潮| 97国产色综合| 欧美精品成人一区二区在线观看| 小草三级久久观看| 亚洲欧美日韩免费观看| 久久这里精品国产99丫e6| 熟妇综合一区二区三区| 亚91亚洲网| 变态乱伦伪娘灌肠一区二区| 中国熟女网站| www黄片免费看com| 国产精品一区在线播放| 99热综合| 中文一区二区三区影院| 91色噜噜狠狠| 日韩无码黄色片| 欧美 日韩第一性色| 久久思思热| 亚洲色图欧美一区二区不卡| 97天天做| 蜜乳AV网址| 婷婷激情四射| 大香蕉十区| 伊人网综合在线视频| 欧美综合网站999| 成人资源中文字幕在线观看天天| av网站免费看| 欧美97视频| 一区二区三区机械有限公司| 久久黄黄| 久久国产逼| 国产后入清纯| 亚洲综合色男人网| 欧美日韩免费性爱| 色97欧美| 欧美性暴力猛交XXXX| 精品国产www久久| 超碰免费人妻在线| 国产视频大全| 天天爱天天韩国日本牛牛牛牛 | 麻豆精品天美| 丁香五月色| 婷婷av在线中文字幕| 视频黄站| 久久久久9久久久久| 色久桃花影院在线观看| 另类图片天天影视| 青青草玖玖爱| 久久久久久亚洲精品中文字幕人妻| 国产日韩欧美中文在线播放| 上床啊啊啊| 97超碰久久色| 91亚洲黑人| 黄色片大香蕉| 国产亚洲欧美每日在线| 97视频播放| 99热这里只有是精品10| 老鸭窝亚洲毛片| 多乙久久久久久| 久久中文字幕不卡人妻| 国产综合久| 超碰97在线中文| 中文字幕版| 婷婷五月成人| 丰满人妻av一区二区三区| 丰满美女一级毛片在线播放| 欧美日韩一二三| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲天堂综合AV| 精品久久人妻成人网| 国产亚洲欧美每日在线| 久久激情婷婷| 欧美日韩小说| 超碰偷拍| 美女黄码视频午夜| 青青草色情网站视频| 欧美精品另类人妖xxxx| 狠狠穞A片一區二區三區| Blackedraw视频一区二区| 飘花国产午夜精品不卡| 日本孕妇一区二区视频操逼免费看 | 精品妇女一区二区三区| 日本女人操逼| 日本肏逼视频在线观看| 亚洲暴力强奸AV| 素人一区二区三区日韩| 国产午夜福利专区综合| 激情文学88| 久久午夜色播影院免费高清| 夜夜欧美| 人人妻人人爽| 一区二区视频在看| 91精品导航| 伊色久人大在线| 婷婷丁香人妻 | 97精品国产97久久久久久户外免费| 五月婷婷久久综合| 91超碰人人操| 婷婷99| 蜜桃视频精品一区二区| 97舔舔| 麻豆国产av网| 青青草精品| 亚洲www91| 中文字幕一区二区三四五区日日骚| 国产精品。| 97操在线| 色臀aV| 97日韩欧美亚洲| 97国产|免费| 91九色丨风韵犹存| 色吧91| 级做a爱无码性色永久免费| 中文字幕乱码人妻二区三区| www.av在线视频| 欧美一级黄色18片免费看| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲日韩成人性爱视频| 国产精品色色| 嗯啊不要啊啊在线观看视频| 操B久久| 精品少妇人妻| 啊啊啊好大好深| 亚洲精品久久久久毛片A片拉屎| 日韩成人私密一级精品av| 色婷婷六月丁香七月婷婷| 国产高清免费不卡av| 久久久夜夜嗨免费视频| 日本精品一区三区| 日本一区99| 日本最新1区2区3区| 欧美色九九| 国产精品一二三区18| 女人 A一级| 99热这里只有精品9| 中文字幕视频2区| 色悠久久久av| 日日摸天天爽夜夜欢| 三级激情网站| 五月婷婷基地| 欧美天堂日韩三级国产传媒| 最新9久久久9免费视频| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 久操操AV电影| 在线看片国产精品每日更新| 激情五月综合网| 青青久操| a啊啊啊啊啊啊啊啊一区二区| 一区在线精品中文字幕| 成人午夜小视频手机在线看| 97天天摸天天碰| 97视频在线视频| 亚洲成a人v欧美综合天堂下载| 日本丝袜人妻内射| 蜜臀久久99精品久久久老,,| 九九九九免费高| 91美女视频在线观看| 加勒比在线视频一区二区三区| 青草视频在线看看看看看看看看看| 久久成年精品| 果冻传媒A片麻豆熟妇人妻| 国产一区二区三区白丝| 婷婷五月色| 天天操天天日青青草超碰av| 精品无码秘 人妻一区二区| 国产一区二区av综合| 超碰性爱97| 91色婷婷综合久久中文字幕二区| 一区操逼日比视频| 色 婷97| 久久尹人大香焦视| 日韩av一级黄片| 四虎884a| 国产粉嫩蜜臀av一区二区三区 | 久久禁| 91午夜无码| 精品人妻一区二区三区-国产精品| 青青操日韩| 欧美日韩国产中文精品字幕自在自线| av婷婷色网| 91bbb| 狠狠干狠狠色| 少妇熟女视频一区二区三区| 日本性爰一道本| 亚洲综合有玛| 国产精品九九九| 亚洲精品丝袜-不卡成人免费……| 超碰在线综合97| 国产偷拍自拍在线视频| 日欧毛片久久| 免费啪啪av| 久久精品老司| 国产午夜福利专区综合| 中日无幕一二三四区| 亚洲国产97| 欧美激情五月天| 男人的天堂VA| 久久丁香五月婷婷| 午夜噜噜噜| 婷婷五月成人| 男人的天堂va在线| 91国产精品在线看| 91欧美亚洲| www.狠狠干.coom | 天天亚洲| 欧美色棕合| 17c嫩草51久久91嫩草| www.97在线| 亚洲天堂在线怕怕视频 | 十八禁av无码免费网站APP| 艳尻美人妻| 国产亚洲精品美女久久久久久2021| 狠综合网| 26uuu国产成人综合| 久久是精品| www.99在线| 亚洲国产综合图区中文字幕| 欧美熟妇视频| Sekablack无码一区| 九九九九九用不成了| 国产操偷| 亚洲色图欧美色图综合| 激情网五月天| 最新日本中文字幕| 国厂麻豆77q4| 日本精品一区二区中文字幕| 青青草一区二区高清无码视频| 蜜桃色色网站视频三区| 亚洲欧美色图小说| 欧美中字不卡| 噜噜在线| 日本1区2区不卡视频| 狠狠躁天天躁日日躁97| 操逼日韩无码| 男女啪啪网站免费视频| 超碰这里只有精品| 日韩在线观看中文字幕视频| 中文字幕乱码在线| 97欧美色资源| 婷婷五月天丁香花| av网站国产主播在线| 97超碰中文| 一区二区你上我| 午夜AV人气不卡| 日本亚洲嫩草影院啪啪| 人妻精品一区二区全免费| 欧美精品久久久久久久久88| 香蕉99秘 一区精品蜜桃臀| 大香蕉国产中文自拍| 国产综合操逼高清| 天天上日日上日韩精品| 国产女主播视频在线观看| 精品91摸| 91丨熟女丨丰满熟女| 大学生美女口爆| 国产精品粉嫩福利在线| 91 丝袜在线| 爱做久久久久久| 眼镜人妻101.com| 久久精品电影在线| 9999九九九久久久| 艳美熟妇先锋一二三区| 久久久无码av精| 亚洲欧美国产中文视频| 亚洲成人帖图| 欧美日韩青操| 好湿好紧好爽 视频| 性爱精品一区| 亚洲图片激情综合另类| 91丝袜美女视频| 另类老少妇| 亚洲色香| 超碰色中文| 先锋精品av色鲁| 日本精品不卡一二三区| 手机在线免费看的av| 日本女人久久久| 中文字幕国产| 91欧美性| 免费网色网站| 国产suv精品一区二区四区999| 色五月激情综合网| 久久三| 天天操天天射天天日| 欧美欧美啪啪视频| 欧美se综合| 抽插一区二区视频| 日日干夜夜骑| 国产精品久久久九九九| 精品亚洲俞拍视频一区| 精品国产自在在线99| 五月丁香久久| www.婷婷五月天| 国产伦精品一区二区三区在线观| 伊人网综合在线视频| 九月激情婷婷| gogogo免费高清看中国国语| 久久精品国产亚洲5555| 天天噜| 爱逼综合| 日日夜夜精品视频| 大香蕉中文| 2017大香蕉| 97超碰精品| 久久精品熟女亚洲AV麻豆软件| 欧美色图亚洲色| 久久免费少妇| 啊啊啊好想要| 性色AV蜜色av色欲av| 日产操逼| 成人AV超碰免费在线| 看免费的黄片| 国产精品爽爽v| 人人摸人人添人人操| 无码在线亚洲| 国产精品99久久久www| 久操热线| 亚洲天堂男人在线| 久久人妻四季| 青娱乐蜜桃臀AV色婷| 亚洲资源网| 51一区二区三区| 97超碰超| 久久精品人妻一区| 成人精品久久久午夜福利| 久久性爱精品一区| 91三级理论片播放器| 免费一级视频特黄色大片|