2012-11-11 18 views
2

在這個問題中,我想知道維護與QImage對象關聯的外部緩衝區對象的生命的最佳實踐。當我們可以從中構建QImage並且可能淺拷貝時,我們何時可以刪除一個幀緩衝區?

背景

我開發與QT未壓縮的圖像文件瀏覽器。它從文件讀取YV12數據,將其轉換爲RGB幀緩衝區,構建QImage對象,並將其傳遞到UI層以進行渲染。

的YV12文件閱讀器看起來是這樣的。

class YV12Frame 
{ 
public: 
    YV12Frame(std::string const& fileName) 
    { 
     // Initialize m_frameBuffer 
     // ... (Omitted for brevity) 
    } 

    QImage GetQImage() 
    { 
     // Build QImage object 
     return QImage(m_frameBuffer, WIDTH, HEIGHT, QImage::Format_RGB32); 
    } 

private: 
    unsigned char m_frameBuffer[WIDTH * HEIGHT * 4]; 
}; 

由於QT文件說,我們需要保持YV12Frame對象QImage的整個對象的生命週期有效。

的UI層可以或者通過淺或深拷貝複製QImage的對象。換句話說,可能存在未知數量的一次引用幀緩衝區的QImage對象。

問題

我們怎麼知道何時刪除YV12Frame對象安全?

預期的答案

有一個通知(回調或其他)告訴「嘿,我是最後的QImage對象指的是幀緩衝器和我即將被刪除。您可以安全地刪除現在幀緩衝區。「

但是,我找不到這樣的通知。

回答

0

以下解決方法可能適合您的需要。

代替數組,存儲真實QImage的對象作爲YV12Frame的私有成員(具有正確的寬度和高度初始化)。這是您需要從GetQtImage()函數返回的對象。由於QImage隱式共享,您可以隨時安全地刪除YV12Frame,因爲任何其他QImage實例都會在發生它時自動分離它自己的像素數據。

在你的幀解碼,通過通常setPixel()功能QImage的改變的內容。

如果速度是至關重要的,那麼你就不能使用setPixel這樣的話你需要直接處理的像素數據。這裏的技巧是防止QImage分離像素數據。因此,您需要使用constBits()constScanLine(),將其轉換爲非const指針,然後直接訪問它(醜陋,我知道)。

相關問題