Qt大画像を描くと表示できない問題(画像をズーム)について
Qtは、ピクチャをロードする際にピクチャをキャッシュ(QPIxmapCache)に格納し、ピクチャが大きすぎてコンピュータのメモリが不足している場合、プログラムがクラッシュすることがあるため、ピクチャを処理する際にピクチャをスケールすることを考慮することができる.
ここではQImageWriterを用いてファイルを再保存するqt開発ではQpixmapで画像を描くと表示できないという問題に直面しやすいが、画像はwindowsやサードパーティツールで正常に表示できるのは、画像接尾辞が修正されたためであり、接尾辞名を変更することで回避できないためだ.
したがって,ファイルを読み書きする際に接尾辞を直接除去し,画像ファイル自体を解析することで画像フォーマットを取得することができる.
ここではQImageWriterを用いてファイルを再保存するqt開発ではQpixmapで画像を描くと表示できないという問題に直面しやすいが、画像はwindowsやサードパーティツールで正常に表示できるのは、画像接尾辞が修正されたためであり、接尾辞名を変更することで回避できないためだ.
したがって,ファイルを読み書きする際に接尾辞を直接除去し,画像ファイル自体を解析することで画像フォーマットを取得することができる.
bool checkImageSize(const QString & path, const QSize & decSize)
{
//
if (!QFile::exists(path)) {
qInfo() << QStringLiteral(" ") << path;
return false;
}
//
QImageReader reader(path);
reader.setDecideFormatFromContent(true);
if (!reader.canRead()) {
qInfo() << QStringLiteral(" ");
return false;
}
//
auto size = reader.size();
if (size.width() <= decSize.width() && size.height() <= decSize.height()) {
return true;
}
// decSize
size.scale(maxSize, Qt::KeepAspectRatio);
reader.setScaledSize(size);
//
QByteArray imageFormat = QImageReader::imageFormat(path);
//
QImageWriter writer(path, imageFormat);
bool status = writer.write(reader.read());
if (status) {
return true;
}
qInfo() << QStringLiteral(" ")<< path;
return false;
}