Простой способ написать несжатый JPEG или PNG изображение? - PullRequest
1 голос
/ 09 апреля 2019

У меня есть сырое изображение в памяти, организованное как массив 32-битных значений RGB. Я хотел бы как можно быстрее записать это в файл изображения, чтобы освободить память. Есть ли способ сделать следующее, чтобы написать несжатое изображение в формате JPEG, PNG или TIFF? Или, может быть, я должен сказать, какие форматы изображений совместимы с таким подходом к записи необработанных данных пикселей? Обратите внимание, что верхний левый пиксель находится в первых 4 байтах данных пикселя.

void write_image(uint32_t *pixels, int width, int height) {
 FILE *file=fopen("file.jpg","wb");
 write_header (file, width, height);
 fwrite (pixels,1,width*height*4,file); // write raw pixel data
 write_end (file);
 fclose(file);
}

1 Ответ

1 голос
/ 09 апреля 2019

С вашей стороны, похоже, есть две разные проблемы или мотивы.

Во-первых, есть желание написать изображение в каком-то формате без сжатия для (предположительно) увеличения скорости.PNG и JPEG являются сжатыми форматами, хотя вы можете указать кодировщику (по крайней мере, в некоторых реализациях PNG) использовать настройку «без сжатия».

Однако: a) есть несколько сценариев, в которых эта «оптимизация» имела бы решающее значение, обычные компрессоры довольно быстрые.

b) Даже при кодировании с использованием некоторых настроек compression_level=0вы все еще кодируете изображение в определенном формате (обычно заголовок, для начала).Что приводит нас ко второй мотивации.

Во-вторых, кажется, что вы хотите избежать не только (только) сжатия, но и кодирования.То есть вы хотите записать пиксели в вашем незашифрованном («сыром») формате.В этом случае, конечно, вы не можете написать изображение в формате PNG или JPEG.Вы можете использовать свой собственный или некоторый стандартный формат RAW , или квази-сырой BMP формат.Но вам все равно нужно позаботиться о том, как пиксели организованы в памяти (например, один байт на канал? RGB? BGR? RGBA?) И, возможно, о некоторых других проблемах (например, BMP требует, чтобы байт на строку кратно 4).

...