Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Anzahl der verschieden Farben eines Bitmap's auslesen (https://www.delphipraxis.net/64509-anzahl-der-verschieden-farben-eines-bitmaps-auslesen.html)

ferby 4. Mär 2006 14:22


Anzahl der verschieden Farben eines Bitmap's auslesen
 
Hallo,

Ich will die Anzahl der verschiedenen verwendeten Farben eines 256-Farben Bitmaps auslesen.
Das heißt wenn ein Bitmap nur aus weiß, gelb und rot besteht soll die funktion z.B: 3 zurückgeben.

Ich habe auch schon eine Funktion geschrieben, aber manchmal gibt sie was falsches zurück,
meistens eine farbe zuviel oder zu wenig...

Delphi-Quellcode:
[..]
farbspeicher: array [1..256] of integer;
BMP: TBitmap;
[..]

function tform1.farbanzahlabfrage:integer;
var
  i,i2: Cardinal;
  farbe_aktuel,i3: TColor;
  neuefarbe: boolean;
begin
  for i:=1 to 256 do farbspeicher[i]:=-1;

  result:=0;

  for i:=0 to BMP.Height-1 do
  for i2:=0 to BMP.Width-1 do
  begin
    neuefarbe:=true;
    farbe_aktuel:=BMP.canvas.pixels[i,i2];
    for i3:=0 to result do
    if farbspeicher[i3+1]=farbe_aktuel then neuefarbe:=false;

    if neuefarbe then
    begin
      farbspeicher[result]:=farbe_aktuel;
      inc(result);
    end;

  end;

end;
kann mir jemand sagen warum diese Funktion nicht immer geht, bzw eine andere Methode um herauszufinden wieviele verschiedene Farben in einen Bitmap sind???

Ferby

markusj 4. Mär 2006 14:27

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Also, bei 256-Farben-Bitmaps gibt es im Header eine Farbtabelle, die du einfach Auslesen kannst, sie enthält (Überraschung!) 256 Einträge, du musst also nur durchzählen, welche nicht 00 00 00 oder FF FF FF sind.

Schau mal unter http://www.daubnet.com/formats/BMP.html , dort findest du eine Beschreibung des BMP-Fileformats

In den Bytes 28 und 29 ist die Farbanzahl gespeichert, wenn dieser Wert 8 ist, hast du ein 256 Farb-Bitmap und findest die Tabelle im Bereich von Byte 54 bis Byte 1077, jeweils in der Farbwertreihenfolge: B G R

mfG

Markus

ferby 4. Mär 2006 14:31

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Hallo,

da gibt es schon 2 Problemme dabei

1) Was ist wenn die Farbe Schwarz oder Weiß verwendet wird bzw nicht verwendet wird?
Wenn z.B: eine Grafik nur aus weiß, gelb und rot besteht dann weiß ich nicht ober der nächste Eintrag in der Farbtabelle wenn er 00 00 00 ist ein default Wert ist oder die Farbe schwarz wirklich verwendet wird...., verstehst du was ich mein?
2) Ich habe keine ahnung wie ich diese Tabelle auslesen kann.

Muetze1 4. Mär 2006 14:39

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eigentlich wollte ich ihn nicht mehr weitergeben und hatte ihn deshalb auch von der Homepage runtergenommen, aber man muss zu seinem schlechten Code stehen den man(n) mal verbrochen hatte.

Im Anhang findest du den Bitmap Colormap Editor - er ist mein damaliges IHK Prüfung Abschlussprojekt gewesen. Er hat mit der ColorHistory sowas wie du es suchst - nur zählt er wie oft eine Farbe verwendet wird gleich mit (sprich: Wie viele Pixel mit der Farbe).

markusj 4. Mär 2006 14:41

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Ganz einfach: Die Farben sind der in der Tabelle nach ihrer Verwendungshäufigkeit sortiert.
Was beduetet, dass wenn du am Ende auf 2* 00 00 00 stößt, kannst du dir sicher sein, dass die Farben ab hier nicht mehr verwendet werden.
2. Hast du schon einmal mit Streams gearbeitet? Such mal danach, mit denen geht es ziemlich einfach.

So, ich habe gerade festgestellt, das teilweise eine Standard-Tabelle gespeichert wird, dann gibt es noch eine andere herangehensweise:
1. Entweder du lädst dein Bitmap in ein TBitamp, damit kenne ich mich aber nicht aus, dort kannst du jeden einzelnen Pixel durchscannen und seine Farbwerte speichern ... einfach ein Array von 0 - 255 für deine Farbtabelle anlegen ...
2. Oder du machst die Hardcore-Variante und analysierst den Datenanteil des Bitmaps durch.
Was bedeutet, dass du dir eine Rohdatenzugriff auf das Bitmap verschaffst, mittels Stream.
Dann Scannst du jede Zeile und seetzt in deinem Array 0-255 of boolean true wenn dieser Eintrag verwendet wird.
Schließlich liest du diese Farbwerte aus der Farbtabelle aus, fertig.

mfG

Markus

EDIT: ein Tipp: Beim BMP-Format ließt man die Zeilen von links nach rechts und von UNTEN NACH oben. Wenn die Anzahl der Bytes in einer Zeile nicht durch 4 teilbar ist, wird mit 00 Werten aufgefüllt.
Die Bildbreite kannst du aus dem Header lesen, sie ist von Position 18-21 zu lesen und als longword zu interpretieren.

Muetze1 4. Mär 2006 14:44

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Zitat:

Zitat von markusj
Ganz einfach: Die Farben sind der in der Tabelle nach ihrer Verwendungshäufigkeit sortiert.
Was beduetet, dass wenn du am Ende auf 2* 00 00 00 stößt, kannst du dir sicher sein, dass die Farben ab hier nicht mehr verwendet werden.

Völliger Blödsinn - war noch nie so, ist nicht so und stand und steht bisher noch nirgendwo in einer Unterlage zu dem Bitmap Format. Die Farbtabelle bei Windows Bitmaps beinhaltet sogar meistens in den ersten 16 Farben die 16 Farben-Standardpalette. Diese Sortierung der Tabelle ist totaler Unfug.

markusj 4. Mär 2006 15:05

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Einspruch: Zitat von Daubnet.com "colors should be ordered by importance"
Allerdings gibt es scheinbar verschiedene Technicken des Abspeicherns: die einen optimieren die Farbtabelle, die anderen tun's nicht, und wiederum andere verwenden einfach die Standard-Farbtabelle.
Vielleicht liegt es auch an den verwendeten Farben, ob eine Standard-Tabelle verwendet wird, oder ob eine eigene angelegt und gespeichert wird.

mfG

Markus

PS: das mit dem 2* 00 00 00 war nur eine nicht getestete Idee, als ich mir ein 256-Farben-Bitmap im Hexeditor angeguckt hab, ist mir auch aufgefallen, dass das nicht gehen kann.

SirThornberry 4. Mär 2006 17:16

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
ich glaub ich hab den Fehler im Ursprungsquelltext:
Delphi-Quellcode:
result := 0;
[...]
for i3:=0 to result do
  if farbspeicher[i3+1]=farbe_aktuel then neuefarbe:=false;
wenn result noch 0 ist gehst du trotzdem deinen Farbspeicher von 0 bis 0 durch und schaust ob da die aktuelle Farbe drin ist. Das ist aber logicher weise falsch. Entweder du fängst i3 mit 1 an (würde ich bevorzugen) oder du ziehst von result 1 ab
Delphi-Quellcode:
result := 0;
[...]
for i3:=1 to result do
  if farbspeicher[i3]=farbe_aktuel then
    neuefarbe:=false;

Muetze1 4. Mär 2006 17:32

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Zitat:

Zitat von markusj
Einspruch: Zitat von Daubnet.com "colors should be ordered by importance"

Ok, dann übersetzen wir mal richtig:

1. should be - eine Empfehlung, keine Zwang - kenne bisher auch keinen der das macht.
2. importance - bedeutet hier nicht die Häufigkeit der Verwendung sondern der Farbgewichtung. Mit anderen Worten der Farbton ist dabei das Kriterium und nicht die Anzahl der damit eingefärbten Pixel bzw. wie oft der Farbindex benutzt wird.

Zitat:

Zitat von markusj
Standart-Farbtabelle.

Zitat:

Zitat von markusj
eine Standart-Tabelle

Es ist immernoch ein Standard und keine Art zu stehen!

markusj 4. Mär 2006 17:50

Re: Anzahl der verschieden Farben eines Bitmap's auslesen
 
Ok, ich ergebe mich ... Asche über mein Haupt *g*
Und das mit der Farbgewichtung wusst ich nicht ... bitte vergib mir ^^

Ach ja, wegen meiner Rechtschreibung ... tut mir Leid.

mfG

Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.
Seite 1 von 2  1 2      

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