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的模式,支持一行一行讀取,所以可以節省較大的內存空間),而對於其他不支持的格式,當面臨較大的尺寸時,會出現因為內存太大,而無法加載的情況...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM