32位真彩图转为8位灰度图 可是转化后的图像全黑解决思路
32位真彩图转为8位灰度图 可是转化后的图像全黑
代码是参考别人的,转化后的图片我用VC++6.0打开可以显示灰度图,但是直接用看图工具打开是全黑的
[code=C/C++][/code]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
FILE* pSrcBmpFile;
FILE* pDestBMpFile;
/*************************************************/
/*BMP的文件头结构*/
/*************************************************/
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;//文件大小
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;//数据区的起始位置,基点是位图数据区相对文件头部的偏移量。单位为字节
} BITMAPFILEHEADER;
/***********************************************/
/*BMP位图信息头结构*/
/***********************************************/
typedef struct tagBItMAPINFOHEADER
{
DWORD biSize;//本结构占用字节数。实际上该结构占用40个字节
LONG biWidth;//位图的高度,单位为像素
LONG biHeight;//位图的宽度,单位为像素
WORD biPlanes;//目标设备的平面数,约定必须为1
WORD biBitCount;//每个像素所需的位数
DWORD biCompression;//位图的压缩类型
DWORD biSizeImage;//位图大小,单位为字节
LONG biXPelsPerMeter;//水平分辨率,设为0
LONG biYPelsPerMeter;//垂直分辨率,设为0
DWORD biClrUsed;//位图实际使用的颜色表中的颜色数,设为0
DWORD biClrImportant;//位图显示过程中重要的颜色数,设为0
} BITMAPINFOHEADER;//该结构占用40个字节
/************************************************/
/*彩色表*/
/************************************************/
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
void GetBmpHeader(BITMAPFILEHEADER*,BITMAPINFOHEADER*);
void ChangeBmpHeader(BITMAPFILEHEADER*,BITMAPINFOHEADER*);
void SetBmpHeader(const BITMAPFILEHEADER*,const BITMAPINFOHEADER*);
void SetRGBQUAD();
void RgbToGray();
int main()
{
BITMAPFILEHEADER* bitHead;
BITMAPINFOHEADER* bitInfoHead;
if((pSrcBmpFile = fopen("apple.bmp","rb")) == NULL)
{
printf("Can't open source image!\n");
return -1;
}
if((pDestBMpFile = fopen("Done.bmp","wb")) == NULL)
{
printf("Can't open destination image!\n");
return -1;
}
bitHead = (BITMAPFILEHEADER* )malloc(sizeof(BITMAPFILEHEADER));
bitInfoHead = (BITMAPINFOHEADER* )malloc(sizeof(BITMAPINFOHEADER));
rewind(pSrcBmpFile);//获取文件头
GetBmpHeader(bitHead,bitInfoHead);
if(bitHead->bfType != 0x4d42)
{
printf("This image is not a bmp file!\n");
fclose(pSrcBmpFile);
fclose(pDestBMpFile);
return -1;
}
RgbToGray();
fclose(pSrcBmpFile);
fclose(pDestBMpFile);
}
void GetBmpHeader(BITMAPFILEHEADER* bitHead,BITMAPINFOHEADER* bitInfoHead)
{
fread(bitHead,sizeof(BITMAPFILEHEADER)-2,1,pSrcBmpFile);
fread(bitInfoHead,sizeof(BITMAPINFOHEADER),1,pSrcBmpFile);
}
void ChangeBmpHeader(BITMAPFILEHEADER* bitHead,BITMAPINFOHEADER* bitInfoHead)
{
bitHead->bfType = 0x4d42;
//bitHead->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) + 640 * 480;
bitHead->bfSize = 4;
bitHead->bfReserved1 = 0;
bitHead->bfReserved2 = 0;
//bitHead->bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
bitHead->bfOffBits = 0;
bitInfoHead->biSize = sizeof(BITMAPINFOHEADER);
bitInfoHead->biWidth = 640;
bitInfoHead->biHeight = 480;
bitInfoHead->biPlanes = 1;
bitInfoHead->biBitCount = 8;
bitInfoHead->biCompression = 0;
bitInfoHead->biSizeImage = 0;
bitInfoHead->biXPelsPerMeter = 0;
bitInfoHead->biYPelsPerMeter = 0;
bitInfoHead->biClrUsed = 0;
代码是参考别人的,转化后的图片我用VC++6.0打开可以显示灰度图,但是直接用看图工具打开是全黑的
[code=C/C++][/code]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
FILE* pSrcBmpFile;
FILE* pDestBMpFile;
/*************************************************/
/*BMP的文件头结构*/
/*************************************************/
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;//文件大小
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;//数据区的起始位置,基点是位图数据区相对文件头部的偏移量。单位为字节
} BITMAPFILEHEADER;
/***********************************************/
/*BMP位图信息头结构*/
/***********************************************/
typedef struct tagBItMAPINFOHEADER
{
DWORD biSize;//本结构占用字节数。实际上该结构占用40个字节
LONG biWidth;//位图的高度,单位为像素
LONG biHeight;//位图的宽度,单位为像素
WORD biPlanes;//目标设备的平面数,约定必须为1
WORD biBitCount;//每个像素所需的位数
DWORD biCompression;//位图的压缩类型
DWORD biSizeImage;//位图大小,单位为字节
LONG biXPelsPerMeter;//水平分辨率,设为0
LONG biYPelsPerMeter;//垂直分辨率,设为0
DWORD biClrUsed;//位图实际使用的颜色表中的颜色数,设为0
DWORD biClrImportant;//位图显示过程中重要的颜色数,设为0
} BITMAPINFOHEADER;//该结构占用40个字节
/************************************************/
/*彩色表*/
/************************************************/
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
void GetBmpHeader(BITMAPFILEHEADER*,BITMAPINFOHEADER*);
void ChangeBmpHeader(BITMAPFILEHEADER*,BITMAPINFOHEADER*);
void SetBmpHeader(const BITMAPFILEHEADER*,const BITMAPINFOHEADER*);
void SetRGBQUAD();
void RgbToGray();
int main()
{
BITMAPFILEHEADER* bitHead;
BITMAPINFOHEADER* bitInfoHead;
if((pSrcBmpFile = fopen("apple.bmp","rb")) == NULL)
{
printf("Can't open source image!\n");
return -1;
}
if((pDestBMpFile = fopen("Done.bmp","wb")) == NULL)
{
printf("Can't open destination image!\n");
return -1;
}
bitHead = (BITMAPFILEHEADER* )malloc(sizeof(BITMAPFILEHEADER));
bitInfoHead = (BITMAPINFOHEADER* )malloc(sizeof(BITMAPINFOHEADER));
rewind(pSrcBmpFile);//获取文件头
GetBmpHeader(bitHead,bitInfoHead);
if(bitHead->bfType != 0x4d42)
{
printf("This image is not a bmp file!\n");
fclose(pSrcBmpFile);
fclose(pDestBMpFile);
return -1;
}
RgbToGray();
fclose(pSrcBmpFile);
fclose(pDestBMpFile);
}
void GetBmpHeader(BITMAPFILEHEADER* bitHead,BITMAPINFOHEADER* bitInfoHead)
{
fread(bitHead,sizeof(BITMAPFILEHEADER)-2,1,pSrcBmpFile);
fread(bitInfoHead,sizeof(BITMAPINFOHEADER),1,pSrcBmpFile);
}
void ChangeBmpHeader(BITMAPFILEHEADER* bitHead,BITMAPINFOHEADER* bitInfoHead)
{
bitHead->bfType = 0x4d42;
//bitHead->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) + 640 * 480;
bitHead->bfSize = 4;
bitHead->bfReserved1 = 0;
bitHead->bfReserved2 = 0;
//bitHead->bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
bitHead->bfOffBits = 0;
bitInfoHead->biSize = sizeof(BITMAPINFOHEADER);
bitInfoHead->biWidth = 640;
bitInfoHead->biHeight = 480;
bitInfoHead->biPlanes = 1;
bitInfoHead->biBitCount = 8;
bitInfoHead->biCompression = 0;
bitInfoHead->biSizeImage = 0;
bitInfoHead->biXPelsPerMeter = 0;
bitInfoHead->biYPelsPerMeter = 0;
bitInfoHead->biClrUsed = 0;