使用c ++创建的位图文件头中的图像大小字段中的随机数据

时间:2016-02-11 11:51:08

标签: c++ image bitmap

这是我在Stack溢出时的第一个问题。我是图像处理和C ++的新手,我现在正在使用位图文件。使用C ++创建位图文件时,无法使用任何查看器打开该文件。我使用十六进制编辑器来查看文件,并且info头中的图像大小字段中有随机数据。在十六进制编辑器中编辑后,位图是可查看的。我不知道代码有什么问题。

我创建的标题(bitmap.h)如下

#include<iostream>
#include<fstream>

using namespace std;

struct BmpSignature
{
    unsigned char data[2];
    BmpSignature(){ data[0] = data[1] = 0; }

};

struct BmpHeader
{
    unsigned int fileSize; // this field gives out the size of the full    Image includong the headers. it is of 4 byte in width
    unsigned short reserved1; // this field is reserved. it is 2 byte in width
    unsigned short reserved2; //This field is also reserved. it is 2 byte in width
    unsigned int dataOffset; // this gives the starting location of the starting of the image data array
};

struct BmpInfoHeader
{
    unsigned int size; // this field gives the size of the Bitmap info Header. This is 4 byte in width
    unsigned int width; // this gives the width of the image
    unsigned int height; // this gives the height of the image
    unsigned short planes; //this gives the number of planes in the image
    unsigned short bitCount; // this gives the number of bits per pixels in the image. for ex. like 24 bits, 8 bits
    unsigned short compression; // gives info whether the image is compressed or not
    unsigned int ImageSize; // gives the actual size of the image
    unsigned int XPixelsPerM; // give the number of pixels in the X direction. It is usually 2834
    unsigned int YPixelsPerM;// give the number of pixels in the Y direction. It is usually 2834
    unsigned int ColoursUsed; // this field gives the number of Colours used in the Image
    unsigned int ColoursImp; // gives the number of Important colours in the image. if all colours are important it is usually 0


};

我创建的cpp文件如下(Create_Bitmap.cpp)

#include"bitmap.h"
#include<cmath>
#include<fstream>

using namespace std;



int main()
{

  ofstream fout;
  fout.open("D:/My Library/test1.bmp", ios::out |ios::binary);


  BmpHeader header;
  BmpInfoHeader infoheader;
  BmpSignature sign;



  infoheader.size = 40;
  infoheader.height = 15;
  infoheader.width = 15;
  infoheader.planes = 1;
  infoheader.bitCount = 8;
  infoheader.compression = 0;
  infoheader.ImageSize = 0;
  infoheader.XPixelsPerM = 0;
  infoheader.YPixelsPerM = 0;
  infoheader.ColoursUsed = 0;
  infoheader.ColoursImp = 0;

  unsigned char* pixelData; 

  int pad=0;
  for (int i = 0; i < infoheader.height * infoheader.width; i++)
  {
      if ((i) % 16 == 0)    pad++;
  }

  int arrsz = infoheader.height * infoheader.width + pad;

  pixelData = new unsigned char[arrsz];

  unsigned char* offsetData;
  offsetData = new unsigned char[4 * 256];


  int xn = 0;
  int yn = 4 * 256;

  for (int i = 0; i < yn; i+=4)
   {
      offsetData[i] = xn;
      offsetData[i+1] = xn;
      offsetData[i+2] = xn;
      offsetData[i+3] = 0;
      xn++;
  }
  int num = 0;
  for (int i = 0; i < arrsz; i++)
  {
      pixelData[i] = i;
  }

  sign.data[0] = 'B'; sign.data[1] = 'M';
  header.fileSize = 0;
  header.reserved1 = header.reserved2 = 0;
  header.dataOffset = 0;

  fout.seekp(0, ios::beg);
  fout.write((char*)&sign, sizeof(sign));
  fout.seekp(2, ios::beg);
  fout.write((char*)&header, sizeof(header));
  fout.seekp(14, ios::beg);
  fout.write((char*)&infoheader, sizeof(infoheader));
  fout.seekp(54, ios::beg);
  fout.write((char*)offsetData, yn);
  fout.write((char*)pixelData, arrsz);



  fout.close();
  delete[] pixelData;
  delete[] offsetData;

  return 0;
}

我已将创建的bmp文件的屏幕截图附加到十六进制编辑器中,并选择了图像大小字段

Bitmap Image opened in Hex Editor

使用十六进制编辑器替换字段中的内容后,可以使用图像查看器查看位图文件。我不知道这段代码有什么问题

1 个答案:

答案 0 :(得分:1)

所以你想用BMP格式写?请记住,编译器可能会在C ++ POD结构中插入填充。您可能需要使用一些编译器编译指示来打包结构。另外请确保对所有整数使用little-endian,但这应该没问题,因为你在Windows上,假设是x86。