104 lines
2.6 KiB
C++
104 lines
2.6 KiB
C++
|
#include "xygifcreator.h"
|
|||
|
#include <QImage>
|
|||
|
#include <QThread>
|
|||
|
|
|||
|
#include "gif.h"
|
|||
|
|
|||
|
class XYGif : public QObject
|
|||
|
{
|
|||
|
Q_OBJECT
|
|||
|
public:
|
|||
|
explicit XYGif()
|
|||
|
{
|
|||
|
moveToThread(&mWorkThread);
|
|||
|
}
|
|||
|
~XYGif()
|
|||
|
{
|
|||
|
if (mWorkThread.isRunning())
|
|||
|
{
|
|||
|
mWorkThread.quit();
|
|||
|
mWorkThread.wait();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public slots:
|
|||
|
void begin(const QString &file, int width, int height, int delay)
|
|||
|
{
|
|||
|
GifBegin(&mGifWriter, file.toUtf8().data(), static_cast<quint32>(width), static_cast<quint32>(height), static_cast<quint32>(delay));
|
|||
|
}
|
|||
|
void frame(const QImage &img, int width, int height, int delay)
|
|||
|
{
|
|||
|
GifWriteFrame(&mGifWriter, img.bits(),
|
|||
|
static_cast<quint32>(qMin(width, img.width())),
|
|||
|
static_cast<quint32>(qMin(height, img.height())),
|
|||
|
static_cast<quint32>(100.0 / delay));
|
|||
|
}
|
|||
|
void end()
|
|||
|
{
|
|||
|
GifEnd(&mGifWriter);
|
|||
|
|
|||
|
mWorkThread.quit();
|
|||
|
}
|
|||
|
|
|||
|
private:
|
|||
|
GifWriter mGifWriter;
|
|||
|
QThread mWorkThread;
|
|||
|
|
|||
|
friend class XYGifCreator;
|
|||
|
};
|
|||
|
|
|||
|
XYGifCreator::XYGifCreator(QObject *parent)
|
|||
|
: QObject(parent)
|
|||
|
{
|
|||
|
mGif = new XYGif;
|
|||
|
connect(&mGif->mWorkThread, &QThread::finished, this, &XYGifCreator::finished);
|
|||
|
}
|
|||
|
|
|||
|
XYGifCreator::~XYGifCreator()
|
|||
|
{
|
|||
|
delete mGif;
|
|||
|
}
|
|||
|
|
|||
|
void XYGifCreator::startThread()
|
|||
|
{
|
|||
|
mGif->mWorkThread.start();
|
|||
|
}
|
|||
|
|
|||
|
bool XYGifCreator::isRunning()
|
|||
|
{
|
|||
|
return mGif->mWorkThread.isRunning();
|
|||
|
}
|
|||
|
|
|||
|
void XYGifCreator::begin(const QString &file, int width, int height, int delay, Qt::ConnectionType type)
|
|||
|
{
|
|||
|
mWidth = width;
|
|||
|
mHeight = height;
|
|||
|
|
|||
|
QMetaObject::invokeMethod(mGif, "begin", type,
|
|||
|
QGenericReturnArgument(),
|
|||
|
Q_ARG(QString, file),
|
|||
|
Q_ARG(int, width),
|
|||
|
Q_ARG(int, height),
|
|||
|
Q_ARG(int, delay));
|
|||
|
}
|
|||
|
|
|||
|
void XYGifCreator::frame(const QImage &img, int delay, Qt::ConnectionType type)
|
|||
|
{
|
|||
|
// gif.h 文件有描述目前只能是RGBA8888图片格式,并且alpha没有被使用
|
|||
|
QImage img32 = img.convertToFormat(QImage::Format_RGBA8888);
|
|||
|
|
|||
|
QMetaObject::invokeMethod(mGif, "frame", type,
|
|||
|
QGenericReturnArgument(),
|
|||
|
Q_ARG(QImage, img32),
|
|||
|
Q_ARG(int, mWidth),
|
|||
|
Q_ARG(int, mHeight),
|
|||
|
Q_ARG(int, delay));
|
|||
|
}
|
|||
|
|
|||
|
void XYGifCreator::end(Qt::ConnectionType type)
|
|||
|
{
|
|||
|
QMetaObject::invokeMethod(mGif, "end", type);
|
|||
|
}
|
|||
|
|
|||
|
#include "xygifcreator.moc"
|