From 75a129d3c2f21914a47b970df822e485aca625ac Mon Sep 17 00:00:00 2001 From: Steve Allewell Date: Sun, 11 Nov 2018 15:48:50 +0000 Subject: Fix for importing images for V6 of ImageMagick The getPixelColor in V6 of ImageMagick does not appear to return the same information as in V7, consequently importing images has resulted in a black image when using V6 of ImageMagick. This fix reverts the change made in commit 295773f44bfda1227d85edf065a8de14dc889159 when using V6. Big thanks to Sean Enck for reporting and helping diagnose the problem. --- src/ImportImageDlg.cpp | 16 ++++++++++++++++ src/MainWindow.cpp | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/ImportImageDlg.cpp b/src/ImportImageDlg.cpp index e6396c6..340ff1d 100644 --- a/src/ImportImageDlg.cpp +++ b/src/ImportImageDlg.cpp @@ -391,9 +391,21 @@ void ImportImageDlg::renderPixmap() QProgressDialog progress(i18n("Rendering preview"), i18n("Cancel"), 0, pixelCount, this); progress.setWindowModality(Qt::WindowModal); +/* + * ImageMagick prior to V7 used matte (opacity) to determine if an image has transparency. + * 0.0 for transparent to 1.0 for opaque + * + * ImageMagick V7 now uses alpha (transparency). + * 1.0 for transparent to 0.0 for opaque + * + * Access to pixels has changed too, V7 can use pixelColor to access the color of a particular + * pixel, but although this was available in V6, it doesn't appear to produce the same result + * and has resulted in black images when importing. + */ #if MagickLibVersion < 0x700 bool hasTransparency = m_convertedImage.matte(); double transparent = 1.0; + const Magick::PixelPacket *pixels = m_convertedImage.getConstPixels(0, 0, width, height); #else bool hasTransparency = m_convertedImage.alpha(); double transparent = 0.0; @@ -408,7 +420,11 @@ void ImportImageDlg::renderPixmap() } for (int dx = 0 ; dx < width ; dx++) { +#if MagickLibVersion < 0x700 + Magick::ColorRGB rgb = Magick::Color(*pixels++); +#else Magick::ColorRGB rgb = m_convertedImage.pixelColor(dx, dy); +#endif if (hasTransparency && (rgb.alpha() == transparent)) { //ignore this pixel as it is transparent diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 1f12f5b..ecf552a 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -541,13 +541,26 @@ void MainWindow::convertImage(const QString &source) bool useFractionals = importImageDlg->useFractionals(); +/* + * ImageMagick prior to V7 used matte (opacity) to determine if an image has transparency. + * 0.0 for transparent to 1.0 for opaque + * + * ImageMagick V7 now uses alpha (transparency). + * 1.0 for transparent to 0.0 for opaque + * + * Access to pixels has changed too, V7 can use pixelColor to access the color of a particular + * pixel, but although this was available in V6, it doesn't appear to produce the same result + * and has resulted in black images when importing. + */ #if MagickLibVersion < 0x700 bool hasTransparency = convertedImage.matte(); double transparent = 1.0; + const Magick::PixelPacket *pixels = convertedImage.getConstPixels(0, 0, imageWidth, imageHeight); #else bool hasTransparency = convertedImage.alpha(); double transparent = 0.0; #endif + bool ignoreColor = importImageDlg->ignoreColor(); Magick::Color ignoreColorValue = importImageDlg->ignoreColorValue(); @@ -579,7 +592,11 @@ void MainWindow::convertImage(const QString &source) } for (int dx = 0 ; dx < imageWidth ; dx++) { +#if MagickLibVersion < 0x700 + Magick::ColorRGB rgb = Magick::Color(*pixels++); // is this a memory leak +#else Magick::ColorRGB rgb = convertedImage.pixelColor(dx, dy); +#endif if (hasTransparency && (rgb.alpha() == transparent)) { // ignore this pixel as it is transparent -- cgit v1.1