2012-11-11 1 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 문서가 말했듯이

, 우리는 QImage 개체의 수명 기간 동안 유효 YV12Frame 개체를 유지해야합니다.

UI 레이어는 얕은 또는 깊은 복사본을 통해 QImage 개체를 복사 할 수 있습니다. 즉, 한 번에 프레임 버퍼를 참조하는 알 수없는 QImage 객체가있을 수 있습니다.

질문

우리는 어떻게하면 안전하게 YV12Frame 개체를 삭제하는 지 알고 있나요?

대답은 이봐, 내가 마지막 QImage 객체가 프레임 버퍼를 참조 오전 내가 삭제하려고 생각합니다 "알려주는 알림 (콜백 또는 무엇이든)가

. 당신은 안전하게 삭제할 수 있습니다 예상 프레임 버퍼를 지금. "

그러나 이러한 알림을 찾을 수 없습니다.

답변

0

다음 해결 방법이 필요할 수 있습니다.

배열 대신 실제 QImage 객체를 YV12Frame의 전용 멤버 (정확한 너비 및 높이로 초기화 됨)로 저장하십시오. 이것은 GetQtImage() 함수에서 반환해야하는 객체입니다. QImage 암시 적 공유 덕분에 다른 QImage 인스턴스가 발생하면 자체 픽셀 데이터가 분리되므로 언제든지 YV12Frame을 안전하게 삭제할 수 있습니다.

프레임 디코딩에서 일반적인 setPixel() 기능을 통해 QImage의 내용을 변경하십시오.

속도가 중요한 경우 setPixel을 사용할 수 없으므로 픽셀 데이터를 직접 조작해야합니다. 트릭은 QImage가 픽셀 데이터를 분리하지 못하도록하는 것입니다. 따라서 constBits() 또는 constScanLine() 중 하나를 사용해야하고 비 const 포인터로 캐스팅 한 다음 직접 액세스해야합니다 (추한 것, 알고 있습니다).

관련 문제