图像RAW转bitmap



using namespace std;


int CIIZW_RawToBmp(unsigned char *pRawImage, int ImageHeight, int ImageWidth, int bitcount);


int main()
{

FILE * fp = fopen("E:\\temp\\SLAP_4_IMAGE_LEFT.raw", "rb");
unsigned char *buf = new unsigned char[1600 * 1500];
fread(buf, 1, 1600 * 1500, fp);
fclose(fp);


CIIZW_RawToBmp(buf, 1500, 1600, 8);

return 0;
}


int CIIZW_RawToBmp(unsigned char *pRawImage, int ImageHeight, int ImageWidth, int bitcount)
{

unsigned char *imgData;
int dataSizePerLine = ((ImageWidth * bitcount + 31) >> 5) << 2;


int plaLen = bitcount <= 8 ? 2 << (bitcount - 1) : 0;
cout << "plaLen = " << plaLen << endl;
int headerLength = 14 + 40 + plaLen * 4;
int dataLength = dataSizePerLine*(ImageHeight - 1) + ImageWidth*bitcount / 8;
cout << "headerLength = " << headerLength << endl;
cout << "dataLength = " << dataLength << endl;
short int biPlanes = 1;
char bm[2] = { 'B','M' };
int bfReserved1 = 0;
int bfSize = headerLength + dataLength;
int biHeight = ImageHeight*(-1);
int bfOffBits = headerLength;
int bisize = 40;
int biCompression = 0; int biSizeImage = dataLength;
int biXPelsPerMeter = 0, biYPelsPerMeter = 0;
int biClrUsed = plaLen; int biClrImportant = 0;
imgData = new unsigned char[headerLength + dataLength];
memset(imgData, 0, headerLength + dataLength);
memcpy(imgData, &bm, 2);
memcpy(imgData + 2, &bfSize, 4);
memcpy(imgData + 6, &bfReserved1, 4);
memcpy(imgData + 10, &bfOffBits, 4);
memcpy(imgData + 14, &bisize, 4);
memcpy(imgData + 18, &ImageWidth, 4);
memcpy(imgData + 22, &biHeight, 4);
memcpy(imgData + 26, &biPlanes, 2);
memcpy(imgData + 28, &bitcount, 2);
memcpy(imgData + 30, &biCompression, 4);
memcpy(imgData + 34, &biSizeImage, 4);
memcpy(imgData + 38, &biXPelsPerMeter, 4);
memcpy(imgData + 42, &biYPelsPerMeter, 4);
memcpy(imgData + 46, &biClrUsed, 4);
memcpy(imgData + 50, &biCompression, 4);

if (headerLength > 54) {
if (bitcount == 1) {
for (int i = 0; i < 2; i++) {
char gray[4] = { i * 255,i * 255,i * 255,255 };
memcpy(imgData + 54 + 4 * i, gray, 4);
}
}
else if (bitcount == 4) {
for (int i = 0; i < 16; i++) {
char gray[4] = { i * 17,i * 17,i * 17,255 };
memcpy(imgData + 54 + 4 * i, gray, 4);
}
}
else  if (bitcount == 8) {
for (int i = 0; i < 255; i++) {
char gray[4] = { i,i,i,255 };
memcpy(imgData + 54 + 4 * i, gray, 4);
}
}
}


int dw = ImageWidth*bitcount / 8;
for (int i = 0; i < ImageHeight; i++)
{
memcpy(imgData + headerLength + dataSizePerLine*i, pRawImage + dw*i, dw);
}



FILE *fp_bmp;
fp_bmp = fopen("temp.bmp", "wb");
fwrite((void*)imgData, bfSize, 1, fp_bmp);
fclose(fp_bmp);


cout << "save temp.bmp" << endl;
return 0;
}

猜你喜欢

转载自blog.csdn.net/zh_98/article/details/80580444