AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem beim DIB erstellen mit Palette
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim DIB erstellen mit Palette

Ein Thema von Muetze1 · begonnen am 1. Jan 2008 · letzter Beitrag vom 2. Jan 2008
Antwort Antwort
Muetze1
(Gast)

n/a Beiträge
 
#1

Problem beim DIB erstellen mit Palette

  Alt 1. Jan 2008, 17:29
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
Miniaturansicht angehängter Grafiken
paldibprob_136.png  
Angehängte Dateien
Dateityp: zip dibpalproblem_846.zip (96,3 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Problem beim DIB erstellen mit Palette

  Alt 1. Jan 2008, 23:49
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...
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: Problem beim DIB erstellen mit Palette

  Alt 2. Jan 2008, 05:24
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.

Zu beachten ist auch die BITMAPINFO und dessen BITMAPINFOHEADER Structur.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 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