Skip to content

Commit

Permalink
png compression is used for monochrome image pdf
Browse files Browse the repository at this point in the history
  • Loading branch information
ksharindam committed May 24, 2020
1 parent c4119cd commit ea00999
Show file tree
Hide file tree
Showing 11 changed files with 206 additions and 145 deletions.
13 changes: 8 additions & 5 deletions src/dialogs.cpp
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
#include "dialogs.h"
#include "common.h"
#include <QCheckBox>
#include <QDialogButtonBox>
#include <QGridLayout>
#include <cmath>

// Dialog to set JPG image quality for saving
QualityDialog:: QualityDialog(QWidget *parent, QImage &img) : QDialog(parent), image(img)
{
setWindowTitle("Set Quality");
setWindowTitle("Set Compression");
timer = new QTimer(this);
timer->setSingleShot(true);
timer->setInterval(800);
QLabel *qualityLabel = new QLabel("Set Image Quality (%):", this);
QLabel *qualityLabel = new QLabel("Compression Level :", this);
qualitySpin = new QSpinBox(this);
qualitySpin->setAlignment(Qt::AlignHCenter);
qualitySpin->setSuffix(" %");
qualitySpin->setRange(10,100);
qualitySpin->setValue(75);
QCheckBox *showSizeCheck = new QCheckBox("Show File Size", this);
Expand Down Expand Up @@ -59,7 +59,7 @@ QualityDialog:: checkFileSize()
}

// dialog to choose paper size
PaperSizeDialog:: PaperSizeDialog(QWidget *parent) : QDialog(parent)
PaperSizeDialog:: PaperSizeDialog(QWidget *parent, bool landscapeMode) : QDialog(parent)
{
this->resize(250, 120);
this->setWindowTitle("Paper Size");
Expand All @@ -68,10 +68,13 @@ PaperSizeDialog:: PaperSizeDialog(QWidget *parent) : QDialog(parent)
combo = new QComboBox(this);
combo->addItem("Automatic");
combo->addItem("A4");
combo->addItem("A4 Landscape");
combo->addItem("A5");
landscape = new QCheckBox("Landscape", this);
landscape->setChecked(landscapeMode);
QDialogButtonBox *btnBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, Qt::Horizontal, this);
vLayout->addWidget(label);
vLayout->addWidget(combo);
vLayout->addWidget(landscape);
vLayout->addWidget(btnBox);
connect(btnBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(btnBox, SIGNAL(rejected()), this, SLOT(reject()));
Expand Down
4 changes: 3 additions & 1 deletion src/dialogs.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QLabel>
#include <QSpinBox>
#include <QComboBox>
#include <QCheckBox>
#include <QImage>
#include <QTimer>

Expand All @@ -26,6 +27,7 @@ class PaperSizeDialog : public QDialog
{
public:
QComboBox *combo;
PaperSizeDialog(QWidget *parent);
QCheckBox *landscape;
PaperSizeDialog(QWidget *parent, bool landscapeMode);
};

58 changes: 29 additions & 29 deletions src/inpaint_dialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -230,31 +230,6 @@
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="5">
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="brushSizeLabel">
<property name="text">
Expand Down Expand Up @@ -285,18 +260,43 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="5">
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="statusbar">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Tip : To erase an area, draw over that area and click Erase</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="eraseBtn">
<property name="text">
Expand Down
102 changes: 73 additions & 29 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ Window:: Window()
saveMenu->addAction("Open Image", this, SLOT(openFile()));
saveBtn->setMenu(saveMenu);
QMenu *transformMenu = new QMenu(transformBtn);
transformMenu->addAction("Mirror", this, SLOT(mirror()));
transformMenu->addAction("Straighten", this, SLOT(perspectiveTransform()));
transformMenu->addAction("Mirror Image", this, SLOT(mirror()));
transformMenu->addAction("Un-tilt Image", this, SLOT(perspectiveTransform()));
transformBtn->setMenu(transformMenu);
QMenu *decorateMenu = new QMenu(decorateBtn);
decorateMenu->addAction("Photo Grid", this, SLOT(createPhotoGrid()));
Expand Down Expand Up @@ -180,7 +180,7 @@ Window:: saveImage(QString filename)
int quality = -1;
if (filename.endsWith(".jpg", Qt::CaseInsensitive)) {
if (img.hasAlphaChannel()) { // converts background to white
img = QImage(img.width(), img.height(), QImage::Format_ARGB32);
img = QImage(img.width(), img.height(), QImage::Format_RGB32);
img.fill(Qt::white);
QPainter painter(&img);
painter.drawImage(0,0, canvas->image);
Expand Down Expand Up @@ -234,7 +234,7 @@ Window:: autoResizeAndSave()
QImage scaled = canvas->image.scaledToWidth(res2, Qt::SmoothTransformation);
float size2 = getJpgFileSize(scaled)/1024.0;
bool ok;
float sizeOut = QInputDialog::getInt(this, "File Size", "Maximum File Size (kB) :", size1/2, 1, size1, 1, &ok);
float sizeOut = QInputDialog::getInt(this, "File Size", "File Size below (kB) :", size1/2, 1, size1, 1, &ok);
if (not ok)
return;
float resOut = log10(res1/res2)/log10(size1/size2) * log10(sizeOut/size1) + log10(res1);
Expand All @@ -257,28 +257,44 @@ Window:: autoResizeAndSave()
notifier->notify("Image Saved !", QFileInfo(path).fileName());
}

bool isMonochrome(QImage img)
{
for (int y=0; y<img.height(); y++) {
QRgb *row = (QRgb*) img.constScanLine(y);
for (int x=0; x<img.width(); x++) {
int clr = (row[x] & 0xffffff);
if (not (clr==0 or clr==0xffffff)) return false;
}
}
return true;
}

void
Window:: exportToPdf()
{
if (canvas->image.isNull()) return;
QImage image = canvas->image;
// get or calculate paper size
PaperSizeDialog *dlg = new PaperSizeDialog(this);
PaperSizeDialog *dlg = new PaperSizeDialog(this, image.width()>image.height());
if (dlg->exec()==QDialog::Rejected) return;
float pdf_w, pdf_h;
switch (dlg->combo->currentIndex()) {
case 1:
pdf_w = 595.0;
pdf_h = 842.0;
pdf_h = 841.0;
break;
case 2:
pdf_w = 842.0;
pdf_w = 420.0;
pdf_h = 595.0;
break;
default:
pdf_w = 595.0;
pdf_h = ceilf((pdf_w*image.height())/image.width());
break;
}
if (dlg->combo->currentIndex()!=0 and dlg->landscape->isChecked() ) {
int tmp = pdf_w;
pdf_w = pdf_h;
pdf_h = tmp;
}
// get image dimension and position
int img_w = pdf_w;
Expand All @@ -289,17 +305,18 @@ Window:: exportToPdf()
}
int x = (pdf_w-img_w)/2;
int y = (pdf_h-img_h)/2;
//qDebug()<< x<<img_w<<y<<img_h;

// remove transperancy
if (image.format()==QImage::Format_ARGB32) {
QImage new_img(image.width(), image.height(), QImage::Format_ARGB32);
QImage new_img(image.width(), image.height(), QImage::Format_RGB32);
new_img.fill(Qt::white);
QPainter painter(&new_img);
painter.drawImage(0,0, image);
painter.end();
image = new_img;
}
if (isMonochrome(image))
image = image.convertToFormat(QImage::Format_Mono);

QFileInfo fi(filename);
QString dir = fi.dir().path();
Expand All @@ -316,20 +333,42 @@ Window:: exportToPdf()
PdfObj img;
img.set("Type", "/XObject");
img.set("Subtype", "/Image");
img.set("ColorSpace", "/DeviceRGB");
img.set("BitsPerComponent", "8");
img.set("Filter", "/DCTDecode"); // jpg = DCTDecode, for png = FlateDecode
img.set("Width", image.width());
img.set("Height", image.height());

QByteArray bArray;
QBuffer buffer(&bArray);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "JPG");
std::string data(bArray.data(), bArray.size());
writer.addObj(img, data);
bArray.clear();
buffer.close();
// using PNG compression is best for Monochrome images
if (image.format()==QImage::Format_Mono) {
img.set("ColorSpace", "[/Indexed /DeviceRGB 1 <ffffff000000>]");
img.set("BitsPerComponent", "1");
img.set("Filter", "/FlateDecode");
PdfDict decode_params;
decode_params.set("Predictor", 15);
decode_params.set("Columns", image.width());
decode_params.set("BitsPerComponent", 1);
decode_params.set("Colors", 1);
img.set("DecodeParms", decode_params);
QByteArray bArray;
QBuffer buffer(&bArray);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG");
std::string data = getPngIdat(bArray.data(), bArray.size());
writer.addObj(img, data);
bArray.clear();
buffer.close();
}
// Embed image as whole JPEG image
else {
img.set("ColorSpace", "/DeviceRGB");
img.set("BitsPerComponent", "8");
img.set("Filter", "/DCTDecode"); // jpg = DCTDecode
QByteArray bArray;
QBuffer buffer(&bArray);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "JPG");
std::string data(bArray.data(), bArray.size());
writer.addObj(img, data);
bArray.clear();
buffer.close();
}

std::string matrix = imgMatrix(x, y, img_w, img_h, 0);
std::string cont_strm = format("q %s /img0 Do Q\n", matrix.c_str());
Expand Down Expand Up @@ -389,12 +428,13 @@ Window:: resizeImage()
void
Window:: cropImage()
{
hideButtons();
frame->hide();
frame_2->hide();
Crop *crop = new Crop(canvas, statusbar);
connect(canvas, SIGNAL(mousePressed(QPoint)), crop, SLOT(onMousePress(QPoint)));
connect(canvas, SIGNAL(mouseReleased(QPoint)), crop, SLOT(onMouseRelease(QPoint)));
connect(canvas, SIGNAL(mouseMoved(QPoint)), crop, SLOT(onMouseMove(QPoint)));
connect(crop, SIGNAL(finished()), this, SLOT(hideButtons()));
connect(crop, SIGNAL(finished()), this, SLOT(onEditingFinished()));
}

void
Expand Down Expand Up @@ -657,12 +697,14 @@ Window:: mirror()
void
Window:: perspectiveTransform()
{
hideButtons();
frame->hide();
frame_2->hide();
setWindowTitle("Perspective Transform");
PerspectiveTransform *transform = new PerspectiveTransform(canvas, statusbar);
connect(canvas, SIGNAL(mousePressed(QPoint)), transform, SLOT(onMousePress(QPoint)));
connect(canvas, SIGNAL(mouseReleased(QPoint)), transform, SLOT(onMouseRelease(QPoint)));
connect(canvas, SIGNAL(mouseMoved(QPoint)), transform, SLOT(onMouseMove(QPoint)));
connect(transform, SIGNAL(finished()), this, SLOT(hideButtons()));
connect(transform, SIGNAL(finished()), this, SLOT(onEditingFinished()));
}

void
Expand Down Expand Up @@ -750,10 +792,11 @@ Window:: updateStatus()

// hide if not hidden, unhide if hidden
void
Window:: hideButtons()
Window:: onEditingFinished()
{
frame->setHidden(frame->isVisible());
frame_2->setHidden(frame_2->isVisible());
frame->show();
frame_2->show();
setWindowTitle(QFileInfo(filename).fileName());
}

void
Expand All @@ -763,6 +806,7 @@ Window:: disableButtons(bool disable)
cropBtn->setDisabled(disable);
transformBtn->setDisabled(disable);
decorateBtn->setDisabled(disable);
toolsBtn->setDisabled(disable);
effectsBtn->setDisabled(disable);
zoomInBtn->setDisabled(disable);
zoomOutBtn->setDisabled(disable);
Expand Down
4 changes: 2 additions & 2 deletions src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ class Window : public QMainWindow, Ui_MainWindow
void adjustWindowSize(bool animation=false);
//Variables declaration
Canvas *canvas;
QString filename;
int screen_width, screen_height, offset_x, offset_y, btnboxwidth;
QTimer *timer; // Slideshow timer
QString filename;
private:
void connectSignals();
float fitToScreenScale(QImage img);
Expand Down Expand Up @@ -64,7 +64,7 @@ public slots:
void rotateRight();
void playPause();
// others
void hideButtons();
void onEditingFinished();
void updateStatus();
};

Expand Down
Loading

0 comments on commit ea00999

Please sign in to comment.