DIB文件bmHeight为负时,SetDIBitsToDevice函数是怎么处理的? 看《programming windows》上说,是把它转换成相对应的bmHeight为正的DIB,以便用于SetDIBitsToDevice函数,可是原程序中没有第一步,那是在什么时候转换的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CreateDIBSection(..),它不支持负数,应该转换 SetDIBitsToDevice支持吗? 看书上用bmHeight为负的DIB时没见它转换呀? 如果位图是反的(也就是DIB第一条扫描线是最顶的扫描线),那么,把BITMAPINFOHEADER里的bmiHeader.biHeight设为负,就能正确地SetDIBitsToDevice()来显示.. 看书上处理bmHeight为负的格式位图的办法是,把它变成bmHeight为正的位图(pBits位都要倒过来),再交给SetDIBitsToDevice处理,但是例子里在SetDIBitsToDevice之前没有转换的动作,所以有些搞不清楚,是不是SetDIBitsToDevice函数负责对bmHeight为负的函数进行了转换? 但是在bmHeight为负的格式出现前SetDIBitsToDevice函数已经有了,难道现在的SetDIBitsToDevice改写过了? 它本身就支持镜象显示的.不过,即使自己处理,转换一下也只一个循环几句代码罢了:=====================================================================先把BITMAPINFOHEADER里的bmiHeader.biHeight为正BYTE *pLine = NULL;BYTE *pDesLine = NULL;BYTE *TempBits = (BYTE *)malloc(bmpBitsSize);//申请个大小相同的位数据空间if(!TempBits){ TRACE0("alloc memory error\n"); return;}WORD m_nBytePerLine = (bmpLineSize);WORD Q = bmiHeader.biHeight - 1;for(WORD i=0;i< bmiHeader.biheight;++i){ pLine = &((BYTE)pBits)[i*m_nBytePerLine];//指向第一扫描线在顶的“反转图”的第一行 pDesLine = &(TempBits)[Q*m_nBytePerLine];//指向临时位数据最第行 memcpy(pDesLine,pLine,m_nBytePerLine); Q--;}memcpy(pBits,TempBits,bmpBitsSize);//copy回去GdiFlush();===============================================================那么改为正的bmHeight就能SetDIBitsToDevice()正常显示 手快快,写错了几个 >_<应为:for(WORD i=0;i< bmiHeader.biHeight;++i){ pLine = &((BYTE *)pBits)[i*m_nBytePerLine];//指向第一扫描线在顶的“反转图”的第一行 pDesLine = &(TempBits)[Q*m_nBytePerLine];//指向临时位数据最第行 memcpy(pDesLine,pLine,m_nBytePerLine); Q--;} 倒。。漏了.....free(TempBits)....kakaka..漏这错那又3帖ing(汗)灌得开心..水饺去也~~~ ^00^ 如何将程序嵌入到系统任务栏中,类似原来的搜索引擎 求一个 Socket Tcp/Udp 调试程序的源代码 多线程 socket缓冲区 数据累加接收怎么办? vc下如何给主机A发送数据包(tcp协议)?用什么函数? 昨天没工作了,散分! createfilemaping????????? 我的同事和我說: csdn論壇太差勁了!!! 知道函数的地址,用什么语句去调用啊~(不用汇编中的call语句) 高分求教菜问题! 为什么安装MSDN Library-2000 July后不能使用? 有没有国际软件开发论坛,或者国际上比较著名的软件开发论坛? 求VC+数据库编程的书
不过,即使自己处理,转换一下也只一个循环几句代码罢了:
=====================================================================
先把BITMAPINFOHEADER里的bmiHeader.biHeight为正BYTE *pLine = NULL;
BYTE *pDesLine = NULL;
BYTE *TempBits = (BYTE *)malloc(bmpBitsSize);//申请个大小相同的位数据空间
if(!TempBits)
{
TRACE0("alloc memory error\n");
return;
}
WORD m_nBytePerLine = (bmpLineSize);
WORD Q = bmiHeader.biHeight - 1;for(WORD i=0;i< bmiHeader.biheight;++i)
{
pLine = &((BYTE)pBits)[i*m_nBytePerLine];//指向第一扫描线在顶的“反转图”的第一行
pDesLine = &(TempBits)[Q*m_nBytePerLine];//指向临时位数据最第行
memcpy(pDesLine,pLine,m_nBytePerLine);
Q--;
}
memcpy(pBits,TempBits,bmpBitsSize);//copy回去
GdiFlush();
===============================================================
那么改为正的bmHeight就能SetDIBitsToDevice()正常显示
应为:
for(WORD i=0;i< bmiHeader.biHeight;++i)
{
pLine = &((BYTE *)pBits)[i*m_nBytePerLine];//指向第一扫描线在顶的“反转图”的第一行
pDesLine = &(TempBits)[Q*m_nBytePerLine];//指向临时位数据最第行
memcpy(pDesLine,pLine,m_nBytePerLine);
Q--;
}
漏了.....free(TempBits)....kakaka..漏这错那又3帖ing(汗)
灌得开心..水饺去也~~~ ^00^