📄 imgbmpprocess.c
字号:
/*
* Filename: ImgReadBMP.c
*
* Read bmp file using standard C.
*
* Author: gomo
* Date: 2007-05-16
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ImgBMPProcess.h"
//#define DEBUG_FLAG
int
DhReadBMPImgInfo(
IN char *pFileName,
OUT BmpFileHeader *pBmpFH,
OUT BmpInfoHeader *pBmpIH
)
{
FILE* fp = 0;
fp = fopen(pFileName,"rb");
if(!fp)
{
fprintf(stderr,"can't open image file: %s\n",pFileName);
fflush(stderr);
return -1;
}
#ifdef DEBUG_FLAG
printf("file header size=%d\n",sizeof(BmpFileHeader));
printf("info header size=%d\n",sizeof(BmpInfoHeader));
printf("header size=%d\n",sizeof(BmpFileHeader)+sizeof(BmpInfoHeader));
#endif
BmpFileHeader* fileHeader = (BmpFileHeader*)calloc(1,sizeof(BmpFileHeader));
if(!fileHeader)
{
fprintf(stderr,"Not enough memory.\n");
fflush(stderr);
return -2;
}
if(fread(fileHeader, sizeof(BmpFileHeader), 1, fp) <=0)//读文件头
{
fprintf(stderr, "Read bmp file header failed.\n");
return -3;
}
if(fileHeader->bfType != DIB_HEADER_MARKER)
{
fprintf(stderr, "Invalid image format.\n");
fflush(stderr);
free(fileHeader);
return -4;
}
BmpInfoHeader* infoHeader = (BmpInfoHeader*)calloc(1,sizeof(BmpInfoHeader));
if(!infoHeader)
{
fprintf(stderr,"Not enough memory.\n");
fflush(stderr);
return -2;
}
if(fread(infoHeader, sizeof(BmpInfoHeader), 1, fp) <=0)//读信息头
{
fprintf(stderr, "Read bmp file information failed.\n");
return -5;
}
RGBQuad* palette = NULL;//调色板
int numColors = 0;
if(infoHeader->biClrUsed != 0)
{
numColors = infoHeader->biClrUsed;
// printf("numcolors = %d.\n",numColors );
}
else
{
// printf("numcolors = %d.\n",infoHeader->biBitCount );
switch (infoHeader->biBitCount)
{
case 1:
numColors = 2;
break;
case 4:
numColors = 16;
break;
case 8:
numColors = 256;
break;
case 24:
numColors = 0;
break;
default:
free(fileHeader);
free(infoHeader);
return -6;
break;
}
}
//验证图象数据
if(fileHeader->bfOffBits !=
(sizeof(BmpInfoHeader)+sizeof(BmpFileHeader)+numColors*sizeof(RGBQuad)))
{
printf("color table (RGBQUAD list) error!\n");
return -7;
}
if(numColors != 0)
{
palette = (RGBQuad*)calloc(numColors, sizeof(RGBQuad));
if(!palette)
{
fprintf(stderr,"Not enough memory.\n");
fflush(stderr);
return -2;
}
if(fread(palette, sizeof(RGBQuad) * numColors, 1, fp) <=0)//读调色板
{
fprintf(stderr, "Read color palette failed.\n");
fflush(stderr);
return -8;
}
#ifdef DEBUG_FLAG
int i = 0;
for(i = 0; i<numColors; i++)
{
printf("%x %x %x %x\n",palette[i].rgbBlue,palette[i].rgbGreen,
palette[i].rgbRed,palette[i].rgbReserved);
}
#endif
}
#ifdef DEBUG_FLAG//打印信息
printf("fileHeader->bfType=%d\n",fileHeader->bfType);
printf("fileHeader->bfSize=%d\n",fileHeader->bfSize);
printf("fileHeader->bfReserved1=%d\n",fileHeader->bfReserved1);
printf("fileHeader->bfReserved2=%d\n",fileHeader->bfReserved2);
printf("fileHeader->bfOffBits=%d\n",fileHeader->bfOffBits);
printf("infoHeader->biSize=%d\n",infoHeader->biSize);
printf("infoHeader->biWidth=%d\n",infoHeader->biWidth);
printf("infoHeader->biHeight=%d\n",infoHeader->biHeight);
printf("infoHeader->biPlanes=%d\n",infoHeader->biPlanes);
printf("infoHeader->biBitCount=%d\n",infoHeader->biBitCount);
printf("infoHeader->biCompression=%d\n",infoHeader->biCompression);
printf("infoHeader->biSizeImage=%d\n",infoHeader->biSizeImage);
printf("infoHeader->biXPelsPerMeter=%d\n",infoHeader->biXPelsPerMeter);
printf("infoHeader->biYPelsPerMeter=%d\n",infoHeader->biYPelsPerMeter);
printf("infoHeader->biClrUsed=%d\n",infoHeader->biClrUsed);
printf("infoHeader->biClrImportant=%d\n",infoHeader->biClrImportant);
#endif
memcpy(pBmpFH, fileHeader, sizeof(BmpFileHeader));
memcpy(pBmpIH, infoHeader, sizeof(BmpInfoHeader));
fclose(fp);
free(palette);
palette = NULL;
free(infoHeader);
infoHeader = NULL;
free(fileHeader);
fileHeader = NULL;
return 0;
}
int RGB2BGR(unsigned char *PBuf, int iWidthPix, int iHeightPix)
{
if (PBuf==NULL)
return -1;
int col, row;
unsigned char tmp;
unsigned char *pRed, *pGrn, *pBlu;
for (row=0;row<iHeightPix;++row)
{
for (col=0;col<iWidthPix;++col)
{
pRed = PBuf + row * iWidthPix * 3 + col * 3;
pGrn = PBuf + row * iWidthPix * 3 + col * 3 + 1;
pBlu = PBuf + row * iWidthPix * 3 + col * 3 + 2;
// swap red and blue
tmp = *pRed;
*pRed = *pBlu;
*pBlu = tmp;
}
}
return 0;
}
int BGR2RGB(unsigned char *PBuf, int iWidthPix, int iHeightPix)
{
if (PBuf==NULL)
return -1;
int col, row;
unsigned char tmp;
unsigned char *pRed, *pGrn, *pBlu;
for (row=0;row<iHeightPix;++row)
{
for (col=0;col<iWidthPix;++col)
{
pBlu = PBuf + row * iWidthPix * 3 + col * 3;
pGrn = PBuf + row * iWidthPix * 3 + col * 3 + 1;
pRed = PBuf + row * iWidthPix * 3 + col * 3 + 2;
// swap red and blue
tmp = *pBlu;
*pBlu = *pRed;
*pRed = tmp;
}
}
return 0;
}
/*
* Parameters:
*
* iBuffer: BMP image file data buffer;
* iWidth: image width;
* iHeight: image height;
* iBits: bitscount, such as 8,24
*
*/
int BMPBufBottomToUp(unsigned char* pBuffer, int iWidth, int iHeight, int iBits)
{
int i = 0;
int j = 0;
int iImgWidth = iWidth * iBits /8;
unsigned char temp = 0;
if (pBuffer==NULL)
return -1;
for(i = 0; i < iHeight /2; ++i)
{
for(j = 0; j <iImgWidth; ++j )
{
temp = pBuffer[i*iImgWidth + j];
pBuffer[i*iImgWidth + j] = pBuffer[(iHeight-1-i) * iImgWidth +j];
pBuffer[(iHeight-1-i) * iImgWidth +j] = temp;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -