Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem beim DIB erstellen mit Palette (https://www.delphipraxis.net/105883-problem-beim-dib-erstellen-mit-palette.html)

Muetze1 1. Jan 2008 16:29


Problem beim DIB erstellen mit Palette
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo!

Ich bin dabei ein TGraphic Nachfahren zu programmieren für die Atari (bzw. Digital Research) IMG Bilder. Erstmal ist an dem Code noch nichts optimiert etc, Hauptsache er funktioniert soweit. Das tut er grundsätzlich auch, weil bisher habe ich die dekodierten Daten und Farbpaletten einem TBitmap gesetzt und diesen dann gemalt. Das klappt soweit alles einwandfrei. Nun ist es aber für ein TGraphic Nachkommen dumm, selbst intern ein TBitmap zu nutzen. Also alles umgeschrieben, so dass ich selber den DIB Speicher befülle und selber eine Palette erstelle. Ok, die Palettenerstellung klappt, weil als ich SetDIBColorTable() durch Zuweisung des Palettenhandles ersetzt habe beim Bitmap, ist alles ok. Die Dekodierung und Setzen der DIBits klappt (eigentlich) auch, da das Bild vom Inhalt her richtig dargestellt wird. Nur die Farbpalette stimmt nicht. Diese kann aber wiederrum nicht falsch sein, da sie ja vom TBitmap ordentlich dargestellt wird.

Zu Verdeutlichung mein aktuelles Testprojekt im Anhang. Darin befinden sich folgende Dinge:

- IMGFile.pas (der TGraphic Nachkomme)
- IMGViewer.dpr (das Projekt)
- Mainform.* (das Formular des Projektes)
- Intel.img (2 Farben Bild mit Farbpalette)
- MF144_ha.img (16 Farben Bild mit Farbpalette)

Das Testprojekt hat zZ. eine ComboBox oben rechts wo der Malmodus ausgewählt werden kann:
- WinAPI (der direkte Weg mit der GDI wie es am Ende auch sein sollte)
- FullBitmap (der alte Weg, welcher auch einwandfrei funktioniert)
- TBitmap use (Zwischenschritt wo TBitmap nur noch mißbraucht wird um HBITMAP und HPALETTE zugewiesen zu bekommen)

Nun für alle die so nett sind um mal ein Blick zu riskieren zu den Internas bzw. wo finde ich was:

Palette Erstellung
- BuildPaletteQuads() füllt eine Liste mit TRGBQuads mit der Palette (Anzahl wird durch fPaletteSize bestimmt)
- PaletteNeeded() erstellt das HPALETTE Handle, wenn dieses noch nicht vorhanden (=0) ist und weist es fPaletteHandle zu

Bitmap Erstellung
- HandleNeeded() erstellt das HBITMAP Handle, wenn dieses noch nicht vorhanden (=0) ist und weist es fDataHandle zu
(hier werden die geladenen Bit-Planes zu den DIBits dekodiert und geschrieben)

Zeichnen
- Draw() malt abhängig von DrawMode (siehe ComboBox) das Bild auf den übergebenen Canvas
(hier werden nur beim DrawMode == 1 (FullBitmap) die geladenen Bit-Planes direkt in die ScanLine[] dekodiert, alle andere Modien nutzen das fDataHandle von HandleNeeded())

Nun bin ich mal gespannt wo mein Fehler liegt. Ich bin zZ ratlos.

Gruss,
Muetze1

Muetze1 1. Jan 2008 22:49

Re: Problem beim DIB erstellen mit Palette
 
Nun ja, ich habe den Fehler gefunden. Für alle anderen die mal damit hadern: Die Funktion MSDN-Library durchsuchenCreateDIBSection() hat einen Parameter iUsage welche DIB_PAL_COLORS und DIB_RGB_COLORS enthalten kann. Diese Angabe sagt aber nicht aus (wie man eigentlich vermuten würde), ob man eine Palette mit angibt (DIB_PAL_COLORS) oder keine Palette braucht, da die Pixeldaten die RGB Werte enthält (DIB_RGB_COLORS), sondern in welchem Format die Palette vorliegt. Dabei sagt DIB_PAL_COLORS aus, dass es ein Word pro Eintrag ist und DIB_RGB_COLORS dass es TRGBQuad pro Eintrag ist.

Wenn man einmal eine vom Wort her logische Annahme trifft. Aber nun ja, die WinAPI soll ja nicht jeder kapieren...

turboPASCAL 2. Jan 2008 04:24

Re: Problem beim DIB erstellen mit Palette
 
Zitat:

Zitat von Muetze1
Aber nun ja, die WinAPI soll ja nicht jeder kapieren...

So ist es. Manchmal kann man sich den Kram X-mal durchlesen und weis nur das man
jetzt genau weis das es irgrnd wie gehen soll. :stupid:

Zu beachten ist auch die BITMAPINFO und dessen BITMAPINFOHEADER Structur.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz