Есть функция на С:
int fp_img_save_to_file(struct fp_img *img, char *path)
{
FILE *fd = fopen(path, "w");
size_t write_size = img->width * img->height;
int r;
if (!fd) {
fp_dbg("could not open '%s' for writing: %d", path, errno);
return -errno;
}
r = fprintf(fd, "P5 %d %d 255\n", img->width, img->height);
if (r < 0) {
fp_err("pgm header write failed, error %d", r);
return r;
}
r = fwrite(img->data, 1, write_size, fd);
if (r < write_size) {
fp_err("short write (%d)", r);
return -EIO;
}
fclose(fd);
fp_dbg("written to '%s'", path);
return 0;
}
Уже полночи пытаюсь переписать ее на ByteArray. Вышло пока вот это:
QByteArray create_pgm(struct fp_img *img)
{
int width = fp_img_get_width(img);
int height = fp_img_get_height(img);
//int size = width * height;
unsigned char * data = fp_img_get_data(img);
QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << "P5 " << width << " " << height << " 255" << endl;
out << data;
buffer.close();
QByteArray byteArray(buffer.data());
return byteArray;
}
Но пишется в массив какая-то ахинея. P5, например, не в начале, а где-то на 5-6 байтах. В чем проблема?
P.S. Эта функция пишет PGM изображение из GrayScale Data.
Сделал вот таким вот способом. Но возможно существует более элегантное решение?
QByteArray create_pgm(struct fp_img *img)
{
int width = fp_img_get_width(img);
int height = fp_img_get_height(img);
int size = width * height;
unsigned char * data = fp_img_get_data(img);
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
// вот это вот место не нравится
QString str;
str.sprintf("P5 %d %d 255\n", width, height);
buffer.write(QByteArray(str.toAscii()));
buffer.write(QByteArray::fromRawData(reinterpret_cast < const char* > (data), size));
buffer.close();
return byteArray;
}
Отправить комментарий