我的bmp格式图片显示为什么是反的

liujiaji 2009-11-16 10:55:05
我在tcpmp播放器中添加了bmp格式图片显示,但是是翻转的,是什么原因?
...全文
1570 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ515311445 2010-08-13
  • 打赏
  • 举报
回复
LZ是不是添加TCPMP的BMP显示功能呀,能不能把源码晒出来呀
AtoJun 2010-06-11
  • 打赏
  • 举报
回复
把高度设置成负值是可以的。
liujiaji 2009-11-18
  • 打赏
  • 举报
回复
已经解决了,哈哈,在这个过程中,先是倒转,后又是左右倒转,挠登半天,终于解决了。谢谢各位。结贴
pady_pady 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jennyvenus 的回复:]
是从下到上存储的。

[/Quote]
顶,最后一行存储的是第一行数据
liujiaji 2009-11-17
  • 打赏
  • 举报
回复
我用的是tcpmp(开源播放器源码),显示函数(无论什么格式)都用的是BitBlt,应该跟显示函数没有关系吧

我想就是文件存储格式和读的顺序没有搞清楚。
laviewpbt 2009-11-17
  • 打赏
  • 举报
回复
请问你最后显示图像的函数是什么?
liujiaji 2009-11-17
  • 打赏
  • 举报
回复
都不行啊,现在我这个图片显示:取得图片数据大小:biSizeImage值,我想也就循环这么多次,
然后将数据指针移到文件流末尾,
unsigned char *bmpdata;
for (i = 0;i <bmpHeader.biSizeImage;i++)
{
bmpdata[i] = BackwardRead8(p);//读值
}
这样取得了从后往前的文件数据。
这样做之后,图片不是倒转的,但是左右时反的,不知道哪里不对,应该是rgb不匹配或者循环条件不对? 而且颜色还吧对。
liujiaji 2009-11-17
  • 打赏
  • 举报
回复
都不行啊,现在我这个图片显示:取得图片数据大小:biSizeImage值,我想也就循环这么多次,
然后将数据指针移到文件流末尾,
unsigned char *bmpdata;
for (i = 0;i <bmpHeader.biSizeImage;i++)
{
bmpdata[i] = BackwardRead8(p);//读值
}
这样取得了从后往前的文件数据。
这样做之后,图片不是倒转的,但是左右时反的,不知道哪里不对,应该是rgb不匹配或者循环条件不对?

liuchui2009 2009-11-17
  • 打赏
  • 举报
回复
可能有点小错误
要不干脆改成这样试试

BYTE *pData = NULL;
for(int i=0;i<Height;i++)
{
memcpy(pData + i*Width*3, image+ (Height-i-1) * Width*3 , Width*3);//image为你原来的图像
}

liuchui2009 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liujiaji 的回复:]
“(这个是针对24真彩色的, B分量*pData, G分量*(pData + 1) R分量*(pData + 2)) ”

B分量,G分量, R分量,什么意思?
[/Quote]
分别表示RGB图像的三个分量


BYTE *pData = NULL;
DWORD lLineBytes = (Width * bitCount + 31)/32 * 4; //字节对齐
for(int i=0;i<Height;i++)
{
memcpy(pData + i*Width*3, lLineBytes+ (Height-i-1) * Width*3 , Width*3);
}
liujiaji 2009-11-17
  • 打赏
  • 举报
回复
“(这个是针对24真彩色的, B分量*pData, G分量*(pData + 1) R分量*(pData + 2)) ”

B分量,G分量, R分量,什么意思?
liujiaji 2009-11-17
  • 打赏
  • 举报
回复
谢谢,10楼,我试验下你的方法,目前不是翻转的,但是左右时反的啦,
lili0920 2009-11-17
  • 打赏
  • 举报
回复
StretchDIBits
liujiaji 2009-11-17
  • 打赏
  • 举报
回复 1
想像成二维数组,把行进行倒转.

如: 总共10行
0 <->9 交换
1 <->8 交换
2 <->7 交换
3 <->6 交换
4 <->5 交换

然后显示就可以了.

8楼:如何确定行数,可是Height?
就算交换行之后,那么读取数据是从哪里开始,可是距文件首54位之后开始,还是从文件尾开始?
liujiaji 2009-11-16
  • 打赏
  • 举报
回复
“把位图的height设置为负数”没成功,从后往前怎么读啊?
我将指针移动到了数据区域,并取得了数据区域的大小,这样做事倒转的,那么如何从后往前读?多谢
liujiaji 2009-11-16
  • 打赏
  • 举报
回复
谢谢,我试验一下,要是ok,就结贴了
vcTiro 2009-11-16
  • 打赏
  • 举报
回复
BMP的点阵数据是行倒序的!
如果你一行一行的自己显示,得从后往前来,或者把位图的height设置为负数。
用户 昵称 2009-11-16
  • 打赏
  • 举报
回复
是从下到上存储的。
cloudyi 2009-11-16
  • 打赏
  • 举报
回复
不好意思, 刚才的代码有点小问题, 改成:
//pData = lpData + i * lLineBytes + j;(这个是针对灰度的)
//pData = lpData + i * lLineBytes + 3 * j;(这个是针对24真彩色的, B分量*pData, G分量*(pData + 1)
R分量*(pData + 2))

这样就OK了, 一定注意字节对齐
cloudyi 2009-11-16
  • 打赏
  • 举报
回复
//先获取到图像的宽Width, 高Height, 深度bitCount, 及图像数据首地址lpData
//按照下面的操作读取出来就OK了
BYTE *pData = NULL;
DWORD lLineBytes = (Width * bitCount + 31)/32 * 4; //字节对齐
for(int i = Height - 1; i >= 0; i --)
for(int j = 0; j < Width; j ++)
{
//pData = lpData + i * Width + j;(这个是针对灰度的)
//pData = lpData + i * Width + 3 * j;(这个是针对24真彩色的, B分量*pData, G分量*(pData + 1)
R分量*(pData + 2))
}
加载更多回复(5)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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