QImage/Jpeg: decode/encode comment attributes as utf-8
Although not defined, the jpeg comment field 'content' is treated as utf-8 nowadys. At least exiftool and exiv2 (tested via gwenview) are expecting utf-8 here. So we should do the same. Task-number: QTBUG-44709 Change-Id: If84dafac3e337c7993f09cd59792e721977c9adb Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
This commit is contained in:
parent
633a0f5172
commit
2cd4123661
@ -493,10 +493,10 @@ static inline void set_text(const QImage &image, j_compress_ptr cinfo, const QSt
|
||||
{
|
||||
const QMap<QString, QString> text = qt_getImageText(image, description);
|
||||
for (auto it = text.begin(), end = text.end(); it != end; ++it) {
|
||||
QByteArray comment = it.key().toLatin1();
|
||||
QByteArray comment = it.key().toUtf8();
|
||||
if (!comment.isEmpty())
|
||||
comment += ": ";
|
||||
comment += it.value().toLatin1();
|
||||
comment += it.value().toUtf8();
|
||||
if (comment.length() > 65530)
|
||||
comment.truncate(65530);
|
||||
jpeg_write_marker(cinfo, JPEG_COM, (const JOCTET *)comment.constData(), comment.size());
|
||||
@ -904,7 +904,7 @@ bool QJpegHandlerPrivate::readJpegHeader(QIODevice *device)
|
||||
for (jpeg_saved_marker_ptr marker = info.marker_list; marker != NULL; marker = marker->next) {
|
||||
if (marker->marker == JPEG_COM) {
|
||||
QString key, value;
|
||||
QString s = QString::fromLatin1((const char *)marker->data, marker->data_length);
|
||||
QString s = QString::fromUtf8((const char *)marker->data, marker->data_length);
|
||||
int index = s.indexOf(QLatin1String(": "));
|
||||
if (index == -1 || s.indexOf(QLatin1Char(' ')) < index) {
|
||||
key = QLatin1String("Description");
|
||||
|
BIN
tests/auto/gui/image/qimage/images/jpeg_exif_utf8_comment.jpg
Normal file
BIN
tests/auto/gui/image/qimage/images/jpeg_exif_utf8_comment.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 705 B |
@ -192,6 +192,7 @@ private slots:
|
||||
void exif_QTBUG45865();
|
||||
void exifInvalidData_data();
|
||||
void exifInvalidData();
|
||||
void exifReadComments();
|
||||
|
||||
void cleanupFunctions();
|
||||
|
||||
@ -3066,6 +3067,34 @@ void tst_QImage::exifInvalidData()
|
||||
QVERIFY(!image.isNull());
|
||||
}
|
||||
|
||||
void tst_QImage::exifReadComments()
|
||||
{
|
||||
QImage image;
|
||||
QVERIFY(image.load(m_prefix + "jpeg_exif_utf8_comment.jpg"));
|
||||
QVERIFY(!image.isNull());
|
||||
QCOMPARE(image.textKeys().size(), 1);
|
||||
QCOMPARE(image.textKeys().first(), "Description");
|
||||
// check if exif comment is read as utf-8
|
||||
QCOMPARE(image.text("Description"), QString::fromUtf8("some unicode chars: ÖÄÜ€@"));
|
||||
|
||||
QByteArray ba;
|
||||
{
|
||||
QBuffer buf(&ba);
|
||||
QVERIFY(buf.open(QIODevice::WriteOnly));
|
||||
QVERIFY(image.save(&buf, "JPG"));
|
||||
}
|
||||
QVERIFY(!ba.isEmpty());
|
||||
image = QImage();
|
||||
QCOMPARE(image.textKeys().size(), 0);
|
||||
{
|
||||
QBuffer buf(&ba);
|
||||
QVERIFY(buf.open(QIODevice::ReadOnly));
|
||||
QVERIFY(image.load(&buf, "JPG"));
|
||||
}
|
||||
// compare written (and reread) description text
|
||||
QCOMPARE(image.text("Description"), QString::fromUtf8("some unicode chars: ÖÄÜ€@"));
|
||||
}
|
||||
|
||||
static void cleanupFunction(void* info)
|
||||
{
|
||||
bool *called = static_cast<bool*>(info);
|
||||
|
Loading…
Reference in New Issue
Block a user