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