如何在bmp中读取像素后的像素
How to read pixel after pixel in bmp
我有一个问题!我想在24位的位图中得到每个像素的RGB信息。到目前为止,我写了一个代码,这是获得有关位图的信息,但我有一个问题,获得关于每个像素的RGB信息。我希望将这些信息保存在结构像素的标签像素中。你能帮我吗?
我把我的代码放在下面:
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
#pragma pack(2)
struct BITMAPFILEHEADER // File header
{
char bfType[2]; // File type: should be BM ( 0x42 0x4D )
int bfSize; // File size in bytes
short bfReserved1; // Reserved - for what i have no idea :P
short bfReserved2; // -||-
int bfOffBits; // Offset, adress of the beginning of the information about image (pixels )
};
struct BITMAPINFOHEADER // Bitmap header
{
unsigned int biSize; // Size of this header
unsigned int biWidth; // Width of image ( in pixels)
unsigned int biHeight; // Height of this image ( in pixels )
unsigned short biPlanes; // Numer of color planes, always 1
unsigned short biBitCount; // Number of bytes for pixel. Possibility values :1,4,8,16, 24 and 32
unsigned int biCompression; // Used compression (0 -none)
unsigned int biSizeImage; // Size of image
signed int biXPelsPerMeter; // Horizontal resolution of the image (pixel per meter)
signed int biYPelsPerMeter; // Vertical resolution of the image (pixel per meter)
unsigned int biClrUsed; // Number of colors in the color palette, or 0 to default to 2^n ( 0- no palette)
unsigned int biClrImportant; // Number of important colors used
};
#pragma pack(push, 1)
struct Pixel{
unsigned int blue; // or double?
unsigned int green;
unsigned int red;
//unsigned char reserved;
};
#pragma pack(pop)
int main(){
// Openning the file
cout << "Openning the file for reading: "<< endl;
_getch();
ifstream ifs("moj.bmp", ios::binary);
if(!ifs){
cout << " There is no such of file ";
_getch();
return 0;
}
// Reading information about BITMAPFILEHEADER
char* temp = new char[sizeof(BITMAPFILEHEADER)];
ifs.read(temp, sizeof(BITMAPFILEHEADER));
BITMAPFILEHEADER* bfh = (BITMAPFILEHEADER*)(temp);
cout << "n FILHEADERn";
cout << "n File type: " << bfh->bfType[0] << bfh->bfType[1] << endl;
cout << " File size: " << bfh->bfSize << endl;
cout << " Offset(adress of beggining of the image information): " << bfh->bfOffBits << endl;
_getch();
// Reading information about BITMAPINFOHEADER
temp = new char[sizeof(BITMAPINFOHEADER)];
ifs.read(temp, sizeof(BITMAPINFOHEADER));
BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)(temp);
cout << "n INFOHEADERn";
cout << "n Header size: " << bih->biSize << endl;
cout << " Image width: " << bih->biWidth << endl;
cout << " Image height: " << bih->biHeight << endl;
cout << " Number of bytes for pixel: " << bih->biBitCount << endl;
cout << " Used compression: " << bih->biCompression << endl;
cout << " Image size: " << bih->biSizeImage<< endl;
cout << " Horizontal resolution: " << bih->biXPelsPerMeter << endl;
cout << " Vertical resolution: " << bih->biYPelsPerMeter << endl;
cout << " Number of colors in the color palette: " << bih->biClrUsed << endl;
cout << " Number of important colors used: " << bih->biClrImportant << endl;
_getch();
Pixel** pixs = new Pixel*[bih->biHeight];
for (int i = 0; i < bih->biHeight ; ++i)
pixs[i] = new Pixel[bih->biWidth];
ifs.seekg(bfh->bfOffBits, ios::beg); // bfOffBits points for beginning of the image information
/* I have no idea how to read pixel after pixel in this moment */
_getch();
for (int i = 0; i < bih->biHeight; ++i)
delete pixs[i];
delete pixs;
delete bfh;
delete bih;
return 0;
}
这是工作,但我应该如何改变这对一些整数变量?例如:
pixs[i][j]=(unsigned int)r;
不能工作。在这个命令之后[i][j]是一些垃圾…:/
也许一些建议?
当您有偏移和图像大小并且您确定图像为24位(每种颜色1byte)时,您可以逐个像素扫描图像缓冲区。
uint8_t* pixelTmp = new uint8_t[3];
for (int i = 0; i != imageSize; ++i) {
ifs.read(pixelTmp, 3);
pixelTmp[0]; /* is blue 0-255 */
pixelTmp[1]; /* is green 0-255 */
pixelTmp[2]; /* is red 0-255 */
}
将pixelTmp[0]
的值分配给您自己的像素蓝色,等等…
首先,BITMAPINFOHEADER
的biBitCount
字段是不是每像素的字节数,它是比特数。
这是从原始数据中读取一个像素所需的位数。对于24位像素,只需按照Alessandro Pezzato或Ben的答案阅读。32位像素包含一个额外的字节,通常包含一个alpha通道(像素的透明度)。有多种不同的16位格式,8位格式通常是颜色表的索引。我不知道4位格式,但1位是纯黑白的(0是黑色,1是白色)
对于8、16、24和32位格式,读取1到4个字节并根据颜色格式进行转换。对于小于8(4和1)的值,每次读取一个字节,然后在循环中使用掩码来获取比特,并存储在您的内部格式中。
如图所示,1个像素使用3个字节。这意味着第一个字节是蓝色的,第二个是绿色的,第三个是红色的。现在你应该做的是,循环遍历位图文件的其余部分,读取3个单独的字节,并将它们存储在struct中:
char r, g, b;
ifs.read(&b, 1);
ifs.read(&g, 1);
ifs.read(&r, 1);
您可以查看示例1以了解如何存储图像的行。
相关文章:
- 如何使用Qt读取我的应用程序屏幕像素数据
- 如何在C 中读取DICOM像素
- OpenGL使用glfw通过HIDDEN窗口进行屏幕外渲染和读取像素值
- 读取的像素类型
- 从位图图像文件读取像素数据值
- 在 c++ 中读取"bitmap"像素
- C/C++LIBTIFF:需要从BW TIFF文件中读取白色和黑色像素的像素位置
- 我必须更改的内容是我可以从数组中读取像素值
- 无法读取正确的 PGM 像素值
- OpenCV读取图像像素值
- 在 C 和 C++ 中从 JPEG 读取黑白像素作为数组
- 在C++中将图像数据(R,G和B像素)读取到2D数组中
- 使用 boost.gil 逐像素读取.png文件
- SDL 从纹理中读取像素
- big_endian和little_endian的图像像素读取
- 如何从Mat变量编辑/读取OpenCv中的像素值
- 从bmp文件读取RGB像素
- 在像素GLSL中存储(并读取)大量数据
- SDL2逐像素读取PNG24
- 从Qt中的每个像素读取Alpha通道