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
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "extrafiltersplugin.h"
#include <QInputDialog>
QStringList ExtraFiltersPlugin::filters() const
{
return {tr("Flip Horizontally"), tr("Flip Vertically"),
tr("Smudge..."), tr("Threshold...")};
}
QImage ExtraFiltersPlugin::filterImage(const QString &filter,
const QImage &image, QWidget *parent)
{
QImage original = image.convertToFormat(QImage::Format_RGB32);
QImage result = original;
if (filter == tr("Flip Horizontally")) {
for (int y = 0; y < original.height(); ++y) {
for (int x = 0; x < original.width(); ++x) {
QRgb pixel = original.pixel(original.width() - x - 1, y);
result.setPixel(x, y, pixel);
}
}
} else if (filter == tr("Flip Vertically")) {
for (int y = 0; y < original.height(); ++y) {
for (int x = 0; x < original.width(); ++x) {
QRgb pixel = original.pixel(x, original.height() - y - 1);
result.setPixel(x, y, pixel);
}
}
} else if (filter == tr("Smudge...")) {
bool ok;
int numIters = QInputDialog::getInt(parent, tr("Smudge Filter"),
tr("Enter number of iterations:"),
5, 1, 20, 1, &ok);
if (ok) {
for (int i = 0; i < numIters; ++i) {
for (int y = 1; y < original.height() - 1; ++y) {
for (int x = 1; x < original.width() - 1; ++x) {
QRgb p1 = original.pixel(x, y);
QRgb p2 = original.pixel(x, y + 1);
QRgb p3 = original.pixel(x, y - 1);
QRgb p4 = original.pixel(x + 1, y);
QRgb p5 = original.pixel(x - 1, y);
int red = (qRed(p1) + qRed(p2) + qRed(p3) + qRed(p4)
+ qRed(p5)) / 5;
int green = (qGreen(p1) + qGreen(p2) + qGreen(p3)
+ qGreen(p4) + qGreen(p5)) / 5;
int blue = (qBlue(p1) + qBlue(p2) + qBlue(p3)
+ qBlue(p4) + qBlue(p5)) / 5;
int alpha = (qAlpha(p1) + qAlpha(p2) + qAlpha(p3)
+ qAlpha(p4) + qAlpha(p5)) / 5;
result.setPixel(x, y, qRgba(red, green, blue, alpha));
}
}
}
}
} else if (filter == tr("Threshold...")) {
bool ok;
int threshold = QInputDialog::getInt(parent, tr("Threshold Filter"),
tr("Enter threshold:"),
10, 1, 256, 1, &ok);
if (ok) {
int factor = 256 / threshold;
for (int y = 0; y < original.height(); ++y) {
for (int x = 0; x < original.width(); ++x) {
QRgb pixel = original.pixel(x, y);
result.setPixel(x, y, qRgba(qRed(pixel) / factor * factor,
qGreen(pixel) / factor * factor,
qBlue(pixel) / factor * factor,
qAlpha(pixel)));
}
}
}
}
return result;
}
|