我把位图保存到硬盘上,但是用系统自带的画图打开发现图像错位了,效果是这样的
这是一只猫,但是用PS或者图片查看器打开显示的结果就正常,谁知道这是什么缘故?
这是一只猫,但是用PS或者图片查看器打开显示的结果就正常,谁知道这是什么缘故?
解决方案 »
- 求助,输出屏幕指定坐标区域的灰度值出错~~~
- MFC如何打开HELP?????????
- 简单的def文件的编译问题!很奇怪~~大家帮帮忙!!!急~~~~~
- 怎样填充五角星内的区域为红色?
- access中怎么取得,一个表的各个数据段信息(数据类型、长度、名称等)...马上结帖啊,
- 谁有可以上传10M附件的HTML空间?借用一下,为大家上传几个网友总结的VC编程的chm文档
- 在VC中怎样求m的N次方?
- 请问C++中两个类如何相互包含使用?
- 用directx时,能载入可执行文件资源中的图片吗.我为什么不行呢,需注意些什么问题呢???
- 创建线程,将一个互斥量HANDLE传递给线程,在子线程中调用WaitForSingleObject发现线程阻塞,但主线程中WaitForSingleObject可以通过(代
- USB20 D 多挂几个模块后速度下降的问题
- 怎样填充用CPen绘制的封闭区域
greyFile.Open("d:\\greyFile.bmp",CFile::modeCreate|CFile::modeWrite);
BITMAPFILEHEADER bfHeader;
BITMAPINFOHEADER biHeader;
memset(&bfHeader,0,sizeof(BITMAPFILEHEADER));
memset(&biHeader,0,sizeof(BITMAPINFOHEADER));
bfHeader.bfType=0x4d42;
bfHeader.bfSize=54+width*height;
bfHeader.bfOffBits=54;
biHeader.biBitCount=8;
biHeader.biCompression=BI_RGB;
biHeader.biHeight=height;
biHeader.biPlanes=1;
biHeader.biSize=sizeof(BITMAPINFOHEADER);
biHeader.biWidth=width; greyFile.Write(&bfHeader,sizeof(BITMAPFILEHEADER));
greyFile.Write(&biHeader,sizeof(BITMAPINFOHEADER));
for(int j=width*height;j>0;j--)
{
greyFile.Write(tempData+j*4+2,1);
}
greyFile.Close();另外还有一个问题,图像的方向变了,猫脸应该是向左的,保存之后就向右了我靠,QQ空间图片还不能引用
8位的图片怎么会有width*height*4这么大的数据
原图是32 位的bmp图像?
代码里N多错误。1、bfHeader.bfSize=54+width*height; //大小计算错误
这个成员反映的是BMP文件的大小
计算公示为:位图文件头大小+位图信息头大小+颜色表大小(位深小于8位才有该项)+位图数据大小
前两项之和对于大部分BMP格式都是(40+14)=54字节,唯独对于16位图像有所区别:X1R5G5B5格式的16位图像他们之后也是54,而 R5G6B5 、 R6G5B5 、 R5G5B6 、X4R4G4B4 、 A1R5G5B5 、 A4R4G4B4格式的话他们的和为(56+14)=70;
实际上这项可以不填写,直接为0,系统也认。2、你的调色板数据没有写,这你自己也说了。3、8位图像数据本身占用的字节数并不是总是 width*height;这个已经不晓得讲过好多遍了。新手总是不注意四字节对齐这个铁规矩。4、如果发现图像倒立了,可以直接把biHeader.biHeight改为biHeader.biHeight=-height,当然也可以直接改变数据的顺序。
代码里N多错误。1、bfHeader.bfSize=54+width*height; //大小计算错误
这个成员反映的是BMP文件的大小
计算公示为:位图文件头大小+位图信息头大小+颜色表大小(位深小于8位才有该项)+位图数据大小
前两项之和对于大部分BMP格式都是(40+14)=54字节,唯独对于16位图像有所区别:X1R5G5B5格式的16位图像他们之后也是54,而 R5G6B5 、 R6G5B5 、 R5G5B6 、X4R4G4B4 、 A1R5G5B5 、 A4R4G4B4格式的话他们的和为(56+14)=70;
实际上这项可以不填写,直接为0,系统也认。2、你的调色板数据没有写,这你自己也说了。3、8位图像数据本身占用的字节数并不是总是 width*height;这个已经不晓得讲过好多遍了。新手总是不注意四字节对齐这个铁规矩。4、如果发现图像倒立了,可以直接把biHeader.biHeight改为biHeader.biHeight=-height,当然也可以直接改变数据的顺序。
还有一个问题,我保存的结果是左右颠倒的,这应该怎么办,为什么用不同软件打开的结果不一样,画图程序正常,photoshop和图片查看器错位,不同软件读取文件的方式不一样吗?
顺便问一下,如果我想全面学习数字图像处理,应该从哪里开始,需要什么基础,我说的是傅里叶变换,小波变换这种数学分析手段
现在不错位了,原来是我吧数据偏移量写错了,没加调色板的256字节,但是猫脸的方向还是不对
要是左右颠倒了for(int j=width*height;j>0;j--)
{
greyFile.Write(tempData+j*4+2,1);
}这里是倒着写的.顺着写就OK了.原始数据的第一个字节对应你的第一个字节.Windows显示的时候会自动从下到上扫描的.这里不用翻转
所以你得用DIB函数。