簡體   English   中英

繪制一個太大的圖像以適應QImage

[英]Draw an image too big to fit into a QImage

我需要顯示一個非常大的圖表,例如圖像分辨率可能是100 000 x 1000.但是,似乎我被QImage限制為32768 x 32768。

我不能在每個paintEvent直接重繪圖表,所以我需要將它存儲到QImage中(它可能是一個不會改變任何東西的QPixmap)。 但是,它不合適。

我的第一個想法是:

  • 創建QImage列表
  • 繪制各種QImage
  • 使用良好的QImage重繪。

第一點和最后一點都很容易完成。 但第二點更復雜。 我非常有信心我的方法可行,但它需要重載基本的繪畫方法(繪制矩形,圓形等),以便能夠在多個圖像上繪畫。

所以,在繼續之前,我想知道其他選擇可能是什么。

您可能不希望一次顯示多個QImage數據。 很少有屏幕超過32k像素寬或高。

因此,您需要一種抽象類型,根據請求生成 QImage ,可以在偏移量和可能的不同縮放因子下生成 QImage

下一個問題是修改此抽象類型。 一個易於使用,而不是最大性能的版本包括讓用戶將QImage插入您的內部存儲(無論是什么)。

用戶仍然必須“平鋪”他們的努力,但可以以方便他們的方式平鋪他們的努力。

更高性能的版本暴露了一些我們尚未提及的底層實現。

大圖像的傳統實現是平鋪圖像。 你有一個相互鄰接的圖像拼貼網格。 當有人從您的圖像中請求一個blit時,您會生成一個臨時的QImage ,然后將相應的圖塊放在上面。 當有人對你嗤之以鼻時,你會弄清楚適當的瓷磚是什么,並在其中部分部分寫出源QImage的部分內容。

更高性能的界面暴露了這些圖塊。

低級別界面讓外部知道你的瓷磚在哪里,讓他們要求他們。 這是一個糟糕的界面。

更好的接口公開子tile迭代器。 他們要求一個區域,然后返回一對描述該區域的迭代器。 迭代器中的數據由該圖塊中的圖塊和區域以及該區域在“完整圖像”中的位置,或子圖塊對象(具有線條,線長等)和位置組成。子瓦片對象。

另一個好的界面是foreach樣式界面。 同樣,大圖像類的用戶傳入他們想要使用的區域,但也是回調。 該回調類似於迭代器解除引用的上述結果之一。

與迭代器方法相比,這種方法有兩大優勢。 首先,您可以在大型圖像類中實現並行圖像處理算法。 其次,編寫比滾動自己的迭代器要容易得多。

一旦你有這些,繪圖相對容易。 確定您正在繪制的區域(慷慨)。 迭代生成的圖塊。 在每個圖塊上,在將圖塊的偏移應用於圖形后進行繪制。

您可以使用Qt Graphics View Framework。 為它創建一個QGraphicsView和一個QGraphicsScene 添加使用項目QGraphicsScene::addPixmap (返回QGraphicsPixmapItem其源自QGraphicsItem ),並使用調整自己的位置QGraphicsItem::setPos 如有必要, QGraphicsView將有效地繪制場景並處理滾動和縮放。

您是否意識到100,000 x 1000 RGBA QImage是400MBytes? 浪費所有記憶是沒有意義的。 真的,沒有。

只需在paintEvent繪制一次請求即可。 要聰明一點,這樣你才能畫出需要展示的東西。 我認為應該專注於優化繪畫過程和數據結構,以便有效地繪制。

在小尺度(縮小)時,通過近似/抽取/內插數據使其看起來相同可以獲得很多,但是您不會浪費時間繪制相同的像素太多次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM