2010-07-25 7 views
2

디스크에 직접 메모리 비용없이 이미지를 조작하기 위해 MMF 파일에 QImage를 바인드해야합니다. 불행히도, 내 코드는 메모리에 복사본을 만듭니다.QT의 매우 큰 QImage 및 메모리 매핑 파일

QFile file("Boston City Flow.jpg"); 
if(!file.open(QIODevice::ReadOnly)) 
    QMessageBox::information(this, "Error", "Error"); 

qint64 size = file.size(); 
unsigned char *mmf = file.map(0, size); 

QImage image; 
image.loadFromData(mmf, size, NULL); 

내 프로그램은 매우 큰 이미지를 처리해야합니다. 특히

QImage(const uchar*, int width, int height, Format) 

QImage :: QImage를 (const를 UCHAR * 데이터 INT 폭, INT 높이

const unsigned char* mmf = file.map(0, size); 

다음 QImage의 ctors를 보라 :

답변

5

MMF를 const 선언과 시도 , 형식 형식)

문서는 다음과 같이 말합니다.

"버퍼는 유효해야합니다 QImage의 수명과 수정되지 않았거나 원래의 버퍼에서 분리되지 않은 모든 사본을 낭독하십시오. 이미지는 파기시 버퍼를 삭제하지 않습니다. [...] const가 아닌 데이터 버퍼를 사용하는 유사한 QImage 생성자와 달리이 버전에서는 버퍼 내용을 변경하지 않습니다. 예를 들어 QImage :: bits()를 호출하면 생성자에 전달 된 버퍼가 아닌 이미지의 전체 복사본이 반환됩니다. 따라서 원시 데이터가 변경되지 않고 원시 데이터에서 QImage를 생성 할 수 있습니다. "

비 const uchar * 버전은 즉시 복사하므로 const를 전달해야합니다 uchar * .QImage의 const가 아닌 메서드를 호출하면 데이터가 복사됩니다.