首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

解析 JPEG 圖片頭文件獲取尺寸:位運算原理詳解

     編輯:程式設計綜合問答

背景

通過網絡請求圖片頭部信息(不下載完整圖片)解析 JPEG 尺寸。關鍵代碼片段涉及位運算提取寬高:

// 假設 data 是包含 SOF 段數據的 byte[]
int width = (data[0] << 8) | (data[1] & 0xFF);
int height = (data[2] << 8) | (data[3] & 0xFF);

JPEG SOF 段結構

JPEG 文件由多個段組成,SOF (Start of Frame) 段包含圖像基本信息:

標識符 (2 bytes): 0xFFC0 (Baseline DCT)
長度 (2 bytes): 段長度(含長度字段)
精度 (1 byte): 通常 8
高度 (2 bytes): 大端序
寬度 (2 bytes): 大端序
...

位運算詳細解析

網絡傳輸與 JPEG 標準均采用大端序,即高位字節在前。Java byte 是有符號 8 位,直接移位會符號擴展,需配合 & 0xFF 轉為無符號整數。

// data[0] = 高位字節,data[1] = 低位字節
int high = data[0] & 0xFF;   // 如 0x12 -> 18
int low  = data[1] & 0xFF;   // 如 0x34 -> 52

// 高位左移 8 位,佔據高 16 位;低位佔據低 16 位
int width = (high << 8) | low; // 0x1234 = 4660

為什麼要左移 8 位?

  • 一個 short/int 佔 2 字節(16 位)。
  • 高位字節代表數值的高 8 位,必須左移 8 位才能對齊到整數的高位。
  • 低位字節直接填入低 8 位。
  • 通過按位或 | 合併為完整 16 位整數。

完整解析流程

  1. 發送 HTTP HEAD 或 Range: bytes=0-1024 請求獲取頭部數據。
  2. 掃描 0xFF 標記,找到 SOF 段(0xFFC0~0xFFCF,排除 0xFFC4 DHT, 0xFFC8 JPGE 等)。
  3. 跳過長度字段(2 bytes),精度字段(1 byte)。
  4. 讀取後 4 字節:高度高位、高度低位、寬度高位、寬度低位。
  5. 應用上述位運算得出寬高。

Java 代碼片段

public static Dimension getJpegSize(InputStream in) throws IOException {
  byte[] buf = new byte[4];
  // ... 定位到 SOF 段數據起始位置 ...
  in.read(buf, 0, 4); // 讀取高度高、高度低、寬度高、寬度低
  int height = ((buf[0] & 0xFF) << 8) | (buf[1] & 0xFF);
  int width  = ((buf[2] & 0xFF) << 8) | (buf[3] & 0xFF);
  return new Dimension(width, height);
}

總結

左移運算符 << 用於將高位字節移至正確位置,配合 & 0xFF 消除符號擴展,實現大端序字節序到宿主整數的正確轉換。這是二進制協議解析、網絡編程、文件格式分析中的基礎技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved