以下是我十几年前当助教时的作业说明投影片内容,
用copy的,不多做解释。
要用0/1表示0/255,要从biBitcount下手。
BMP Header:
(1) Bmp file header (totally 14 bytes)
1a) Byte 0~1: bfType: always ‘B’,‘M’
1b) Byte 2~5: bfSize: bmp image file size
38_04_04_00=>4*256*256+4*256+56=263244
1c) Byte 6~7 & Byte 8~9: bfReserved1, bfReserved2:
reserved bytes, always 0
1d) Byte 10~13: bfOffBits:
offset to the location of raw data, or
length of total header size
(file header + image header + palette)
36_04_00_00=>4*256+54=1078
(2) Bmp image header (totally 40 bytes)
2a) Byte 14~17 : biSize: always 28 (hex),or 40 in decimal.
2b) Byte 18~21&22~25 : biWidth & biHeight (in pixels)
2c) Byte 26~27 : biPlane
2d) Byte 28~29 : biBitcount : color depth,
8 for 256-color;
18(hex, or 24 in decimal) for 24-bit color
2e) Byte 30~33 : biCompression
2f) Byte 34~37 : biSizeImage
2g) Byte 38~41&42~45: biXPelPerMeter, biYPelPerMeter
2h) Byte 46~49&51~53 : biClrUsed, biClrImportant
(3) Bmp palette:
optional, usually used in gray-level images.
ex: [RR GG BB 00]*256 = 1024 Bytes
※ 引述《IOP14759 (iop14759)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: WIN7
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: C++
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: Graphics.hpp
: 问题(Question):
: 该如何分析1像素1bit的bmp档
: 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
: TColor pixelColor = bmp->Canvas->Pixels[x][y]; //抓取像素点[宽][高]的RGB值
: r = GetRValue(pixelColor);
: g = GetGValue(pixelColor);
: b = GetBValue(pixelColor);
: 补充说明(Supplement):
: 我用小画家画一张简单的图,画布大小是50*60像素
: 上半部是R=255/G=0/B=0的纯红,下半部是B=255/G=0/R=0的纯蓝
: 这时候去读BMP的结构,OK跟网络上说的一样我都能看得懂,1CH-1DH=24(1像素24位元),
: 然后从36H开始分析像素矩阵的RGB都符合原图
: 在C++Builber中使用#include <Graphics.hpp>中的GetRValue,GetGValue,GetBValueu也
: 都正确抓出R/B=255的值
: 然后使用线上绘图(photopea)把亮度修改到10%,再去读BMP的资料,我发现1CH-1DH=1(1
: 像素1位元),整个像素矩阵我都看不懂了,我上网查是说1bit的图档应该是只有黑跟白
: https://upload.cc/i1/2023/08/21/ifxceV.png
: 但是我用GetRValue,GetGValue,GetBValueu指令去抓,反而能抓到红色和蓝色=0x19的值
: ,转DEC是25刚好符合255的10%
: 既然用指令可以抓表示这结构一定是对的,那么想请问在1像素占1bit时的像素矩阵要怎
: 么去分析
: 是否有相关关键字或书籍名称可以分享给我,谢谢