Newer
Older
* This file is part of project OpenEmbroidery. It's copyrighted by
* the contributors recorded in the version control history of the file.
* Original project location https://code.electrolab.fr/openEmbroidery/openEmbroidery_software
*
* SPDX-License-Identifier: CECILL-2.1
* License-Filename: Licence_CeCILL_V2.1-en.txt
*/
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
100
101
102
103
104
105
106
107
108
#include "OE_io.h"
#include "OE_document.h"
#include "stitchs/OE_birailstitch.h"
#include "stitchs/OE_linestitch.h"
#include "stitchs/OE_linkstitch.h"
#include "stitchs/OE_fillstitch.h"
#include "stitchs/OE_staticstitch.h"
#include "OE_utils.h"
#include <iostream>
#include <fstream>
#include <QImage>
#include <QPainter>
#include <QPen>
#include <QImageWriter>
static bool saveToJPG(const OE_document* document, std::string path);
extern const OE_io ioJpg;
const OE_io ioJpg = {"jpg",
"Jpg",
nullptr,
saveToJPG};
static inline QPointF transformPoint(const vector_2d& pt, const vector_2d& offset, float scale)
{
vector_2d newPt = (pt - offset) * scale;
return QPointF(newPt.x, newPt.y);
}
static bool saveToJPG(const OE_document* document, std::string path)
{
const int maxsize = 512;
const int quality = 90;
int w,h;
float scale;
BoundingBox bb = document->getBound();
vector_2d ptMin = bb.getMin();
if (bb.getMax().y-bb.getMin().y <= bb.getMax().x-bb.getMin().x)
{
w = maxsize;
h = w * (bb.getMax().y-bb.getMin().y) / (bb.getMax().x-bb.getMin().x) + 0.5f;
scale = maxsize / (bb.getMax().x-bb.getMin().x);
}
else
{
h = maxsize;
w = h * (bb.getMax().x-bb.getMin().x) / (bb.getMax().y-bb.getMin().y) + 0.5f;
scale = maxsize / (bb.getMax().y-bb.getMin().y);
}
QImage image(w, h, QImage::Format_RGB888);
image.fill(Qt::white);
QPainter painter(&image);
painter.setRenderHint(QPainter::RenderHint::Antialiasing);
for (OE_stitchs* stitch : document->stitchs)
{
if (stitch->getPoints().empty() || dynamic_cast<OE_linkstitch*>(stitch))
{
continue;
}
QPointF lastPoint = transformPoint(stitch->getPoints()[0], ptMin, scale);
OE_color oecol = stitch->getThread()->getColor();
QPen pen(QColor(oecol.rgba[0]*255,oecol.rgba[1]*255,oecol.rgba[2]*255,255));
painter.setPen(pen);
if (stitch->getNpts()==1)
{
painter.drawPoint(lastPoint);
}
else
{
for (ssize_t i=1; i<stitch->getNpts(); i++)
{
QPointF newPoint = transformPoint(stitch->getPoints()[i], ptMin, scale);
painter.drawLine(lastPoint, newPoint);
lastPoint = newPoint;
}
}
}
painter.end();
QImageWriter writer(QString::fromStdString(path));
writer.setQuality(quality);
writer.write(image);
return true;
}