2017-05-03 18 views
0

ARM 플랫폼 용 Qt 4.8.3을 사용하는 프로젝트에서 작업하고 있습니다. 내 프로젝트에서는 QGraphicsItems ... QGraphicsPixmapItem의 하위 클래스 중 하나를 사용합니다.QPixmap :: load() crash - 피하려고합니다

코드는 32 비트 비트 맵 이미지로 테스트되었으며 충돌합니다.

충돌은 ARM 에서뿐만 아니라 QVFB에서도 발생합니다.

QPixmap p; 
if (!p.load(filename)) // crashes here 
    return false; 

나는 시도 ... 캐치 이것을 둘러싸고하려고 노력하지만, 도움이되지 않았다.

이 버전의 Qt 코드에서 단계를 밟을 수없는 것 같지만 ... QImageReader::read(QImage*)에서 충돌이 발생합니다.

스택 추적 :

QImageReader::read(QImage*) 
QImageReader::read() 
QPixmapData::fromFile(QString const&*, QFlags<QT::ImageConversionFlag>) 
QPixmap::load(QString const&, char const*, QFlags<QT::ImageConversionFlag>) 
QPixmapItem::loadItemFromFile // mine, the code above 

이미지의 다른 유형의 작동 ... 제대로 윈도우에서 같은 32 비트 비트 맵로드, 같은 Qt는 버전. 동일한 Qt 버전에서 Desktop 용으로로드 (false 반환)되지 않습니다.

이 유형의 파일을 제외해도 기쁠 것입니다. 그러나 어떻게해야할지 모르겠습니다.

이미지를로드하지 않고 충돌을 피할 수있는 방법이 있습니까?

아마도 이미지 헤더 만로드하고 해당 유형을 확인하는 방법이 있습니까?

+0

이미지 형식 및 ImageConversionFlags의 다양한 조합을 매개 변수로 사용하여 호출 해보십시오. –

+0

@MichaelO. 나는 실험을 시도했다. 그러나 나는 모든 타입의 이미지 파일을 읽을 수 있어야한다. 하나의 타입으로 제한 할 수 없다. "BMP"가 아닌 다른 값을 설정하면 false가 반환됩니다. 왜냐하면 이미지 유형이 읽기 전에 실패 할 수 있기 때문입니다. 그러나 비트 맵 및 기타 모든 유형의 파일을 읽을 수 있어야합니다. 난 그냥 32 비트 비트 맵을 제외하고 싶습니다. – Thalia

답변

1

32 비트 BMP 이미지를 제외 시키려면 BMP header을 읽어야합니다. 처음 두 바이트는 문자 "BM"이고 바이트 28, 29는 픽셀 당 비트를 포함합니다.

다음은 파일을 QByteArray로 읽어 들이고 그 형식을 확인한 다음 QPixmap에로드하는 작은 예제입니다.

#include <QtCore> 
#include <QtGui> 
int main(int argc,char** argv) 
{ 
    QApplication app(argc,argv); 
    QFile file("./plot.bmp"); 
    if (!file.open(QIODevice::ReadOnly)) return 1; 
    QByteArray ba=file.readAll(); 
    if(ba[0]=='B' && ba[1]=='M' && ba[28] == 32) { 
     qDebug() << "Wrong format!"; 
     return 1; 
    } 
    QPixmap pixmap; 
    pixmap.loadFromData(ba); 
    qDebug()<<"OK!"; 
    return 0; 
} 

아니면 메모리에 모든 것을 읽을 수 없다, 당신은, QFile, ifstream 등을 사용하여 파일을 열려면 다음 바이트를 확인하고 다음을 닫을 수 있습니다.