Эффективность использования PNG по сравнению с BMP с большими файлами

Я написал картографическую программу в Delphi, где пользователь может загрузить растровое изображение в фоновом режиме, которое я сохраняю в памяти. В одном случае пользователь успешно загрузил 44-мегабайтный BMP, но программа работала вяло, и когда он печатал (я разбиваю вывод на плитку), он получал ошибку «Недостаточно ресурсов». Я преобразовал BMP в PNG (3 МБ), и программа работает намного лучше, а задание на печать выполнено успешно.

Поскольку в любом случае PNG необходимо расширить до DIB того же размера, почему существует разница в производительности/ресурсах? Во всяком случае, для загрузки PNG потребуется больше работы и выделения памяти. Что мне не хватает?

Поскольку, похоже, нет очевидных ответов, я напишу небольшой демонстрационный проект, чтобы продолжить исследование.


person Mitch    schedule 05.04.2012    source источник
comment
Вы уверены, что файлы BMP и PNG имеют одинаковое количество пикселей и BitsPerPixel?   -  person Francesca    schedule 05.04.2012
comment
Что вы используете для печати изображения? Вы пишете непосредственно на Printer.Canvas или используете компонент отчета, такой как QuickReport или Rave?   -  person rkawano    schedule 05.04.2012
comment
Франсуа: Да, я получил файл клиентов и попробовал сам. rkawano: Я печатаю плитки DIB, которые отправляю на холст принтера.   -  person Mitch    schedule 05.04.2012
comment
Похоже, у вас где-то утечка памяти.   -  person MickLH    schedule 26.11.2013


Ответы (1)


Разница в сжатии.

BMP = необработанные данные в формате PNG = те же необработанные данные с использованием сжатия без потерь

Это экономит более чем 1 способ в кругах программирования...

  1. загрузка изображения приводит к загрузке меньшего количества необработанных данных в оперативную память.
  2. В этом случае вы обрабатываете меньше необработанных данных, поэтому вам требуется меньше ресурсов.

Плитка означает, что проблема для вас экспоненциальная, например...

44 МБ x 10 плиток = 440 МБ

Vs

3 МБ x 10 плиток = 30 МБ

Принтеры не любят, когда им передаются большие порции данных, и все принтеры, кроме более дорогих, склонны печатать весь документ за один раз (например, буферизовать весь поток).

Таким образом, из вашего приложения пользователь говорит «Печать»… затем ваш код говорит: «Правильно, я отправлю 10 копий этого», и принтер начинает «кэшировать» 440 МБ необработанных данных.

Наиболее распространенные домашние принтеры полагаются на компьютер для кэширования и печати того, что ему дано, но стандартный офисный принтер выполняет кэширование, а затем печатает документ.

Однако ... я думаю, что это необязательная вещь, которую вы можете настроить (хотя я думаю, что это зависит от принтера к принтеру).

РЕДАКТИРОВАТЬ:

Вот кое-что из мира игрового программирования:

http://www.gamedev.net/topic/450104-png-vs-bmp/

person War    schedule 12.04.2012
comment
При отслеживании кода PNG расширяется до DIB, равного по размеру BMP в памяти. Я полагаю, что более эффективный код памяти будет выполнять преобразование по мере необходимости. - person Mitch; 12.04.2012
comment
Вы хотите сказать, что плитка не помогает? Я рисую часть тайла с разрешением устройства, которое затем передается на принтер. Я бы рисовал напрямую и позволял драйверу принтера обрабатывать это, но тогда я терял бы возможность делать прозрачность. - person Mitch; 12.04.2012
comment
Я не совсем уверен, что вы делаете, но основная концепция заключается в том, что каждый фрагмент этого изображения, которое вы отправляете на принтер, должен обрабатываться, и обычно он должен делать это как несжатые необработанные данные. Это может быть причиной вашей проблемы с ресурсами ... ресурс на принтере, а не на компьютере ... имеет ли это смысл? - person War; 13.04.2012
comment
На самом деле тайлинг отправляет одинаковый объем данных (DIB), независимо от того, был ли исходное изображение PNG или BMP. На самом деле оба изображения хранятся в библиотеке, которую я использую, в памяти как независимые от устройства растровые изображения (DIB). Поэтому весь этот вопрос не имеет смысла. - person Mitch; 14.04.2012