[英]Reading BMP file C++ (trouble with reading BMP header)
I am trying to write BMP image class with reading method. 我正在尝试使用读取方法编写BMP图像类。 I saw msdn specification of BMP files, so I try to read the headers and after, using the biHeight and biWidth information, read RGB info of every pixel. 我看到了BMP文件的msdn规范,因此我尝试读取标头,然后使用biHeight和biWidth信息读取每个像素的RGB信息。 So, it don't read header information, the value of every header parameter is -1. 因此,它不读取标头信息,每个标头参数的值为-1。
Here's code: 这是代码:
#ifndef BMP_IMAGE_H
#define BMP_IMAGE_H
#include <fstream>
using namespace std;
typedef struct
{
unsigned int bfType;
unsigned long bfSize;
unsigned int bfReserved1;
unsigned int bfReserved2;
unsigned long bfOffBits;
} BitMapFileHeader;
typedef struct
{
unsigned int biSize;
int biWidth;
int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BitMapInfoHeader;
typedef struct
{
int rgbBlue;
int rgbGreen;
int rgbRed;
int rgbReserved;
} RGBColor;
class BMPImage
{
private:
unsigned short read_u16();
unsigned int read_u32();
int read_s32();
public:
ifstream pFile;
int imageWidth;
int imageHeight;
RGBColor **rgb;
BMPImage(char* fileName);
void pixelsInfo();
};
#endif // BMP_IMAGE_H
#include "bmp_image.h"
#include <iostream>
using namespace std;
BMPImage::BMPImage(char* fileName)
{
ifstream pFile(fileName, ios::in | ios::binary);
// read the header of file
BitMapFileHeader header __attribute__((unused));
header.bfType = read_u16();
header.bfSize = read_u32();
header.bfReserved1 = read_u16();
header.bfReserved2 = read_u16();
header.bfOffBits = read_u32();
// read the header of image
BitMapInfoHeader bmiHeader;
bmiHeader.biSize = read_u32();
bmiHeader.biWidth = read_s32();
bmiHeader.biHeight = read_s32();
bmiHeader.biPlanes = read_u16();
bmiHeader.biBitCount = read_u16();
bmiHeader.biCompression = read_u32();
bmiHeader.biSizeImage = read_u32();
bmiHeader.biXPelsPerMeter = read_s32();
bmiHeader.biYPelsPerMeter = read_s32();
bmiHeader.biClrUsed = read_u32();
bmiHeader.biClrImportant = read_u32();
cout << (int)bmiHeader.biHeight <<"\n";
RGBColor **rgb = new RGBColor*[bmiHeader.biHeight];
for (int i = 0; i < bmiHeader.biWidth; i++)
rgb[i] = new RGBColor[bmiHeader.biHeight];
for (int i = 0; i < bmiHeader.biWidth; i++) {
for (int j = 0; j < bmiHeader.biHeight; j++) {
rgb[i][j].rgbBlue = pFile.get();
rgb[i][j].rgbGreen = pFile.get();
rgb[i][j].rgbRed = pFile.get();
}
char temp;
pFile.get(temp);
}
imageWidth = bmiHeader.biWidth;
imageHeight = bmiHeader.biHeight;
pFile.close();
}
unsigned short BMPImage::read_u16(){
unsigned char b0, b1;
b0 = pFile.get();
b1 = pFile.get();
return ((b1 << 8) | b0);
}
unsigned int BMPImage::read_u32(){
unsigned char b0, b1, b2, b3;
b0 = pFile.get();
b1 = pFile.get();
b2 = pFile.get();
b3 = pFile.get();
return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0);
}
int BMPImage::read_s32(){
unsigned char b0, b1, b2, b3;
b0 = pFile.get();
b1 = pFile.get();
b2 = pFile.get();
b3 = pFile.get();
return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0);
}
void BMPImage::pixelsInfo(){
for (int i = 0; i < imageWidth; i++) {
for (int j = 0; j < imageHeight; j++) {
std::cout << rgb[i][j].rgbRed <<" " << rgb[i][j].rgbGreen << " " << rgb[i][j].rgbBlue << std::endl;
}
std::cout << std::endl;
}
}
PS Thank you everybody for help PS谢谢大家的帮助
The member 会员
ifstream pFile;
of class BMPImage is not being initialized, so when you use it in member functions it isn't valid. 类BMPImage的尚未初始化,因此在成员函数中使用它时无效。 Instead you are locally defining a different pFile instance in the constructor. 相反,您在构造函数中本地定义了另一个pFile实例。 These should probably be the same instance. 这些可能应该是同一实例。
I think you should change this: 我认为您应该更改此:
typedef struct
{
int rgbBlue;
int rgbGreen;
int rgbRed;
int rgbReserved;
} RGBColor;
For this: 为了这:
typedef struct
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} RGBColor;
Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/dd162938(v=vs.85).aspx 参考: https : //msdn.microsoft.com/zh-cn/library/windows/desktop/dd162938(v=vs.85).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.