2012-04-05 24 views
8

Napisałem program do mapowania w Delphi, w którym użytkownik może załadować obraz rastrowy w tle, który przechowuję w pamięci. W jednym przypadku użytkownik załadował z powodzeniem 44 MB BMP, ale program był powolny, a po wydrukowaniu (wydrukowałem dane wyjściowe) wystąpił błąd braku zasobów. Przekształciłem BMP na PNG (3 MB), a program działa znacznie lepiej i zadanie drukowania powiodło się.Efektywność korzystania z plików PNG i BMP z dużymi plikami

Ponieważ PNG musi zostać rozszerzony do formatu DIB o tym samym rozmiarze, dlaczego istnieje różnica w wydajności/zasobach? Jeśli cokolwiek, powinno to zająć więcej zadań i alokacji pamięci, aby załadować PNG. czego mi brakuje?

Ponieważ wydaje się, że nie ma żadnych oczywistych odpowiedzi, napiszę mały projekt demonstracyjny, abym mógł to zbadać dalej.

+3

Czy jesteś pozytywny pliki BMP i PNG mają taką samą liczbę pikseli i BitsPerPixel? –

+0

Co używasz do drukowania obrazu? Czy piszesz bezpośrednio na Printer.Canvas, czy używasz komponentu w raporcie takim jak QuickReport lub Rave? – rkawano

+0

Francois: Tak, mam plik klientów i wypróbowałem go sam. rkawano: Drukuję na płytkach DIB, które wysyłam na płótno drukarki. – Mitch

Odpowiedz

1

Różnica polega na kompresji.

BMP = dane surowe jak jest PNG = SAME surowych danych przy użyciu „bezstratny” Compression

Ma to oszczędność ponad 1 sposób w środowiskach programistycznych ...

  1. załadowaniu rezultaty na zdjęciach w ładowaniu mniej surowych danych do pamięci RAM.
  2. Przetwarzasz mniej surowych danych, więc potrzebujesz mniej zasobów.

Okładziny oznacza dla ciebie problemem jest wykładniczy na przykład ...

44MB x 10 szt = 440MB

vs

3MB x 10 płytek = 30MB

Drukarki don lubią przekazywać ogromne porcje danych, a wszystkie droższe drukarki lubią drukować i cały dokument za jednym razem (np. buforuj cały strumień).

Tak więc z twojej aplikacji użytkownik mówi "Drukuj" ... twój kod mówi "mam zamiar wysłać 10 kopii tego" i drukarka rozpoczyna "buforowanie" 440 MB surowych danych.

Większość popularnych drukarek domowych polega na tym, że komputer wykonuje buforowanie i drukuje to, co jest podane, ale standardowa drukarka biurowa wykona buforowanie, a następnie wydrukuje dokument.

Jednak ... myślę, że jest to opcjonalna rzecz, którą można poprawić (myślę, że to zależy od drukarki do drukarki).

EDIT:

herezje coś ze świata programowania gier:

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

+0

Podczas śledzenia kodu plik PNG jest rozszerzany do formatu DIB o rozmiarze równym rozmiarowi BMP w pamięci.Przypuszczam, że bardziej wydajny kod pamięci wykonałby konwersję w razie potrzeby. – Mitch

+0

Czy mówisz, że kafelkowanie nie pomaga? Rysuję część płytki, w rozdzielczości urządzenia, która jest następnie przekazywana do drukarki. Rysowałbym bezpośrednio i pozwoliłbym sterownikowi drukarki poradzić sobie z tym, ale wtedy straciłbym możliwość wykonywania przezroczystości. – Mitch

+0

Nie jestem do końca pewien, co robisz, ale podstawową koncepcją jest to, że każdy fragment tego obrazu, który wysyłasz do drukarki, musi on przetwarzać i musi to robić jako nieskompresowane dane "surowe" zwykle. To może być przyczyną problemu z zasobami ... Zasoby na drukarce nie na komputerze ... Czy to ma sens? – War

Powiązane problemy