1.问题分析:

Windows系统显示图像有视口和窗口两个概念,视口就是展现在显示器的区域,窗口就是源图像的位置,窗口一般是加载到windows系统的图片文件。视口一般是CRect定义的,坐标原点位于左上角。而窗口坐标即图片文件坐标在左下角,DrawDIBDraw也就是从左下角开始读数据,所以当视口和窗口的坐标不变的时候,视口中的图像是颠倒的,原因就是图片文件的最下层显示在了视口的最上层。

2.解决方法:

把视口的坐标原点调整到与窗口坐标即图片文件坐标一致,都移到左下角。

3.程序实现:

以下代码红色字体即为调整视口坐标的代码,

A.    int iMapMode= pDC->SetMapMode(MM_ANISOTROPIC);

设置模式

B.     pDC->SetViewportExt(1,-1);

设置视口范围,前一个参数表示横坐标,后一个参数表示纵坐标,正数表示范围不变,负数表示翻转。这里(1,-1)表示视口坐标范围横坐标不变,纵坐标翻转,由原来的从上向下,变成从下向上。

C.     pDC->SetViewportOrg(rcDraw.left,rcDraw.bottom);

设置视口原点坐标,用left和bottom作为原点,也就是把坐标原点移到左下角。

D.    DrawDibDraw(hdd,hdc1,0, 0, rcDraw.Width(),rcDraw.Height(), &pBitmapInfo->bmiHeader,data,

0,0,img_draw.cols,img_draw.rows, DDF_SAME_DRAW|DDF_SAME_HDC);

坐标原点还按原来来写,都是0,0。

E.     pDC->SetMapMode(iMapMode);

恢复原来模式

F. 源代码

void DrawImage(Matimg,CRect rcDraw,CDCpDC,HDRAWDIB hdd)

{

...

//HDRAWDIBhdd = DrawDibOpen();//移到initDlg()函数中,原因是它耗用90%的时间

HDC hdc1 =pDC->GetSafeHdc();

BOOL rst =DrawDibBegin(hdd,hdc1, rcDraw.Width(),rcDraw.Height(),&pBitmapInfo->bmiHeader,img_show.cols,img.rows, DDF_SAME_HDC);

DrawDibRealize(hdd,hdc1, FALSE);

LPVOID data =img_show.data;

intiMapMode = pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetViewportExt(1,-1);

pDC->SetViewportOrg(rcDraw.left,rcDraw.bottom);

DrawDibDraw(hdd,hdc1,0, 0,rcDraw.Width(),rcDraw.Height(),&pBitmapInfo->bmiHeader,data,

0,0, img_show.cols,img_show.rows,DDF_SAME_DRAW|DDF_SAME_HDC);

pDC->SetMapMode(iMapMode);

DrawDibEnd(hdd);

DrawDibClose(hdd);

...

}

4.     DrawDIBDraw和StrentchBlt效率比较

单个函数比较,前者较后者几乎提高3倍速度,但DrawDibOpen()函数非常慢,如果把它和DrawDIBDraw放在一个函数内,几乎占用90%的时间,所以这个函数要在外部执行。对于实时系统,连续不断执行DrawDIBDraw时,要把(HDRAWDIB hdd = DrawDibOpen())这句代码移到函数外,只执行一次,把HDRAWDIB参数传进来即可。

参考链接:http://bbs.csdn.net/topics/390168489

DrawDIBDraw显示图像颠倒的解决方法相关推荐

  1. eclipse/myeclipse中快捷键 Ctrl+shift+down/up 出现屏幕颠倒的解决方法

    1.原因:快捷键被占用 2.解决 如果是被其它软件占用,则修改其它软件的快捷键. 查看快捷键是否被占用工具:http://download.csdn.net/download/muyeju/99994 ...

  2. 计算机显示器不显示图像,电脑显示器没有画面的解决方法

    电脑显示器没有画面的解决方法 电脑显示器没有画面的原因分析: 电脑显示器没有画面三个原因导致:显示器.CRT连接先,PC.显示器检测就是拔掉CRT连接线,看有没有"无信号"的显示, ...

  3. matlab 显示图像 画布太大,canvas画图被放大且模糊的解决方法

    先来理解canvas的这几个宽度和高度 canvas.width是画布的大小,而canvas.style.width是浏览器渲染的canvas的尺寸 第一个问题:画布的高度和宽度 画布的宽和高一定要在 ...

  4. MYSQL转换编码的解决方法

    MYSQL转换编码的解决方法 一.在utf8的mysql下 得到中文'游客'的gbk下的16进制编码 mysql> SELECT hex(CONVERT( '游客' USING gbk )); ...

  5. vs opencv4 imread读不到图片问题的解决方法

    vs opencv4.0.1 imread读不到图片问题的解决方法 本人最近初学openCV ,其间就遇到了这个问题,上网搜索了一下,发现很多网友都有这个问题,网上也没有很明确的解释,在这里,我就详细 ...

  6. python彩色图像如何进行高斯滤波ValueError: correlate2d inputs must both be 2-D arrays解决方法

    文章目录 遇到的问题 解决方法 参考 遇到的问题 在执行高斯滤波的代码时,遇到下列问题 ValueError: correlate2d inputs must both be 2-D arrays 进 ...

  7. python Clipping input data to the valid range for imshow with RGB data解决方法

    文章目录 遇到的问题 全部代码 参考 遇到的问题 第一点,遇到的问题是 Clipping input data to the valid range for imshow with RGB data ...

  8. python绘图使用subplots出现标题重叠的解决方法

    文章目录 遇到的问题 解决方法 参考 先上图 遇到的问题 使用plt.subplots(2,2)绘图时,子图的标题和上图重叠,影响观感: 源代码: import numpy as np from sc ...

  9. getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...

    本文告诉大家电脑显示器花屏怎么办呢,电脑显示器花屏解决方法和原因分析: 指电脑屏幕上有与常色不同的条纹,斑点或色块,或有位置颠倒.错乱,屏幕抖动.扭曲等情况. 显示器花屏是极其常见的故障,产生的原因有 ...

最新文章

  1. POJ1679判断最小生成树的唯一性
  2. ATT汇编leave指令
  3. bean validation校验方法参数_Spring Boot 之使用 validation 验证参数
  4. canvas学习之柱状图
  5. SSIS 连接ORACLE 无法从 SQL 命令中提取参数的解决方案
  6. APP审核关于3.2.1金融资格的审核回复苹果
  7. 软件工程Java毕设 SSM药品管理系统(含源码+论文)
  8. 文件管理之:打包、压缩
  9. fullCalendar日程表在Vue项目中的应用
  10. 生成条形码二维码DataMatrix条码.EAN码.39码.交叉25码.UPC码.128码.93码.ISBN码.Codabar等...
  11. 计算机技术与软件专业技术资格(水平)考试岗位设置与描述
  12. codevs 1024 一塔湖图 floyd 解题报告
  13. oracle软件工程,.Net软件工程师学用Oracle系列(9):系统函数(上)
  14. SHA1 简单介绍以及使用
  15. Python量化投资——股票择时到底能否赚钱?ADX指标的有效性回测
  16. AMD Opteron 185 + ATI RDX200 安装雪豹成功。
  17. 关于typedef和的一点分享
  18. 基于Servlet WebSocket MySQL实现的网络在线考试系统
  19. 视频怎么做gif表情包?教你一个快速生成的方法
  20. 最新下载精密轨道数据地址!

热门文章

  1. c语言小红今年12岁小明13岁,一年级思维拓展题.docx
  2. 解决Dreamweaver8无法打开的问题
  3. 个人PC轻松使用教程
  4. java学业有成_学业有成的祝福语
  5. 浅谈Kernel32.dll(Windows平台下必有的动态库文件)
  6. Photoshop如何使用通道之实例演示?
  7. 2019-8-9 考试总结
  8. saltstack pillar设置iptables
  9. 小白进阶之百度云加速Error522链接超时解决办法
  10. chrome 中如何模拟网速变慢的情况?