在编程过程中,涉及到网络传输或资源加载时,过大的图片往往是编程人员的噩梦,加载时间过长,体验效果差,特别在即时通讯的发送图片时,大图往往半天加载不出来,于是,先对图片进行压缩,暂时显示模糊图片,然后下载大图最后更新下载的大图,这一过程成为解决大图片加载过慢体验效果差的关键。
QImage提供了缩放图片的函数scaled,并且可以用参数指定”快速缩放(FastTransformation)”还是”平滑缩放(SmoothTransformation)”, 使用还是很方便的。 但是如果你用缩放函数去做大图片的缩略图可能会发现”快速缩放”得到的图片质量不佳, 而”平滑缩放”质量很好但速度欠佳, 特别是原图非常大的时候smoothscale简直就是个噩梦阿。 这里就可以使用被称为“Cheat Scaling”的缩小图片的技巧了, 那就是先使用”快速缩放”得到一个中等大小的图片以获得较快的缩放速度, 再使用”平滑缩放”缩小至需要的大小以获得较好的图片质量。
实现代码如下:
#include <QFile>
void compressImg()
{
QImage img;
img.load("./in.jpg");
QImage result = img.scaled(800, 600, Qt::KeepAspectRatio, Qt::FastTransformation).scaled(260, 140, Qt::KeepAspectRatio, Qt::SmoothTransformation);
bool isSuccess = result.save("out.jpg", "JPEG", 100);
if (!isSuccess)
{
qDebug() << "save image fail!";
}
QFile file("out.jpg");
qint64 fsz = file.size();

int quality = 100;
while (fsz > 2048)
{
quality = quality - 5;
isSuccess = result.save("out.jpg", "JPEG", quality);
if (!isSuccess)
{
qDebug() << "save image fail! quality=" << quality;
}
fsz = file.size();
qDebug() << "+++++++++++++++++++++++quality=" << quality;
if (quality <= 0)
break;
}
}
通过压缩,可以将图片压缩至2K(2048字节)以内,此时,图片的质量有明显的下降,但是解决了大图片下载耗时的问题。
以上代码,先通过QImage的scaled()方法将图片缩放到260x140,然后通过save的quality参数将图片的质量下调,直至图片文件大小满足要求(2K以内)。使用技巧是调用scaled()将图片缩放至中等图片img.scaled(800, 600, Qt::KeepAspectRatio, Qt::FastTransformation)时,使用的transformMode为Qt::FastTransformation进行快速压缩,然后在进行二次缩放scaled(260, 140, Qt::KeepAspectRatio, Qt::SmoothTransformation)时,使用transformMode为Qt::SmoothTransformation进行缩放,这样既保障图片的质量,又提高了压缩速度。
实现了压缩以后,要对图片进行读取,通过字节形式进行发送,然后在接收端对数据进行保存并显示模糊的压缩图片,代码如下:
#include <QFile>
void saveImg() {
QFile file("out.jpg");
file.open(QIODevice::ReadOnly);
QByteArray arr = file.readAll();
file.close();
char* p = arr.data();

//file.remove();

QImage aout;
aout.loadFromData(arr);
aout.save("aout.jpg", "JPEG", 100);

QFile file_out("aout.jpg");
fsz = file_out.size();
quality = 100;
while (fsz > 2048)
{
quality = quality - 5;
isSuccess = aout.save("aout.jpg", "JPEG", quality);
fsz = file_out.size();
qDebug() << "+++++++++++++++++++++++quality=" << quality;
if (quality <= 0)
break;
}
}
用QFile的readAll()方法可以将图片以文件形式全部读出,返回一个QByteArray保存读出的数据,即为图片的二进制数据,也可以用QByteArray的data()方法将数据转换为char*指针,且该指针是以'\0'结尾的,因此可以通过网络对较少字节的数据进行传输。

用QImage的loadFromData()方法对读出的QByteArray进行加载并保存为aout.jpg文件,当用aout.save("aout.jpg", "JPEG", 100);对保存的2K数据转换为图片aout.jpg时,设置quality为100,输出图片aout.jpg的大小竟然变大了(7K左右),但是图片的质量依然和原始的2K图片质量一样,因此,最后最图片又进行了循环保存,以减少不必要的空间浪费。

效果图如下:

压缩前:1.4M   4208*3120

压缩后:1.98K   188*140

了解更多关于Qt、QML、Linux、MacOSX相关技术,请扫码关注【三个程序员】接收实时消息^_^.

Qt实现图片的简单压缩相关推荐

  1. android 里面对图片的不同压缩处理 以及简单拍照功能实现加设置闪光灯效果

    android 压缩图片操作 一般分为两种 按质量压缩和按比例大小压缩 直接上代码 <strong>1:按质量压缩方法</strong>private Bitmap compr ...

  2. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  3. 手把手教你线程池配合CompletableFuture实现图片下载并压缩

    你知道的越多,不知道的就越多,业余的像一棵小草! 成功路上并不拥挤,因为坚持的人不多. 编辑:业余草 juejin.cn/post/6976454072685559822 推荐:https://www ...

  4. 图片服务器 imgproxy 入门教程--实现图片实时裁剪/压缩/处理等操作

    图片服务器 imgproxy 入门教程--实现图片实时裁剪/压缩/处理等操作 入门 本指南将向您展示如何使用imgproxy快速调整第一张图像的大小. 安装 假设您在计算机上安装了Docker.然后, ...

  5. Qt基于QuaZIP实现文件压缩/解压(Linux下)

    Qt基于QuaZIP实现文件压缩/解压(Linux下) 一.工具准备 二.编译zlib 1.下载zlib源码 2.配置 3.编译与安装 三.编译QuaZIP 1.下载QuaZIP源码 2.将zlib库 ...

  6. 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)

    拼多多现在也是越来越火了,但是不知道大家有没有发现,拼多多似乎一直不能通过网页进行访问.淘宝,京东都有微信客户端,那么怎么拼多多就没有呢?带着这个疑问,我特地去手机爬取了一下拼多多的客户端.(其实也不 ...

  7. Qt 简易图片播放器

    一.前言 使用 Qt 制作了一个简单的图片播放器,点击 "浏览按钮" 浏览图片所在目录,目录中的所有图片缩小图标和名称会显示在左侧的图片列表中,点击列表中的图片项,可以在右侧区域的 ...

  8. Qt基于QuaZIP实现文件压缩/解压(Win下)

    Qt基于QuaZIP实现文件压缩/解压(Win下) 一.工具准备 二.编译zlib 1.下载zlib源码 2.生成VS工程文件 3.使用VS进行编译 三.编译QuaZIP 1.下载QuaZIP源码 2 ...

  9. 图片怎么批量压缩?进来学习一下压缩图片的好方法

    相信小伙伴们在日常工作和生活中经常会用到图片.在使用图片时,我们经常会遇到对图片大小的限制.因此,我们需要压缩图片的大小来减小图片的大小.如果图片太大可能会超出平台限制导致无法上传,或者分享给别人查阅 ...

  10. 《数据万象带你玩转视图场景》第三期:图片极智压缩

    前言 在本系列的第一期我们介绍了图片 AVIF 压缩,作为最前沿的压缩技术,AVIF 确实有着无数的优点.但时代的进步是循序渐进的,在一些较老的终端或设备上,可能短时间内确实无法支持 AVIF 格式, ...

最新文章

  1. 不用在读长和准确性之间做选择题,PacBio发表新方法
  2. Python实现JSON反序列化类对象
  3. Windows Azure真实案例:GoGrid -托管提供商拓展了服务方案,通过云平台吸引更多客户...
  4. 使用SpringBoot配置了 server.servlet.path后无效的解决方案
  5. Vue3中遇到问题:PostCSS plugin tailwindcss requires PostCSS 8 解决方案
  6. php 远程连接 sqlserver,Linux下PHP远程连接SqlServer数据库
  7. 组合,聚合,关联,依赖的区别
  8. map mybatis 的字段返回0_mybatis返回map类型数据空值字段不显示(三种解决方法)
  9. 数据库设计三范式(3NF)
  10. 革新—决定磁带未来的最大挑战
  11. 数据库宿舍管理系统MySQL表_数据库-宿舍管理系统
  12. 【第二周】吴恩达团队AI for Medical Diagnosis大作业
  13. 202012月份的计算机出成绩,四六级成绩什么时候出2021 四六级成绩查询时间202012月份...
  14. 距离多普勒谱(RD谱)绘制方法及理解
  15. 智能家居领域小米,涂鸦,天猫精灵的 “中台之战”
  16. 【开篇】有志者立志长
  17. 深度学习中mAP的含义
  18. autocad2014点击保存闪退_AutoCAD2014闪退的具体原因和解决方法介绍
  19. 在需要密码的情况,卸载symantec endpoint protection 。可以不用密码删除symantec endpoint protection...
  20. ASP.NET控件中回车自动跳转至下指定控件

热门文章

  1. 森林怎么训练野人_森林游戏怎么让野人跪下 | 手游网游页游攻略大全
  2. 在线工具 将图片透明化
  3. INT 10H中断功能详解
  4. 魔方——一面两层之后的公式
  5. HCIA-Cloud Computing华为云计算IA认证笔记
  6. windows下icns转png或ico
  7. 来了来了,2020 首场 Meetup ,可!
  8. 新昌中学2021高考成绩查询,新昌中学教育集团向2020年参加高考被第一批录取的553名学子表示热烈祝贺...
  9. 2019年物联网9个趋势和预测
  10. html文件如何显示大纲视图,如何使用大纲视图生成章节目录