Резюме
Я хочу написать файл .png как можно быстрее, не заботясь о сжатии. То есть меня не волнует размер файла, но мне важно, чтобы запись происходила как можно быстрее.
Мотивация
Я создаю веб-приложение для карт, использующее OpenLayers на стороне клиента и python / C ++ на стороне сервера. Приложение должно уметь быстро рисовать динамический контент, когда пользователь перемещается по карте. У меня работают версии на основе плиток (256x256) и на основе одного изображения («одна плитка»), но в обоих случаях самая медленная часть рендеринга на самом деле сохраняет изображение в виде файла png (будь то на -диск или в памяти). Например, я могу быть в состоянии генерировать «сырую», «tga» или «tiff» версию определенного представления примерно за 200 мс, но для генерации версии .png требуется более 1,2 секунды только потому, что .png сохранение занимает почти целую секунду, тогда как время фактического сохранения других форматов составляет 100 мс или меньше (и даже несмотря на то, что «необработанный» файл в пять раз больше размера файла .png). И этот файл экономит время также значительно больше, чем время передачи полученного изображения с сервера на клиент. (Одним из важных свойств моего приложения является то, что в целом «серверная часть» будет работать на том же компьютере, что и браузер, поэтому время передачи незначительно даже для файлов большого размера.)
Я думал, что смогу быстро писать .png (при использовании libpng из C ++), вызвав
png_set_compression_level( png_ptr, 0 );
перед вызовом любых png_write_...
функций. Однако, несмотря на то, что этот вызов действительно останавливает libpng от сжатия файла (размер получаемого файла примерно равен размеру файла .raw), он не делает сохранение файла .png заметно быстрее.
Пожалуйста, помогите
Мне нужно использовать .png для этих изображений, потому что мне нужно, чтобы они были прозрачными наложениями поверх базовой карты, и мне нужно больше, чем 256 цветов, предлагаемых GIF. OpenLayers просто использует теги html img, поэтому я понимаю, что могу использовать только допустимые форматы img.
Я бы подумал, что был бы способ быстро написать файл .png, не делая никакого реального сжатия (я понимаю, что .png «всегда сжат», но я предполагал, что это может включать «нулевое сжатие»). Кажется, что вы должны иметь возможность писать как простой фиксированный заголовок, за которым следуют несжатые данные, а затем какой-то фиксированный нижний колонтитул. Или, может быть, та же идея, но построчно. Дело в том, что я могу очень быстро выполнять все виды циклических операций с этими 2,5 МБ необработанных данных в памяти в C ++ и очень быстро выгружать их в различные форматы файлов, поэтому мне кажется, что я должен иметь возможность записать их в фиксированном виде. , несжатый формат .png также быстро.
Это звучит правильно? Вы знаете, где я могу найти примеры кода, который это делает?