AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Anzahl der verschieden Farben eines Bitmap's auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl der verschieden Farben eines Bitmap's auslesen

Ein Thema von ferby · begonnen am 4. Mär 2006 · letzter Beitrag vom 5. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 15:22
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
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#2

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 15:27
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
Markus
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#3

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 15:31
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 15:39
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).
Angehängte Dateien
Dateityp: zip delphi_-_projekt_-_bitmap_colormap_editor_178.zip (24,4 KB, 34x aufgerufen)
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#5

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 15:41
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.
Markus
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 15:44
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.
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#7

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 16:05
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.
Markus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 18:16
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 18:32
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 von markusj:
Standart-Farbtabelle.
Zitat von markusj:
eine Standart-Tabelle
Es ist immernoch ein Standard und keine Art zu stehen!
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#10

Re: Anzahl der verschieden Farben eines Bitmap's auslesen

  Alt 4. Mär 2006, 18:50
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
Markus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:33 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