急问!关于BitBlt和StretchBlt的奇怪问题!!~~

liangyan1120_0 2007-08-22 03:20:45
我先在内存中用CreateDIBSection创建了一幅位图,再把这幅位图选到一个兼容DC中,然后就dcCompatible.SetPixel(……)画图,但是最后用StretchBlt拷贝到屏幕上时却是黑色的,但是用BitBlt就是正常的灰度图,由于数据量很大,所以必须用StretchBlt,真是很奇怪啊!!!补充一下,位图没有超出定义的范围,每个像素的灰度值也是对的。请各位大师指点一下,感谢!
...全文
850 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ringphone 2007-08-24
  • 打赏
  • 举报
回复
宽高比很大的话StretchBlt异常,这个我以前碰到过,没办法解决,最后是自己写的缩放代码。搜索一下自己写缩放吧。
liangyan1120_0 2007-08-24
  • 打赏
  • 举报
回复
CClientDC dc(this);
//设置位图信息
BITMAPINFOHEADER BMIH;
memset(&BMIH,0,sizeof(BITMAPINFOHEADER));
BYTE * pDrawingSurfaceBits=NULL;
BMIH.biSize=sizeof(BITMAPINFOHEADER);
BMIH.biWidth=N;
BMIH.biBitCount=24;
BMIH.biPlanes=1;
BMIH.biCompression=BI_RGB;
BMIH.biHeight=m_num2;
BMIH.biSizeImage=((((BMIH.biWidth*BMIH.biBitCount)+31) & ~31)>>3)*BMIH.biHeight;
if(hbitmap != NULL)
{
DeleteObject(hbitmap);
hbitmap=NULL;
}
hbitmap=CreateDIBSection(dc.GetSafeHdc(),(CONST BITMAPINFO *)&BMIH,DIB_RGB_COLORS, (void **)&pDrawingSurfaceBits,
NULL,0);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(&dc);
HBITMAP hOldBitmap=(HBITMAP)SelectObject(dcCompatible.GetSafeHdc(),hbitmap);
int a;
float k=255.00/(max-min);
for(i=0;i<N;i++)
{
for(j=0;j<m_num2;j++)
{
a=(int)k*(atof(array2[i][j])-min);
dcCompatible.SetPixel(i,j,RGB(a,a,a));
}
}
dc.StretchBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(),&dcCompatible,0,0,N,m_num2,SRCCOPY);
SelectObject(dcCompatible.GetSafeHdc(),hOldBitmap);
其中N是横向的大小,m_num2是纵向的大小,hbitmap是个全局变量,array2存放的是要转化成灰度的数据,max,min分别是这些数据中的最大值和最小值,我把最大值映射为255,最小值映射为0,其它的做线性映射。在程序中N=100,m_num2大概为18267,我已经跟踪调试程序,转化的灰度值a不是0~~
livedeal 2007-08-24
  • 打赏
  • 举报
回复
贴代码,这种就不用去怀疑函数,一定是你的代码哪里出错了
liangyan1120_0 2007-08-24
  • 打赏
  • 举报
回复
回复ringphone,我的图的宽高比确实很大,有什么解决的方法吗???
liangyan1120_0 2007-08-24
  • 打赏
  • 举报
回复
谢谢楼上!
ringphone 2007-08-23
  • 打赏
  • 举报
回复
你的图是不是宽高比很大?如果宽高比例超出某一数值StretchBlt就会有你说的那种情况。
菜牛 2007-08-22
  • 打赏
  • 举报
回复
代码
liangyan1120_0 2007-08-22
  • 打赏
  • 举报
回复
我用的是SetPixel,没有用画笔
jhs1982419 2007-08-22
  • 打赏
  • 举报
回复
你最后释放画笔没呀?
liangyan1120_0 2007-08-22
  • 打赏
  • 举报
回复
我试过了,图都变成一个颜色的了!!!这是怎么回事?
yuucyf 2007-08-22
  • 打赏
  • 举报
回复
在StretchBlt前面加上
int oldeMode=dc.SetStretchBltMode(COLORONCOLOR);

16,472

社区成员

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

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

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