AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia TColor gibt mir keine 256 Farben
Thema durchsuchen
Ansicht
Themen-Optionen

TColor gibt mir keine 256 Farben

Ein Thema von hame · begonnen am 16. Feb 2019 · letzter Beitrag vom 17. Feb 2019
Antwort Antwort
hame

Registriert seit: 8. Jul 2005
Ort: 85521 Ottobrunn
4 Beiträge
 
Delphi 7 Professional
 
#1

TColor gibt mir keine 256 Farben

  Alt 16. Feb 2019, 10:24
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;
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

AW: TColor gibt mir keine 256 Farben

  Alt 16. Feb 2019, 10:33
Sogar mehrere Klugscheiß-Ratschläge:
  • 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;
Uli Gerhardt
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#3

AW: TColor gibt mir keine 256 Farben

  Alt 16. Feb 2019, 11:34
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.
  Mit Zitat antworten Zitat
hame

Registriert seit: 8. Jul 2005
Ort: 85521 Ottobrunn
4 Beiträge
 
Delphi 7 Professional
 
#4

AW: TColor gibt mir keine 256 Farben

  Alt 17. Feb 2019, 11:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von kwhk
kwhk

Registriert seit: 25. Mär 2009
Ort: Dresden
168 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TColor gibt mir keine 256 Farben

  Alt 17. Feb 2019, 16:40
@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.
Hartmut

Geändert von kwhk (17. Feb 2019 um 16:45 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#6

AW: TColor gibt mir keine 256 Farben

  Alt 17. Feb 2019, 16:56
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.
  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 20:29 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