图像灰度化四字节对齐问题

wangw89 2011-01-09 02:38:21
各位大侠看一下,为什么我的程序总是显示的倾斜呢,我已经对齐了呀,难道对齐的不对吗?帮帮忙啊,急!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef unsigned long LONG;
typedef unsigned char BYTE;


#pragma pack (2)
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;

typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
#pragma pack ()






void main()
{
FILE *sourcefile,*targetfile;
int i,j,m,n,k,x;
BYTE *sourcebuf;
BYTE *targetbuf;
BYTE color[3];


//位图文件头和信息头
BITMAPFILEHEADER sourcefileheader,targetfileheader;
BITMAPINFOHEADER sourceinfoheader,targetinfoheader;
RGBQUAD rgbquad[256];
//初始化头内存空间
memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));
memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));
//打开本文件里的bmp文件
sourcefile=fopen("e.bmp","rb");
//提取原图文件头
fread((void*)&sourcefileheader,1,sizeof(BITMAPFILEHEADER),sourcefile);
if(sourcefileheader.bfType!=0x4d42)
{
fclose(sourcefile);
printf("this is not bmp file!");
return;
}
//提取文件信息头
fread((void*)&sourceinfoheader,1,sizeof(BITMAPINFOHEADER),sourcefile);
if(sourceinfoheader.biBitCount!=24)
{
fclose(sourcefile);
printf("this is not 24bit file!");
return;
}


//这里是因为BMP规定保存时长度和宽度必须是4的整数倍,如果不是则要补足

m=sourceinfoheader.biWidth;
x=(sourceinfoheader.biWidth+3)/4*4;
n=sourceinfoheader.biHeight;


sourcebuf=(BYTE*)malloc(x*n*3);
//读取原图的颜色矩阵信息

fread(sourcebuf,1,x*n*3,sourcefile);
fclose(sourcefile);
targetbuf=(BYTE*)malloc(x*n);

//通过原图颜色矩阵信息得到灰度图的矩阵信息
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k=0; k<3; k++)
{color[k]=sourcebuf[(i*m+j)*3+k]; }
targetbuf[(i*x)+j]=(color[0]*11+color[1]*59+color[2]*30)/100;


if(targetbuf[(i*x)+j]>255)
targetbuf[(i*x)+j]=255;
}
}


//构造灰度图的文件头
targetfileheader.bfOffBits=54+sizeof(RGBQUAD)*256;
targetfileheader.bfSize=targetfileheader.bfOffBits+sourceinfoheader.biHeight*sourceinfoheader.biWidth;
targetfileheader.bfReserved1=0;
targetfileheader.bfReserved2=0;
targetfileheader.bfType=0x4d42;

//构造灰度图的信息头
targetinfoheader.biBitCount=8;
targetinfoheader.biSize=40;
targetinfoheader.biHeight=sourceinfoheader.biHeight;
targetinfoheader.biWidth=sourceinfoheader.biWidth;
targetinfoheader.biPlanes=1;
targetinfoheader.biCompression=0;
targetinfoheader.biSizeImage=sourceinfoheader.biHeight*sourceinfoheader.biWidth;
targetinfoheader.biXPelsPerMeter=sourceinfoheader.biXPelsPerMeter;
targetinfoheader.biYPelsPerMeter=sourceinfoheader.biYPelsPerMeter;
targetinfoheader.biClrImportant=0;
targetinfoheader.biClrUsed=256;

//构造灰度图的调色版
for(i=0;i<256;i++)
{
rgbquad[i].rgbBlue=i;
rgbquad[i].rgbGreen=i;
rgbquad[i].rgbRed=i;
rgbquad[i].rgbReserved=0;
}

targetfile=fopen("r.bmp","wb");
//写入灰度图的文件头,信息头和调色板信息
fwrite((void*)&targetfileheader,1,sizeof(BITMAPFILEHEADER),targetfile);
fwrite((void*)&targetinfoheader,1,sizeof(BITMAPINFOHEADER),targetfile);
fwrite((void*)&rgbquad,1,sizeof(RGBQUAD)*256,targetfile);
//写入图像数据

fwrite((void*)targetbuf,1,x*n+1,targetfile);
fclose(targetfile);

}
...全文
261 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
never12345678 2011-06-09
  • 打赏
  • 举报
回复
楼主真是个sb
搞定了就不能分享一下
希望以后楼主的帖子没人回。。
大道曙光 2011-03-10
  • 打赏
  • 举报
回复
好贴 不过给句柄的有效性加个判断
Awey_001 2011-01-26
  • 打赏
  • 举报
回复
怎么搞定的啊?都不贴出来?
wangw89 2011-01-10
  • 打赏
  • 举报
回复
哎呀,终于搞定了!
wangw89 2011-01-09
  • 打赏
  • 举报
回复
不知道啊,总是倾斜,
renxu350 2011-01-09
  • 打赏
  • 举报
回复
以前碰到过类似问题,是不是显存中会进行32位补齐?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧