Skip to content
OE_io_JPG.cpp 2.58 KiB
Newer Older
3dsman's avatar
3dsman committed
* 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
*/

#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;
}