C++对于大型图片的加载缩放尝试

Qt对于图片的操作主要集中在这几个类 QImage ,QImageReader ,QPixmap

其中QImage这个类对图片的缩放有几个很不错的技巧,不过对于大图片却并不好使,当我们去看QImage的实现代码时,会发现其中读取QImageReader来加载图片,当我们去看QImageReader的实现的时候,我们会发现QImageReader的加载模式是unbuffer-->无缓冲加载模式,而且加载速度也是相当的快,所以QImageReader对大图片进行缩放很好使.

但是QImage也是有一些独特的优势,在内存数据或者不是超大数据图片时,进行平缓缩放(特别是两步缩放的时候,时间效率和图片质量都还是相当不错的)

下面逐一说明,对于QImage如何进行平滑缩放

 1 /*设定图片大小*/
 2  unsigned int  image_width ,image_height;
 3 
 4  image_width=1000;  
 5  image_height=1000;
 6 
 7 QImage  m_image("D:\\123.jpg");
 8 /*
 9      *首先缩放到我们设定大小的四倍,在缩放到我们需要缩放的
10      *大小(时间效果很快,图片质量比较好)
11      *需要结合快速减半法一起使用.
12 */ 
13 QImage m_res = m_image.scaled(image_width<<2,
14         image_height<<2).scaled(image_width,     image_height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation
15 );
16 
17   QLabel *m_label= new QLabel;
18 m_label->setPixmap(QPixmap::fromImage(m_image));
19     m_label->show();

对于QImageReader则可以这样设定图片(可以任意比例)

       QImage img;
    QImageReader reader;                // 设置图片名
    reader.setFileName("D:\\123.jpg");   // 读取图片大小
    //sleep(30000);
    QSize imageSize = reader.size();          // 缩放图片尺寸以适应屏幕大小
    //imageSize.scale(100,100,);   //设定宽度高度比例
    //imageSize.scale(100,Qt::KeepAspectRatio); // 设置图片大小
    imageSize.setHeight(500);
    imageSize.setWidth(500);
    reader.setScaledSize(imageSize);
    img= reader.read(); // 读取图片
  QLabel *m_label= new QLabel;
    //m_label->resize(image_width,image_height);
    img.save("D://4567.jpg");
    m_label->setPixmap(QPixmap::fromImage(img));
    m_label->show();

 不过很可惜,对于超大图片而言,Qt只能对于支持的图片进行操作(比如jpeg由于是8*8block的模式,支持一行一行读取,所以可以节省较大的内存空间),而对于其他不支持的格式,当面临较大的尺寸时,会出现因为内存太大,而无法加载的情况...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏子勰随笔

iMac下制作含透明度图片及判断图片透明度

17930
来自专栏编程坑太多

「小程序JAVA实战」 小程序远程调试(九)

PS:最后想到了什么老铁,可以查看远端的代码是不是就可以获取到借鉴他的代码了。其实微信早就想到了,不是所有的都可以的。远端调试必须知道他的APPID的,不是说直...

13610
来自专栏对角另一面

谷歌插件Image downloader开发之popup

Image downloader的交互逻辑是这样的:用户点击Image downloader的图标,会向页面(content script,见上一篇文章:谷歌插...

22300
来自专栏CSDN技术头条

【独家】饿了么前端团队快应用背后研发实践

饿了么是一年前开始参与内测尝试开发快应用的,看着快应用平台一步一步的走过来,发展的越来越好。目前来说快应用开发条件已经比较完善,本次分享,为大家介绍前端开发人员...

25330
来自专栏Youngxj

给网站添加好看的底部功能按钮

19150
来自专栏大前端开发

微信小程序之图片选择、预览与上传

所谓:一图胜千言。这话说明了图片描述事物的能力是非常强大的(怪不得我们可以用表情包聊一整天),尤其现在的手机拍照功能那么方便,用户对使用拍照和相册的需求日益上升...

82450
来自专栏Windows Community

Windows Phone 8.1 新特性 - 控件之应用程序栏

2014年4月3日的微软Build 2014 大会上,Windows Phone 8.1 正式发布。相较于Windows Phone 8,不论从用户还是开发者的...

25150
来自专栏小狼的世界

Sublime Text 3 提高工作效率的使用技巧

Sublime Text 3对于Sublime Text 2压倒性的优势就是秒启动,启动非常非常快,所以从2012年到2016年我一直用Sublime Text...

19940
来自专栏.Net移动开发

.Net语言 APP开发平台——Smobiler学习日志:如何实现离线声音文件上传

最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便

18230
来自专栏HTML5学堂

传统企业站开发 - 页面布局

前几期我们讲解了HTML+CSS的基本知识点,也带着大家分析过一些案例。从简单的页面结构到页面布局的实现,再到页面的优化。我们学习到的东西挺多的,但是在实战开发...

47160

扫码关注云+社区

领取腾讯云代金券