Qt显示wmf格式图片
Qt显示wmf格式图片
夸平台的Qt不并不支持Auto CAD的输出图wmf。那么怎么才能在Qt下显示wmf格式图片呢?智能用win32 api了。具体过程下面一一介绍。
首先说明下怎么在Qt下使用windows的api。
1、包含库文件:#include <windows.h>。
2、找到lib文件。从vc中拷贝也好,从网上下载也好,找到gdi32.lib。并把它放在mingw中的lib文件夹下,然后在工程文件.pro中加入 LIBS += -lgdi32 。
3、如果想做成发布文件的话,当然还要在加入gdi32.dll文件。
接着就看代码怎么写了。新建一个工程,这里就选QWidget类型的吧。然后在widget.h文件中加入以下代码:
typedef struct tagOLDRECT
{ short left;
short top;
short right;
short bottom;}
OLDRECT;typedef struct
{ DWORD key;
WORD hmf;
OLDRECT bbox;
WORD inch;
DWORD reserved;
WORD checksum;}
ALDUSMFHEADER;
typedef struct{
qint16 Left;
qint16 Top;
qint16 Right;
qint16 Bottom;
} PWMFRect16;
struct WmfPlaceableFileHeader{
UINT32 Key;
qint16 Hmf;
PWMFRect16 BoundingBox;
qint16 Inch;
UINT32 Reserved;
qint16 Checksum;
}; 这些代码是准备工作,提供显示需要用到的一些结构数据。
然后在加入成员变量:
ALDUSMFHEADER m_aldusMFHeader;
HANDLE h_emf;
准备工作做好了,接着来看实现部分:
重写PaintEvent函数,并在里面加入以下代码:
QPainter painter(this); //用win32 api显示wmf格式图片部分
QFile file(fileName);
file.open(QIODevice::ReadOnly);
DWORD dwIsAldus;
METAHEADER mfHeader;
DWORD dwSize;
DWORD seekpos;
if(file.read((char *)&dwIsAldus, sizeof(dwIsAldus)) != sizeof(dwIsAldus))
;
if (dwIsAldus != ALDUSKEY)
{ seekpos = 0;
memset(&m_aldusMFHeader,0, sizeof(m_aldusMFHeader));
} else
{ file.seek(0);
if (file.read((char *)&m_aldusMFHeader, ALDUSMFHEADERSIZE) != ALDUSMFHEADERSIZE) seekpos = ALDUSMFHEADERSIZE; }
file.seek(seekpos);
if (file.read((char *)&mfHeader, sizeof(mfHeader)) != sizeof(mfHeader))
if ((mfHeader.mtType != 1) && (mfHeader.mtType != 2))
;
dwSize = mfHeader.mtSize * 2;
BYTE* lpMFBits = new BYTE [dwSize];
if (lpMFBits == NULL)
; file.seek(seekpos);
if (file.read((char *)lpMFBits, dwSize) == dwSize)
{ h_emf =SetWinMetaFileBits(dwSize, lpMFBits,NULL , NULL);
QRect rect(0,0,this->width()*2,this->height());
PlayEnhMetaFile(painter.paintEngine()->getDC(),(HENHMETAFILE__*)h_emf,(RECT*)&rect); //关键的一行,显示用的。 }
显示部分的代码主要是这么个过程:创建图元文件,得到wmf的句柄,然后转换成emf格式,然后在将emf显示出来。如果有兴趣可以仔细看下。没兴趣的话,注意下这里最后一条函数,就是用来显示emf的函数,因为这里的参数关系到显示的结果。
PlayEnhMetaFile(painter.paintEngine()->getDC(),(HENHMETAFILE__*)h_emf,(RECT*)&rect);
第一个参数是设备上下文句柄,就是你要画在哪个设备上。第二个参数是emf文件的句柄。关键是第三个参数,控制显示的位置,以及显示的大小。因为wmf是矢量图,所以是没有大小的,显示结果完全由这个rect来控制。
这样我们就实现了Qt下wmf的显示。
如果你想把wmf放到一个较大的工程中,而不是简单的图片显示器的话,你或许会发现一个问题。画图时会把内容画到旁边的窗口上。例如一个mainWindow有toolbar、label、widget等子窗口,而你在widget里画图,如果你想显示的很大,结果就会画到旁边的窗口中。这个问题到目前为止我还有找到解决的办法。因为Qt中用QPainter、QPaintEngine、QPaintDevice来实现2D画图。决定怎么在设备上画的,是封装好的QPaintEngine,而QPaintEngine是不对用户开放的。Qt跟windows本来就不是一回事,非要用Qt来显示Wmf就会出现一些不兼容。
在CSDN上层看见一大侠发的帖子,其中讲到重在PaintEngine函数,返回NULL来解决这个问题,我实验了下,没有起作用。也不知是我代码错了,还是怎么的。希望有路过的大侠可以指点下。
Qt显示wmf格式图片相关推荐
- 学习QT之显示SVG格式图片
SVG的英文全称是Scalable Vector Graphics,即可缩放的矢量图形.它是有万维网联盟在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网格矢量图形标准,是一个开发的图形标 ...
- OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作
OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...
- 【数字图像处理】一.MFC详解显示BMP格式图片
本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...
- MFC详解显示BMP格式图片
本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...
- 如何将CAD转换为WMF格式图片?
WMF图片是由简单的线条和封闭线条(图形)组成的矢量图,如何将CAD转换为WMF格式图片?今天就给大家具体演示一下.演示操作如下: cad转wmf转换器 https://www.xunjiecad.c ...
- WMF格式图片的特点
CAD制图过程中,我们常常会转换CAD图纸的各种格式.其中就有WMF格式,WMF格式是一种图元文件,图元文件的扩展名包括.WMF和.EMF两种.今天我想和大家简单的分享一下WMF格式图片的特点. WM ...
- 怎样把CAD转换为WMF格式图片呢?
WMF图片是由简单的线条和封闭线条(图形)组成的矢量图,其主要特点是文件非 常小,可以任意缩放而不影响图像质量.怎样把CAD转换为WMF格式图片呢?今天就给大家具体演示一下.演示操作如下: cad转w ...
- QT显示Raw格式的图片
在使用QT进行图像显示时,对于如jpg和png等图片格式的实现可以借助QT很方便的就实现,但是使用QT显示Raw数据时,则相对麻烦一点,主要的原因在于Raw格式的图片不包含关于图片的高度.宽度和数据类 ...
- osd 显示 png格式图片水印
最近做音视频项目需要做水印,且提供的水印为png格式图片,通过学习和尝试,终于解决.osd需要的是显示内容的数据,其核心就是将png图片解码成一系列数据. 解码库版本:libpng-1.6.35 1. ...
最新文章
- OpenGL + VS2015 + Windows10配置
- 用存储过程生成记录编号
- 对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...
- aptitude安装出现依赖_oeasy 教您玩转linux 之 010210 应用管理 aptitude
- 设计模式(十)——抽象工厂模式
- 多线程----join插队
- 亲历腾讯WEB前端开发三轮面试经历及面试题
- 循环队列的java结构_java数据结构之循环队列(数组实现)
- 《Web安全之机器学习入门》一 第3章 机器学习概述
- ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?
- 求职过程记录(4)——启明星出现
- linux内核文件cache机制,Linux内核文件Cache机制
- 一体机的扫描至网络共享的设置
- 搭建以太坊私有链-单机2节点
- JavaSE——多线程
- 科研写作之word技巧——首行缩进、图 表 公式 自动编号和引用、子标题细节
- 查看linux是多少位
- 逆时针旋转某一角度的旋转矩阵
- 开发工具篇第三讲:Maven从入门到实战
- MySQL必知必会二十三:使用存储过程