Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Transparente GIFs anzeigen?

1 view
Skip to first unread message

Alexander Clauss

unread,
Aug 24, 1998, 3:00:00 AM8/24/98
to
Ich möchte in einem Fenster eine Reihe von Bildern anzeigen, darunter
auch einige transparente GIFs (oder auch andere Bildformate, die
transparente
Bereiche erlauben). Das Ganze darf auch nur mit QuickTime 3 funktionieren.

Nun ist es absolut kein Problem, diese Bilder anzuzeigen. Dummerweise
scheint aber jede Methode, die ich versucht habe, große Nachteile zu
haben.

Meine erste Lösung:
Ich verwende GetGraphicsImporterForFile() um ein Bild zu "laden"
und GraphicsImportDraw() immer dann, wenn es gezeichnet werden muß
(z.B. bei einem Redraw-Event). Sobald das Fenster geschlossen wird,
gebe ich alle Bilder wieder frei (CloseComponent()). Dies funktioniert -
auch mit transparenten GIFs.

Das große Problem:
Für jedes Bild muß ich einmal GetGraphicsImporterForFile() aufrufen,
und QuickTime reserviert dann jedesmal einen Speicherblock von 32K im
Programmheap. Zum Zeichnen (GraphicsImportDraw()) wird dann auch
für jedes Bild ein weiterer Speicherblock (ebenfalls 32K, wird erst beim
Schließen (CloseComponent()) wieder freigegeben) angelegt. Das
bedeutet, für jedes Bild werden 64K verbraucht, selbst wenn die Pixmap
des Bildes nur 1-2K benötigen würde.

Der Speicherverbrauch ist mir viel zu hoch, insbesondere wenn u.U. nur
10 kleine Icons dargestellt werden sollen (dann würden 640K verbraucht,
obwohl die Pixmaps zusammen nur max. 5-10K benötigen würden).


Meine zweite Lösung:
Wie oben verwende ich GetGraphicsImporterForFile() um das Bild zu
"öffnen",
kopiere es aber sofort mit Hilfe von GraphicsImportGetAsPicture() in ein
"PicHandle". Dann kann ich sofort CloseComponent() aufrufen. Die 32K (bzw.

64K) Speicherverbrauch pro Bild treten dann nicht dauerhaft, sondern nur
beim Laden auf. Zeichen kann ich das Bild dann mit DrawPicture(). Auch
diese Lösung funktioniert gut mit transparenten GIFs. Und sie dürfte
wohl auch so ziemlich die speicherplatzsparenste Lösung sein.

Das Problem ist aber, daß die Bilddaten im PicHandle in komprimierter
Form verwaltet werden. Das bedeutet, bei jedem Zeichenen müssen sie
zunächst dekomprimiert werden, was bei größeren und/oder vielen Bildern
doch erheblich Zeit kostet. Selbst ein G3 konnte einige meiner Testfälle
nicht flüssig darstellen.


Meine dritte Lösung:
Wie oben verwende ich GetGraphicsImporterForFile() um das Bild zu
"öffnen",
zeichne es jetzt aber in eine Offscreen-GWorld. Da die Bilddaten hier
schon
komplett aufbereitet in der GWorld liegen, ist die Ausgabe sehr schnell.
Der
Speicherverbrauch ist akzeptabel, auch wenn die
GWorld-Verwaltungsstrukturen
scheinbar nicht gerade wenig Overhead haben (im CW-Zoneranger sieht man,
wie sehr viele kleine Handles angefordert werden. Soviele, daß nach
einigen
Bildern der Zoneranger wohl die Nase voll hat und überhaupt nichts mehr
anzeigt ;-( ).

Das Problem hier ist die Transparenz. Wenn ich eine GWorld über CopyBits()
in ein Fenster zeichne, dann wird im "transparent"-Modus die
Hintergrundfarbe
als transparente Farbe verwendet. D.h. alle Pixel mit dieser Farbe werden
nicht gezeichnet. Bevor ich also das GIF (oder jedes andere Bildformat,
welches transparente Bereiche hat) in die GWorld kopiere, müsste ich erst
mal
ermitteln, welche Farbe ich denn als transparente Farbe (und damit als
Hintergundfarbe in der GWorld) verwenden darf. Verwende ich zufällig eine,
die auch im Bild vorkommt, dann werden zusätzliche Bereiche transparent,
die
es gar nicht werden dürfen.


Hat irgend jemand eine Idee, wie man diese Probleme löst? Es darf nicht
zuviel Speicher kosten (1. Lösung fällt aus), es darf nicht zu langsam
sein
(2. Lösung fällt aus), die Transparenz muß aber auch korrekt funktionieren
(3. Lösung fällt aus).

Kann man irgendwie ermitteln, welche Farbe in einem Bild nicht vorkommt,
so daß man sie als Hintergrundfarbe für die GWorld verwenden kann?


Viele Grüße
Alexander

0 new messages