📄 readphoto.cpp
字号:
#include "stdafx.h"
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
unsigned char* ReadBmpFile(const char* pszFileName, int& nImgWidth, int& nImgHeight)
{
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
HGLOBAL hImgData;
BYTE *lpImgData;
int LineBytes =0;
int ImgSize =0;
int NumColors = 0;
FILE* fin = NULL;
fin = fopen(pszFileName,"rb");
if(fin == NULL)
{
printf("The file is not opened!\n");
fclose(fin);
return NULL;
}
int nread =0;
nread = fread(&bf,1,sizeof(BITMAPFILEHEADER),fin);
if(nread != sizeof(BITMAPFILEHEADER))
{
printf("read file header error!\n");
fclose(fin);
return NULL;
}
nread = fread(&bi,1,sizeof(BITMAPINFOHEADER),fin);
if(nread != sizeof(BITMAPINFOHEADER))
{
printf("read info header error!\n");
fclose(fin);
return NULL;
}
if(bi.biBitCount != 8)//每个象素占多少bit
{
printf("the colors of the image is not 256!\n");
fclose(fin);
return NULL;
}
nImgWidth=bi.biWidth;
nImgHeight=bi.biHeight;
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);//bmp规定每行占的字节数必须是4的整数倍
//这里如果biwidth=29 30 31 32 都将变成32
nImgWidth = LineBytes;
ImgSize=(DWORD)LineBytes*bi.biHeight;
BYTE* pbyteSrcImg = NULL;
pbyteSrcImg = new unsigned char[ImgSize];
assert(pbyteSrcImg != NULL);
if(bi.biClrUsed!=0)
{
NumColors=(DWORD)bi.biClrUsed;
}
else
{
if(bi.biBitCount == 8)
NumColors=256;
else
{
printf("Invalid image format!\n");
fclose(fin);
return NULL;
}
}
if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)))
{
fclose(fin);
return NULL;
}
bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)ImgSize))==NULL)
{
fclose(fin);
return NULL;
}
lpImgData = (BYTE*)GlobalLock(hImgData);
fseek(fin,sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + NumColors * sizeof(RGBQUAD),SEEK_SET);
fread(lpImgData,sizeof(unsigned char),ImgSize,fin);
int i,j;
for(i=0;i<nImgHeight;i++)
{
for(j=0;j<nImgWidth;j++)
{
pbyteSrcImg[i*LineBytes+j] = lpImgData[(nImgHeight - i - 1)*LineBytes + j];
}
}
fclose(fin);
GlobalUnlock(hImgData);
GlobalFree(hImgData);
return pbyteSrcImg;
}
void WriteBmpFile(const char* pszFileName, BYTE* pbyteSrcImg, int nWidth, int nHeight)
{
BITMAPFILEHEADER bmfHdr;
int nImgHeight=(nWidth+3)/4*4;
int imageSize=nImgHeight*nHeight;
BYTE *saveImage=new BYTE[imageSize];
memset(saveImage,0,imageSize);
int i;
for(i=0;i<nHeight;i++)
memcpy(saveImage+i*nImgHeight,pbyteSrcImg+(nHeight-i-1)*nWidth,nWidth);//将正序位图数据倒序存储
bmfHdr.bfType=0x4d42;
bmfHdr.bfSize=imageSize+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2=0;
bmfHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
BITMAPINFO *pInfo=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
pInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pInfo->bmiHeader.biWidth=nWidth;
pInfo->bmiHeader.biHeight=nHeight;
pInfo->bmiHeader.biPlanes=1;
pInfo->bmiHeader.biBitCount=8;
pInfo->bmiHeader.biCompression=BI_RGB;
pInfo->bmiHeader.biSizeImage=imageSize;
pInfo->bmiHeader.biXPelsPerMeter=0;
pInfo->bmiHeader.biYPelsPerMeter=0;
pInfo->bmiHeader.biClrUsed=0;
pInfo->bmiHeader.biClrImportant=0;
for(i=0;i<256;i++)
{
pInfo->bmiColors[i].rgbBlue=i;
pInfo->bmiColors[i].rgbGreen=i;
pInfo->bmiColors[i].rgbRed=i;
pInfo->bmiColors[i].rgbReserved=0;
}
FILE* mFile = NULL;
mFile=fopen(pszFileName,"wb");
if(mFile == NULL)
{
AfxMessageBox(_T("the file is not opened!"));
return;
}
fwrite((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER),1,mFile);
fwrite(pInfo,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD),1, mFile);
fwrite(saveImage,sizeof(BYTE),imageSize,mFile);
fclose(mFile);
free(pInfo);
delete[]saveImage;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -