Qt中QPainter提供了绘制图像的API,极大地方便了我们对图像的绘制。

Qt中提供了QPixmap, QBitmap,QBitMapQImage,QPicture等图像绘图设备,它们的类关系如下图所示:

QPixmap继承了QPaintDevice,您可用以建立QPainter并于上进行绘图,您也可以直接指定图案加载Qt所支持的图档,像是BMP、GIF、JPG、JPEG、PNG等,并使用QPainter的drawPixmap()绘制在其它的绘图装置上。您可以在QLabel、QPushButton上设定QPixmap以显示图像。QPixmap是针对屏幕显示图像而设计并最佳化,依赖于所在平台的原生绘图引擎,所以一些效果的展现(像是反锯齿),在不同的平台上可能会有不一致的结果。

QBitmap是QPixmap的子类别,提供单色图像,可用于制作光标(QCursor)或笔刷(QBrush)物件。

QPixmap使用平台的绘图引擎,在不同的平台所呈现的效果不一,无法提供个别像素的存取,QImage使用Qt自身的绘图引擎,可提供在不同平台上相同的图像呈现效果,并可透过setPixpel()、pixel()等方法,直接存取指定的像素。

QPicture则是个绘图装置,可以记录并回放QPainter的绘图指令,您可以使用QPainter的begin()方法,指定在QPicture上进行绘图,使用end()方法结束绘图,使用QPicture的save()方法将QPainter所使用过的绘图指令存至档案

QPainter绘图引擎提供了drawImage、drawPicture和drawPixmap三类重载API。

drawImage类API支持绘制正常大小和自适应大小两种图片显示模式;

drawPicture类API支持绘制正常大小图片显示模式,主要用于回放QPainter的绘制;

drawPixmap类API支持绘制正常大小和自适应大小两种图片显示模式;

drawTiledPixmap提供了平铺显示模式。

综上,使用QPixmap结合QPainter可以绘制正常大小、自适应大小和平铺三种模式。

1、在指定位置绘制 pixmap,pixmap 不会被缩放

/* pixmap 的左上角和 widget 上 x, y 处重合 */

void QPainter::drawPixmap(int x, int y, const QPixmap & pixmap)

void QPainter::drawPixmap(const QPointF &point, const QPixmap &pixmap)

2、指定的矩形内绘制 pixmap,pixmap 被缩放填充到此矩形内

/* target 是 widget 上要绘制 pixmap 的矩形区域 */

void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)

void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap)

3、绘制 pixmap 的一部分,可以称其为 sub-pixmap(剪切大小)

/* source 是 sub-pixmap 的 rectangle */

void QPainter::drawPixmap(const QPoint &point, const QPixmap &pixmap, const QRect &source)

void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)

void QPainter::drawPixmap(int x, int y, const QPixmap &pixmap, int sx, int sy, int sw, int sh)

4、平铺绘制 pixmap,水平和垂直方向都会同时使用平铺的方式

void QPainter::drawTiledPixmap(const QRect &rectangle, const QPixmap &pixmap, const QPoint &position = QPoint())

void QPainter::drawTiledPixmap(int x, int y, int width, int height, const QPixmap & pixmap, int sx = 0, int sy = 0)

测试代码:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
painter->setRenderHint(QPainter::Antialiasing);
QRectF target(-m_size / , m_size, m_size);
QRectF source();
QRectF clipSource();
QPixmap pixmap(":/image/qt-rocket.png");
// 自适应
painter->drawImage(target, image, source);
// 正常大小
), image, source);
// 子大小
), image, clipSource);
// 平铺
painter->drawTiledPixmap(target, pixmap);

QPainter绘制图片填充方式(正常大小、剪切大小、自适应大小、平铺)的更多相关文章

  1. UI-UIImageView的图片填充方式(contentMode)_图片作为控件背景图的拉伸方式(stretch)介绍

    常用图片填充方式 这里只介绍三个最常用的图片填充方式 UIViewContentModeScaleToFill模式会导致图片变形.例如: UIViewContentModeScaleAspectFit ...

  2. pictureBox控件获得图片路径的三种方法及自适应大小属性

    1.绝对路径: this.pictureBox2.Image=Image.FromFile("D:\\001.jpg"); 2.相对路径: Application.StartupP ...

  3. Flex 4中组件背景设置(填充方式)group为例子

    以下以Group为例子讲述如何在Flex 4中填充背景颜色.图片: 1.图片填充方式: <s:Group x="0" y="0" height=" ...

  4. android背景平铺方式 tileMode

    创建重复的背景图片  在drawable目录下创建一个repeat_bg.xml:    然后在布局的xml文件中可以这样引用:    ================================ ...

  5. android中可以使用bitmap的平铺,镜像平铺等减小图片带来的apk过大的问题

    bitmap的平铺.镜像drawable文件夹中新建bitmap,其中的tileMode属性 tileMode 属性就是用于定义背景的显示模式:  disabled  默认值,表示不使用平铺  cla ...

  6. 69、Android 布局中轻松实现图片的全屏、居中、平铺

    public void paint() { if (item.laying_mode != 1)//平铺或者充满 { new AsyncTask<Void, Void, Void>() { ...

  7. LODOP中设置设置图片平铺水印,超文本透明

    之前的博文:LODOP中平铺图片 文本项Repeat. 该博文中是平铺的图片,上面是文本.如果是图片add_print_image和add_print_text纯文本,这两个打印项设计的,可以直接通过 ...

  8. CSS背景颜色、背景图片、平铺、定位、固定

    CSS背景颜色设置 background-color:red;如设置背景颜色为红色: 背景颜色设置支持3种写法: 颜色名 16进制 rgb CSS背景图片颜色设置 background-image:u ...

  9. Android 音视频开发(一) : 通过三种方式绘制图片

    版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7456956.html 在 Android 音视频开发学习思路 里面,我们写到了,想要逐步入门音视频开发,就 ...

随机推荐

  1. django学习-管理界面、视图

    django管理界面 设计背景 为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作.因此,django全自动地根据模型创建后台界面. django产生于一个公众页面和内 ...

  2. Python运维中20个常用的库和模块

    1.psutil是一个跨平台库(https://github.com/giampaolo/psutil) 能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和 ...

  3. Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换

    经过前面两篇文章的铺垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题.我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的tab窗口打开页面B,这个时候,你在页 ...

  4. 使用构造函数 Boolean 创造的对象不是布尔值,而是对象,typeof new Boolean(1) == 'object'

    注意,使用构造函数 Boolean 创造的对象不是布尔值: 事实上 new Boolean() 返回的是一个 Boolean 对象: typeof new Boolean(1) == 'object' ...

  5. node端console.log输出不同颜色文字

    我们知道console.log直接输出是按着终端的默认颜色来显示的, console.log('message') 那么如何指定他们的颜色显示呢?很简单,直接再加一个参数就可以了,例如: consol ...

  6. cookie清除及其他操作

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 一:设置co ...

  7. CF1149D Abandoning Roads(图论,最短路,状态压缩,最小生成树)

    题目大意:$n$ 个点,$m$ 条边的无向图,边权只有两种,小的为 $a$,大的为 $b$. 对于每个点 $p$,询问在这张图所有的最小生成树上,$1$ 到 $p$ 的最短距离的最小值. $2\le ...

  8. thinkphp5.1 - twig模板-全局变量

    thinkphp5.1 - twig模板-全局变量我们在定义 ccs 之类的静态文件的时候,经常会使用<link rel="stylesheet" href="__ ...

  9. linux webbench测试高并发方法

    linux webbench测试高并发方法由于ab小工具 测试高并发 会出错 具体原因http://newmiracle.cn/?p=594所以采用webbench这个来测试<pre> w ...

  10. ascii码对照表(收藏)

    https://blog.csdn.net/yueyueniaolzp/article/details/82178954 十进制代码 十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII ...