首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現 BufferedImage 轉 1 位 BMP 位圖流:手動構建 BMP 文件頭、調色盤與像素數據掃描行填充

     編輯:Java 相關知識

核心流程

  1. 讀取圖片:支持 URL 或本地文件,使用 ImageIO.read() 獲取 BufferedImage
  2. 二值化處理:遍歷像素,將 RGB 值轉為 0(白) 或 1(黑)
  3. 構建 BMP 文件頭:包含標識符 BM、文件大小、保留字段、數據偏移量
  4. 構建信息頭:寬度、高度、位平面數(1)、色深(1)、壓縮方式(0)、數據大小、分辨率、調色盤顏色數、重要顏色數
  5. 調色盤:雙色圖僅需 2 表項(黑/白),各佔 4 字節 (BGR + 保留)
  6. 像素數據重組:
    • BMP 從最後一行開始掃描(底部優先)
    • 每行必須 4 字節對齊(如 101 像素 → 128 bits = 16 字節),不足補 0
    • 每字節存 8 像素,高位在前
  7. 寫入文件:使用 RandomAccessFile 依序寫入所有段

關鍵代碼片段

// 文件頭
int[] identifier = {'B', 'M'};
int[] fileSize = {0x0E, 0x02, 0x00, 0x00}; // 518 bytes
int[] reserved = {0,0,0,0};
int[] bitmapDataOffset = {0x3E, 0, 0, 0}; // 62 bytes

// 信息頭
int[] bitmapHeaderSize = {0x28, 0, 0, 0}; // 40 bytes
int[] width = {0x65, 0, 0, 0}; // 101
int[] height = {0x1D, 0, 0, 0}; // 29
int[] planes = {0x01, 0};
int[] bitsPerPixel = {0x01, 0};
int[] compression = {0,0,0,0};
int[] bitmapDataSize = {0xD0, 0x01, 0, 0}; // 464 bytes
int[] hResolution = {0,0,0,0};
int[] vResolution = {0,0,0,0};
int[] colors = {0,0,0,0};
int[] importantColors = {0,0,0,0};

// 調色盤:黑(0,0,0) + 白(255,255,255)
int[] palette = {0,0,0,0, 0xFF,0xFF,0xFF,0};

// 像素數據填充邏輯
int[] bitmapData = new int[(101 + 27) * 29 / 8]; // 行填充後總字節數
int n = 0;
for (int i = 0; i < 29; i++) { // 從最後一行開始
    for (int j = 1; j <= 101; j++) {
        if (rgbArray[(28 - i) * 101 + j - 1] == 1) {
            bitmapData[n] |= (1 << (8 - j % 8) % 8);
        }
        if (j % 8 == 0) n++;
        if (j == 101) n += 4; // 行尾填充 4 字節
    }
}

注意事項

  • 所有多字節整數採用小端序存儲
  • 行填充計算公式:(width + 31) / 32 * 4 字節
  • 更詳細的 BMP 格式規範可參考 wotsit.org

此代碼演示了不依賴外部庫、純手工構建 BMP 文件的完整過程,適合學習圖像文件格式或受限環境下的圖片導出需求。

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