summaryrefslogtreecommitdiff
path: root/user/skanlite/png-review-129988.patch
blob: 05697078c7384fa9a3f88124adc818acb4bba23b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
From 9f1e7b3596b114ef23834810f661307ef49a38de Mon Sep 17 00:00:00 2001
From: Alexander Trufanov <trufanovan@gmail.com>
Date: Wed, 8 Mar 2017 17:11:25 +0300
Subject: fix DPI info in 16-bit PNG

REVIEW:129988

Skanlite tries to save 16bit PNG files on its own in its KSaneImageSaver class because KSaneWidget (part of libksane) uses QImage to save files and QImage doesn't support 16bit images. Related warning in [libksane](https://github.com/KDE/libksane/blob/master/src/ksanewidget.h#L118)

But Skanlite doesn't add most of optional PNG headers to the exported png file. In particulary it misses pHYs (Physical Pixel Dimensions) info. Without it ScanTailor app can't detect scan's dpi and forces user to choose it manually while png file importing. [Related issue in scantailor](https://github.com/scantailor/scantailor/issues/250)
I've fixed this by adding pHYs to 16bit png based on KSaneWidget::currentDPI() as KSaneWidget [do it itself](https://github.com/KDE/libksane/blob/master/src/ksanewidget.cpp#L627)
---
 src/KSaneImageSaver.cpp | 11 ++++++++---
 src/KSaneImageSaver.h   |  4 ++--
 src/skanlite.cpp        |  2 +-
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/KSaneImageSaver.cpp b/src/KSaneImageSaver.cpp
index aaffed2..49123a1 100644
--- a/src/KSaneImageSaver.cpp
+++ b/src/KSaneImageSaver.cpp
@@ -46,6 +46,7 @@ struct KSaneImageSaver::Private {
     int        m_width;
     int        m_height;
     int        m_format;
+    int        m_dpi;
     ImageType  m_type;
 
     bool savePng();
@@ -64,7 +65,7 @@ KSaneImageSaver::~KSaneImageSaver()
     delete d;
 }
 
-bool KSaneImageSaver::savePng(const QString &name, const QByteArray &data, int width, int height, int format)
+bool KSaneImageSaver::savePng(const QString &name, const QByteArray &data, int width, int height, int format, int dpi)
 {
     if (!d->m_runMutex.tryLock()) {
         return false;
@@ -75,15 +76,16 @@ bool KSaneImageSaver::savePng(const QString &name, const QByteArray &data, int w
     d->m_width  = width;
     d->m_height = height;
     d->m_format = format;
+    d->m_dpi    = dpi;
     d->m_type   = Private::ImageTypePNG;
 
     start();
     return true;
 }
 
-bool KSaneImageSaver::savePngSync(const QString &name, const QByteArray &data, int width, int height, int format)
+bool KSaneImageSaver::savePngSync(const QString &name, const QByteArray &data, int width, int height, int format, int dpi)
 {
-    if (!savePng(name, data, width, height, format)) {
+    if (!savePng(name, data, width, height, format, dpi)) {
         qDebug() << "fail";
         return false;
     }
@@ -192,6 +194,9 @@ bool KSaneImageSaver::Private::savePng()
 
     png_set_sBIT(png_ptr, info_ptr, &sig_bit);
 
+    png_uint_32 dpm = m_dpi * (1000.0 / 25.4);
+    png_set_pHYs(png_ptr, info_ptr, dpm, dpm, 1);
+
     /* Optionally write comments into the image */
 //     text_ptr[0].key = "Title";
 //     text_ptr[0].text = "Mona Lisa";
diff --git a/src/KSaneImageSaver.h b/src/KSaneImageSaver.h
index 0ee23ac..96cc763 100644
--- a/src/KSaneImageSaver.h
+++ b/src/KSaneImageSaver.h
@@ -37,9 +37,9 @@ public:
     KSaneImageSaver(QObject *parent = 0);
     ~KSaneImageSaver();
 
-    bool savePng(const QString &name, const QByteArray &data, int width, int height, int format);
+    bool savePng(const QString &name, const QByteArray &data, int width, int height, int format, int dpi);
 
-    bool savePngSync(const QString &name, const QByteArray &data, int width, int height, int format);
+    bool savePngSync(const QString &name, const QByteArray &data, int width, int height, int format, int dpi);
 
     bool saveTiff(const QString &name, const QByteArray &data, int width, int height, int format);
 
diff --git a/src/skanlite.cpp b/src/skanlite.cpp
index 1f1541c..7a671a2 100644
--- a/src/skanlite.cpp
+++ b/src/skanlite.cpp
@@ -498,7 +498,7 @@ void Skanlite::saveImage()
         (m_format == KSaneIface::KSaneWidget::FormatGrayScale16))
     {
         KSaneImageSaver saver;
-        if (saver.savePngSync(localName, m_data, m_width, m_height, m_format)) {
+        if (saver.savePngSync(localName, m_data, m_width, m_height, m_format, m_ksanew->currentDPI())) {
             m_showImgDialog->close(); // closing the window if it is closed should not be a problem.
         }
         else {
-- 
cgit v0.11.2