一.问题

最近在使用CImage类生成图片时,遇到了一个问题,输出的图片上下颠倒,这是什么情况,如何将图片上下颠倒(或者左右颠倒呢),后来来查阅了资料,发现在使用StretchBlt时,通过参数设置可以实现。

二.解决方案

1.首先看一下StretchBlt这个函数功能:

该函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。(函数简介资料来自百度百科)

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);
hdcDest:指向目标设备环境的句柄。
nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。
nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。
hdcSrc:指向源设备环境的句柄。
nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。
nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。
dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。

2.使用场景

使用opengl在当前设备上下文(源HDC)中绘制图形,作为源位图数据,然后利用StretchBlt函数,将源位图数据拷贝至CImage的目标设备上下文(目标HDC),在使用StretchBlt函数时,通过参数设置将源位图数据上下颠倒放入目标HDC,再由CImage导出颠倒后的图片,实现源图片的位置变换

部分代码如下:

//在此前使用Opengl绘制了图形数据,存放于内存BYTE* m_lpBitsOutHDC curDC=CreateCompatibleDC(NULL);  //该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。BYTE *pBits=NULL;//该函数提供一个指针,该指针指向位图位数据值的地方。可以给文件映射对象提供句柄,函数使用文件映射对象//来创建位图,或者让系统为位图分配内存
HBITMAP hBitmap=CreateDIBection(curDC,(BITAMAPINFOR)&lpInfor,DIB_RGB_COLORS,(void**)&pBits,NULL,0);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象
HBITMAP hPrev=(HBITMAP)::SelectObject(curDC,hBitmap);//该函数使用指定的DIB位图中发现的颜色数据来设置位图中的像素
SetDIBits(curDC,hBitmap,0,m_height,m_lpBitsOut,&lpInfor,DIB_RGB_COLORS);CImage img;
img.Create(m_width,m_height,24);
HDC desDC=imag.GetDC();//设置拉伸压缩模式
SetStretchBlMode(desDC,HALFTONE);//图片上下颠倒处理
StretchBlt(desDC,0,0,m_width,m_height,curDC,0,m_height,m_width,-m_height,SRCCOPY);free(m_lpBitsOut);HRESULT hResult=imag.Save(fileDir);//释放资源

c++利用StretchBlt函数改变CImage输出图片的位置相关推荐

  1. 成功解决基于model利用plot_importance()函数出现仅输出一个、两个或者三个等特征(极少的特征)

    成功解决基于model利用plot_importance()函数出现仅输出一个.两个或者三个等特征(极少的特征) 目录 解决问题 解决方法 解决问题 利用plot_importance()函数出现仅输 ...

  2. javascript利用自定义函数向页面输出自定义的表格,在调用函数时通过传递的参数指定表格的行数

    利用自定义函数向页面中输出自定义的表格 <!DOCTYPE html> <html lang="en"> <head><script ty ...

  3. 在Matlab中调整函数和输出图片的位置关系(print)

    这是一次信号与系统的实验课作业,在一张图片中要输出多个函数,而输出的图片如下,函数标题和x轴坐标掺和在了一起.在网上搜索都是成片的代码,这么一个需要形象得描述的问题放那么多抽象的代码看的我实在不舒服. ...

  4. C/C++利用gotoxy()函数改变光标位置的实现方法

    #include <stdio.h> #include<iostream> #include <windows.h> using namespace std; vo ...

  5. PHP中利用EXIF函数集来显示单反照片的EXIF信息

    要成功做到能用EXIF函数显示单反EXIF信息需要一下几个不步骤: 1.修改php.ini的exif相关信息 2.继续修改php.ini信息,找到以下模块,将带exif的配置属性前的;号去掉,然后重启 ...

  6. 查找字符位置_EXCEL函数公式大全之利用FIND函数MID函数提取字符串中间指定文本...

    EXCEL函数公式大全之利用FIND函数和MID函数组合提取字符串中间指定文本.EXCEL函数与公式在工作中使用非常的频繁,会不会使用公式直接决定了我们的工作效率,今天我们来学习一下提高我们工作效率的 ...

  7. Python之seaborn:利用seaborn的color_palette()函数改变绘图界面风格

    Python之seaborn:利用seaborn的color_palette()函数改变绘图界面风格 目录 利用seaborn的color_palette()函数改变绘图界面风格 实现结果 源代码解释 ...

  8. php 输出数组第一个元素,怎么在php中利用reset() 函数输出数组中的第一个元素

    怎么在php中利用reset() 函数输出数组中的第一个元素 发布时间:2021-01-16 09:37:11 来源:亿速云 阅读:66 作者:Leah 本篇文章给大家分享的是有关怎么在php中利用r ...

  9. C语言基础课 编写程序之1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数2.编写一个函数fun(),函数功能是:判断一个整数是否既是5又是7的整倍数,若是,输出yes,不是,输出n

    1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数 #include<stdio.h> #include<math.h> int fun(int n) {in ...

  10. Matlab——Simulink输出的数据怎么利用plot函数绘图

    Matlab--Simulink输出的数据怎么利用plot函数绘图 1.将需要导出的数据添加至To Workspace模块. 2.设置To Workspace模块的名称并配置好模式,一般选择array ...

最新文章

  1. linux rm 提示io异常,Hadoop异常 java.io.IOException: Job status not available
  2. windows xp系统驱动安装问题
  3. C++程序员如何入门Unreal Engine 4
  4. -bash: make: command not found的解决办法
  5. word2vec python实现_教程 | 在Python和TensorFlow上构建Word2Vec词嵌入模型
  6. 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )
  7. python rm 条件_删除文件 (rm)
  8. Cowrie蜜罐的部署(ubt亲测)
  9. php webp decode.h,HCTF两道web题目
  10. linux常用命令示例
  11. 线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)
  12. DRAM原理-Storage Cell
  13. console.log(0.2+0.4===0.6)// true or false??
  14. 看了《天道》,我买了这套书,据说有八卷
  15. Android_listview_video安卓列表视频直接播放
  16. 将一个word文档按一页或多页拆分成多个文档
  17. Oracle怎么统计clob的行数,Oracle CLOB性能
  18. android 带刻度的滑动条_Android实现滑动刻度尺效果
  19. 液体试剂自动配置系统.cs
  20. 事件本体以及突发事件语料库--CEC(Chinese Emergency Corpus)

热门文章

  1. touch 创建一个普通文件或更新已有文件的时间
  2. ls 列出文件、ll以长格式列出文件详细信息
  3. 规范并优化Nginx配置文件
  4. 截取指定字符前_Excel字符函数(1):利用3个函数提取邮箱中的域名
  5. python怎么引入os模块的函数_Python之OS模块函数
  6. c++ opencv4.5.0 头文件_简单的C程序分析(first.c程序)
  7. python turtle画彩虹简单_Python基础实例——绘制彩虹(turtle库的应用)
  8. artcam 9.0英文版本下载_魔兽9.0暗影国度测试服前瞻 可能存在的仙狐坐骑详解
  9. xpath用于HTML文档通过元素,通过Xpath定位元素
  10. java用枚举代替int常量,让你的系统更安全--用枚举enum替代int常量