5
6
7
8
9
10
11
12
21
22
23
24
28 setWindowTitle(tr(
"QImage Color Separations"));
33 setCentralWidget(createCentralWidget());
37
38
39
40
41
42
43
47 fileMenu =
new QMenu(tr(
"&File"),
this);
48 brightnessMenu =
new QMenu(tr(
"&Brightness"),
this);
50 QAction *openAction = fileMenu->addAction(tr(
"&Open..."));
51 openAction->setShortcut(QKeySequence(
"Ctrl+O"));
52 saveAction = fileMenu->addAction(tr(
"&Save..."));
53 saveAction->setShortcut(QKeySequence(
"Ctrl+S"));
54 saveAction->setEnabled(
false);
55 QAction *quitAction = fileMenu->addAction(tr(
"E&xit"));
56 quitAction->setShortcut(QKeySequence(
"Ctrl+Q"));
58 QAction *noBrightness = brightnessMenu->addAction(tr(
"&0%"));
59 noBrightness->setCheckable(
true);
60 QAction *quarterBrightness = brightnessMenu->addAction(tr(
"&25%"));
61 quarterBrightness->setCheckable(
true);
62 QAction *halfBrightness = brightnessMenu->addAction(tr(
"&50%"));
63 halfBrightness->setCheckable(
true);
64 QAction *threeQuartersBrightness = brightnessMenu->addAction(tr(
"&75%"));
65 threeQuartersBrightness->setCheckable(
true);
66 QAction *fullBrightness = brightnessMenu->addAction(tr(
"&100%"));
67 fullBrightness->setCheckable(
true);
69 menuMap[noBrightness] = None;
70 menuMap[quarterBrightness] = Quarter;
71 menuMap[halfBrightness] = Half;
72 menuMap[threeQuartersBrightness] = ThreeQuarters;
73 menuMap[fullBrightness] = Full;
75 currentBrightness = fullBrightness;
76 currentBrightness->setChecked(
true);
77 brightnessMenu->setEnabled(
false);
79 menuBar()->addMenu(fileMenu);
80 menuBar()->addMenu(brightnessMenu);
82 connect(openAction, &QAction::triggered,
this, &Viewer::chooseFile);
83 connect(saveAction, &QAction::triggered,
this, &Viewer::saveImage);
84 connect(quitAction, &QAction::triggered, qApp, QApplication::quit);
85 connect(brightnessMenu, &QMenu::triggered,
86 this, &Viewer::setBrightness);
90
91
92
93
94
96QFrame*
Viewer::createCentralWidget()
98 QFrame* frame =
new QFrame(
this);
99 grid =
new QGridLayout(frame);
102 layout()->setSizeConstraint(QLayout::SetFixedSize);
104 QSize labelSize(256, 256);
106 finalWidget =
new FinalWidget(frame, tr(
"Final image"), labelSize);
108 cyanWidget =
new ScreenWidget(frame, Qt::cyan, tr(
"Cyan"),
109 ScreenWidget::Cyan, labelSize);
110 magentaWidget =
new ScreenWidget(frame, Qt::magenta, tr(
"Magenta"),
111 ScreenWidget::Magenta, labelSize);
112 yellowWidget =
new ScreenWidget(frame, Qt::yellow, tr(
"Yellow"),
113 ScreenWidget::Yellow, labelSize);
115 connect(cyanWidget, &ScreenWidget::imageChanged,
this, &Viewer::createImage);
116 connect(magentaWidget, &ScreenWidget::imageChanged,
this, &Viewer::createImage);
117 connect(yellowWidget, &ScreenWidget::imageChanged,
this, &Viewer::createImage);
119 grid->addWidget(finalWidget, 0, 0, Qt::AlignTop | Qt::AlignHCenter);
120 grid->addWidget(cyanWidget, 0, 1, Qt::AlignTop | Qt::AlignHCenter);
121 grid->addWidget(magentaWidget, 1, 0, Qt::AlignTop | Qt::AlignHCenter);
122 grid->addWidget(yellowWidget, 1, 1, Qt::AlignTop | Qt::AlignHCenter);
128
129
130
131
135 QString imageFile = QFileDialog::getOpenFileName(
this,
136 tr(
"Choose an image file to open"), path, tr(
"Images (*.*)"));
138 if (!imageFile.isEmpty()) {
139 openImageFile(imageFile);
145
146
147
148
149
150
154 if (!menuMap.contains(action) || scaledImage.isNull())
157 Brightness amount = menuMap[action];
161 brightness = 0;
break;
163 brightness = 64;
break;
165 brightness = 128;
break;
167 brightness = 191;
break;
169 brightness = 255;
break;
173 currentBrightness->setChecked(
false);
174 currentBrightness = action;
175 currentBrightness->setChecked(
true);
181
182
183
184
185
186
188void Viewer::openImageFile(QString &imageFile)
190 QImage originalImage;
192 if (originalImage.load(imageFile)) {
193 setWindowTitle(imageFile);
195 saveAction->setEnabled(
true);
196 brightnessMenu->setEnabled(
true);
199 scaledImage = originalImage.scaled(256, 256, Qt::KeepAspectRatio);
201 cyanWidget->setImage(scaledImage);
202 magentaWidget->setImage(scaledImage);
203 yellowWidget->setImage(scaledImage);
207 (
void) QMessageBox::warning(
this, tr(
"Cannot open file"),
208 tr(
"The selected file could not be opened."),
209 QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton);
213
214
215
216
217
218
219
220
224 QImage newImage = scaledImage.copy();
226 QImage *image1 = cyanWidget->image();
227 QImage *image2 = magentaWidget->image();
228 QImage *image3 = yellowWidget->image();
229 int darkness = 255 - brightness;
231 for (
int y = 0; y < newImage.height(); ++y) {
232 for (
int x = 0; x < newImage.width(); ++x) {
237 QRgb p1(image1->pixel(x, y));
238 float cyan1 = 255 - qRed(p1);
239 float magenta1 = 255 - qGreen(p1);
240 float yellow1 = 255 - qBlue(p1);
242 QRgb p2(image2->pixel(x, y));
243 float cyan2 = 255 - qRed(p2);
244 float magenta2 = 255 - qGreen(p2);
245 float yellow2 = 255 - qBlue(p2);
247 QRgb p3(image3->pixel(x, y));
248 float cyan3 = 255 - qRed(p3);
249 float magenta3 = 255 - qGreen(p3);
250 float yellow3 = 255 - qBlue(p3);
253 qMax(255 -
int(cyan1+cyan2+cyan3) - darkness, 0),
254 qMax(255 -
int(magenta1+magenta2+magenta3) - darkness, 0),
255 qMax(255 -
int(yellow1+yellow2+yellow3) - darkness, 0));
257 newImage.setPixel(x, y, newColor.rgb());
261 finalWidget->setPixmap(QPixmap::fromImage(newImage));
265
266
270 QString imageFile = QFileDialog::getSaveFileName(
this,
271 tr(
"Choose a filename to save the image"),
"", tr(
"Images (*.png)"));
273 QFileInfo info(imageFile);
275 if (!info.baseName().isEmpty()) {
276 QString newImageFile = QFileInfo(info.absoluteDir(),
277 info.baseName() +
".png").absoluteFilePath();
279 if (!finalWidget->pixmap().save(newImageFile,
"PNG"))
280 (
void) QMessageBox::warning(
this, tr(
"Cannot save file"),
281 tr(
"The file could not be saved."),
282 QMessageBox::Cancel, QMessageBox::NoButton,
283 QMessageBox::NoButton);
286 (
void) QMessageBox::warning(
this, tr(
"Cannot save file"),
287 tr(
"Please enter a valid filename."),
288 QMessageBox::Cancel, QMessageBox::NoButton,
289 QMessageBox::NoButton);
void setBrightness(QAction *action)