beim schreiben EncoderWriteCallback > QBuffer geht es prima
aber das lesen read geht nicht warum was mache ich falsch?
- schreiben das geht starte ich so:
Code: Alles auswählen
APNGImageStream myqtchunk(1);
png_set_write_fn(png_ptr_write,&myqtchunk,EncoderWriteCallback, NULL);
Code: Alles auswählen
APNGImageStream myqtchunk(0,frame.stream());
png_set_read_fn(png_ptr_read,&myqtchunk,EncoderReadCallback);
Und iher die structur / class vom QBuffer und die 2 lese/schreiben Callback
Code: Alles auswählen
////base ref http://www.littlesvr.ca/apng/tutorial/x148.html
/* png lib from firefox 3 is patch to APNG format! */
#include "../moz_png/png.h"
/* device to write or read image frames */
class APNGImageStream {
public:
APNGImageStream( const int mode , QByteArray in = QByteArray() )
:dev(new QBuffer()),bytes(in)
{
dev->setBuffer(&bytes);
if (mode == 1) {
dev->open(QIODevice::WriteOnly);
} else {
dev->open(QIODevice::ReadOnly);
}
}
~APNGImageStream()
{
dev->close();
}
QBuffer *device() { return dev; }
bool isValid() { return img.loadFromData(dev->data()); }
QByteArray stream() { return dev->data(); }
QImage img;
QBuffer *dev;
QByteArray bytes;
};
// Called by libpng to flush its internal buffer to ours.
static void EncoderWriteCallback(png_structp png, png_bytep data,
png_size_t size) {
APNGImageStream *state = static_cast<APNGImageStream*>(png_get_io_ptr(png));
Q_ASSERT(state->device());
state->device()->write((char*)data,size);
}
// Called by libpng to read original QByteArray that has self created .
static void EncoderReadCallback(png_structp png, png_bytep data,
png_size_t sizer) {
APNGImageStream *state = static_cast<APNGImageStream*>(png_get_io_ptr(png));
Q_ASSERT(state->device());
qDebug() << "### size to read 1/0 " << state->stream().size() << "," << state->device()->isReadable();
state->device()->read((char*)data,sizer);
qDebug() << "### read callback length " << sizer;
}