Newer
Older
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
*/
#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;
}