Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TColor gibt mir keine 256 Farben (https://www.delphipraxis.net/199744-tcolor-gibt-mir-keine-256-farben.html)

hame 16. Feb 2019 09:24

TColor gibt mir keine 256 Farben
 
Hallo,
wollte mal ausprobieren ob es möglich ist mit einer 256 Farben Grafik die entsprechenden Farbindizies der Palette zu ermitteln.
Leider wird bei dem von mir eingeschlagenen Weg nur die Farbe wiedergegeben die der in TColor definierten am nächsten kommt und die Grafik
wird dadurch zerstört.
Weiß jemand Rat?
Delphi-Quellcode:
procedure TForm1.Button22Click(Sender: TObject);
var   hoch, breit,i: Integer;
      red,green,blue: Byte;
                   p: TColor;
Label nextPixel;
begin
  with Form1.Image1.Canvas do begin
    for hoch:=0 to maxY do begin
      for breit:=0 to maxX do begin
        p:=Image1.Canvas.Pixels[breit,hoch];
        red:=GetRValue(p);
        green:=GetGValue(p);
        blue:=GetBValue(p);
        if (red=0) and (green=0) and (blue=0) then goto nextPixel; // schwarz nicht in Palette
        for i:=0 to 255 do begin
          if (red=r[i]) and (green=g[i]) and (blue=b[i]) then Bild[breit,hoch]:=i; // gefunden
        end;
nextPixel:
      end;// for breit
    end; // for hoch
  end; // with
end;

uligerhardt 16. Feb 2019 09:33

AW: TColor gibt mir keine 256 Farben
 
Sogar mehrere Klugscheiß-Ratschläge: 8-)
  • Canvas.Pixels ist langsam. Wenn es scheall sein soll, schau dir mal ScanLine an.
  • Das "goto nextPixel" ist überflüssig. Dreh einfach die if-Bedingung, dann kannst du das if normal verwenden:
    Delphi-Quellcode:
            if (red <> 0) or (green <> 0) or (blue <> 0) then // schwarz nicht in Palette
              for i:=0 to 255 do begin
                if (red=r[i]) and (green=g[i]) and (blue=b[i]) then Bild[breit,hoch]:=i; // gefunden
              end;

Delphi.Narium 16. Feb 2019 10:34

AW: TColor gibt mir keine 256 Farben
 
Delphi-Quellcode:
procedure TForm1.Button22Click(Sender: TObject);
var   hoch, breit,i: Integer;
      red,green,blue: Byte;
                   p: TColor;
begin
  with Form1.Image1.Canvas do begin
    for hoch := 0 to maxY do begin
      for breit := 0 to maxX do begin
        p := Image1.Canvas.Pixels[breit,hoch];
        if p = 0 then Continue; // schwarz nicht in Palette
        red  := GetRValue(p);
        green := GetGValue(p);
        blue := GetBValue(p);
        for i := 0 to 255 do begin
          if (red = r[i]) and (green = g[i]) and (blue = b[i]) then begin
            Bild[breit,hoch] := i; // gefunden
            // aber was bezweckst Du damit? Was passiert in Bild?
          end;
        end;
      end;// for breit
    end; // for hoch
  end; // with
end;
Wenn r[i], g[i] und b[i] einen Paletteneintrag repräsentieren sollten, so werden in Bild nur die Bildpunkte gesetzt, zu denen es einen Paletteneintrag gibt, alle anderen bleiben unverändert. Da Bilder aber schon lange nicht mehr mit Hilfe von Paletten dargestellt werden, dürfte das eher schief gehen. Früher enthielten Paletten 256 Farben für Bilder, die maximal 256 unterschiedliche Farben enthalten konnten. Durch Änderung der Palette änderte sich auch die optische Darstellung des Bildes, ohne dass Änderungen an der zugrundeliegenden Bilddatei erforderlich waren. Die Änderung der Farben erfolgte ausschließlich im Speicher der Grafikkarte.

Wenn man bedenkt, dass rot, grün und blau jeweils einen Wert von 0..255 enthalten können, also jeweils 256 unterschiedliche Werte, so kommt man auf 256 * 256 * 256 unterschiedliche Farben. Hier darauf zu hoffen, dass man bei einer Palette mit 256 Werten eine hohe Trefferquote hat, ist eher mutig.

256 * 256 * 256 = 16777216, davon sind "nur" 256 Werte in der Palette. alle anderen werden in der Prozedur Bild (vermutlich) nicht gesetzt. D. h.: 16776960 Farben werden bei Deiner Routine nicht gefunden. Damit liegt die Wahrscheinlichkeit, "einen Treffer in der Palette zu landen" bei ungefähr 0,00152587890625%, (x% = 256 wenn 16777216 = 100% -> x = 256 * 100 / 16777216 -> x = 25600 / 16777216 -> x = 0,00152587890625) also annähernd 0. Es werden also vermutlich nur sehr wenige Bildpunke farblich dargestellen, im schlimmsten Fall keine, weil zufällig keine der im Bild enthaltenen Farben in der Palette enthalten ist.

hame 17. Feb 2019 10:26

AW: TColor gibt mir keine 256 Farben
 
Hallo und erstmal ein Danke für die Antworten. Im Prinzip war es nur ein Versuch der Machbarkeit, ob es möglich ist aus einer Grafik die einzelnen Farbwerte auszulesen und die Palette wiederherzustellen. Dies ist allerdings ein gedanklicher Fehler meinerseits da es nicht garantiert ist, dass alle 256 Farben auch in der Grafik vorhanden sind.
Die ganze Aktion werde ich also im Ordner "Einfälle / Reinfälle" abheften.

kwhk 17. Feb 2019 15:40

AW: TColor gibt mir keine 256 Farben
 
@hame,
die 256er Bilder besitzen doch die Palette, z.B. Bitmaps mit 256 Farben und auch GIFs mit 256 Farben.
Da nimmt man das Pixel-Byte (0..255) und sucht den Eintrag R_G_B im Paletten-Array, das sich am Anfang der Datei befindet.

http://www.toolsandtips.de/Tutorial/...ap-bmp-DIB.htm
Siehe hier die Farbtabelle bei 256 Farben.

Delphi.Narium 17. Feb 2019 15:56

AW: TColor gibt mir keine 256 Farben
 
Ja schon, aber bei diesen Bildern steht (soweit ich mich erinnere) nicht die Farbe (jeweil rot, grün und blau) für die einzelnen Pixel in der Datei, sondern die Nummer des für den Pixel zu verwendenden Paletteneintrages. Man benötigt also bereits die Palette, um das Bild darstellen zu können, bzw. nimmt man eine andere Palette, so ändert sich das Bild in der Anzeige, nicht jedoch die Pixel in der Datei selbst. Durch Austausch der Palette kann man die Darstellung eines Bildes verändern, ohne jedes Pixel des Bildes ändern zu müssen. Aus den einzelnen Pixeln kann man aber keine Rückschlüsse auf den inhaltlichen Aufbau der Palette ziehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 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