Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Farbcodes (https://www.delphipraxis.net/10908-farbcodes.html)

F.W. 27. Okt 2003 19:04


Farbcodes
 
Ich habe ein Programm geschrieben, das soll mir ein Bild in "Zahlen" umwandeln :drunken: .

Das Problem: :wall:
Wenn ich mit StringToColor bzw. ColorToString umwandle gibt es mir meistens $00FF0000, also 9stellige Strings zurück, manchmal aber euch nur clblack oder clred.

Gibt es einen Weg, wie ich immer nur diesen 9stelligen Code zurück bekomme? Also auch wenn man eigentlich clblack nehmen könnte?

Danke schonmal! :firejump:

phlux 27. Okt 2003 19:43

Re: Farbcodes
 
Check mal ColorToRGB ab!

mfg phlux

F.W. 28. Okt 2003 09:28

Re: Farbcodes
 
Das hab' ich schon, da ist die Länge aber auch nicht immer gleich lang :cry: .

sakura 28. Okt 2003 09:31

Re: Farbcodes
 
Dann teste mal folgende Funktionen:

Delphi-Quellcode:
function HexToColor(St: String): TColor;
begin
  Result := TColor(StrToInt(St));
end;

function ColorToHex(Col: TColor): String;
begin
  Result := '$' + IntToHex(Integer(Col), 8);
end;
...:cat:...

F.W. 29. Okt 2003 18:25

Re: Farbcodes
 
Ich hab's probiert, es dauert aber selbst bei kleinen Bildern zu lange.

Ich glaube es geht einfach nicht...

Danke!

Luckie 29. Okt 2003 18:27

Re: Farbcodes
 
Wie greifst du den auf die Pixel zu?

SirThornberry 29. Okt 2003 18:30

Re: Farbcodes
 
und wenn du immer R + G + B nimmst und diese mit führenden Nullen?? dann hast du immer 9stellige ergebnisse

F.W. 29. Okt 2003 18:55

Re: Farbcodes
 
Mein Code sieht so aus:
Delphi-Quellcode:
var
 X, Y: Integer;
begin
 for X := 0 to Image1.Width do begin
     for Y := 0 to Image1.Height do begin
         Memo1.Text := Memo1.Text+!!Image1.Canvas.Pixels[X, Y];
     end;
 end;
An der Stelle von !! müsste dann sowas wie ColorToString oder ähnliches stehen.

Ich habe mal gelesen das Canvas sehr langsam ist, gibts noch eine andere Möglichkeit?

Oder:
Wenn ich ein Bild mit einem Hexeditor öffne, steht ja auch was aus Zahlen und Buchstaben drin.
Gibt es eine Komponente die mir sowas ermöglicht?

Danke! Danke! Danke!

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

sakura 29. Okt 2003 18:56

Re: Farbcodes
 
Wie Luckie schon meinte, daß, was lange dauert ist der Zugriff über Pixels. Suche mal nach Hier im Forum suchenScanLine

...:cat:...

F.W. 29. Okt 2003 19:09

Re: Farbcodes
 
Gut, also der Zugriff über Pixels ist zu langsam. Was könnte ich dann benutzen?
Also wie kann ich die Pixel von einem Bild in Buchstaben bzw. Zahlen umwandeln?

Sanchez 29. Okt 2003 19:27

Re: Farbcodes
 
Zitat:

Zitat von F.W.
Gut, also der Zugriff über Pixels ist zu langsam. Was könnte ich dann benutzen?

die Antwort hast du schon bekommen

Zitat:

Zitat von Sakura
Wie Luckie schon meinte, daß, was lange dauert ist der Zugriff über Pixels. Suche mal nach Hier im Forum suchenSCANLINE


F.W. 29. Okt 2003 21:11

Re: Farbcodes
 
Ok, habe es auf ScanLine "umgebaut".

Aber wie kann ich jetzt den Farbcode in beispielsweise einem TMemo ausgeben?

Sanchez 29. Okt 2003 21:17

Re: Farbcodes
 
Wie sieht den dein Code jetzt aus?

F.W. 29. Okt 2003 21:36

Re: Farbcodes
 
So:
Delphi-Quellcode:
var
 X, Y: Integer;
 P: PByteArray;
begin
 PBar1.Max := Image1.Width-1;
 PBar2.Max := Image1.Height-110;
 for Y := 0 to Image1.Height-110 do begin
     PBar2.Position := Y;
     P := Image1.Picture.Bitmap.ScanLine[Y];
     for X := 0 to Image1.Width-1 do begin
         PBar1.Position := X;
         Memo1.Text := Memo1.Text+'W'+IntToStr(P[X]);
     end;
 end;
end;
Habe das jetzt schon probiert, geht aber immernoch sehr langsam, kann man da garnichts machen?

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

F.W. 30. Okt 2003 10:42

Re: Farbcodes
 
Wenn ich das so mache, mit ScanLine, wie kann ich nachher von den höchstens 3-stelligen Zahlen wieder ein farbiges Pixel machen?

Danke, Danke!

Sanchez 30. Okt 2003 10:51

Re: Farbcodes
 
hi,
Du hast die Scanlines nicht richtig verwendet. Schau dir mal in diesem Thread Grayscale meinen Beitrag an. Der zeigt relativ einfach wie man mit Scnalines umgeht.

grüße, daniel

F.W. 30. Okt 2003 11:11

Re: Farbcodes
 
Ich habe jetzt was schnelles gedunden:
Delphi-Quellcode:
 for Y := 0 to Image1.Height-1 do
     ListBox1.Items.Add('');
 G.MaxValue := Image1.Height-1;
 for Y := 0 to Image1.Height-1 do begin
     G.Progress := Y;
     S := '';
     for X := 0 to Image1.Width-1 do begin
         Insert('|'+ColorToString(Image1.Canvas.Pixels[X, Y]), S, Length(S)-1);
     end;
     ListBox1.Items[Y] := S;
 end;
G ist eine Gauge, damit ich weiß, wo er gerade steckt.
Das ganze hat einen großen Nachteil: ich kann damit nur BITMAPS "konvertieren".

Wie könnte ich es am geschicktesten anstellen, auch JPGS rein zu bringen.

Danke Sanchez, aber das mit ScanLine ist ganzschön schwierig, wobei ich ja Anfänger bin und mich mit Arrays noch nicht richtig beschäftigt habe, und mit Byytes und Pointern erst recht nicht!

Eine Frage noch:
Wie kann ich das ganze schnell und zuverlässig wieder umwandeln, denn sobald mal ein richtiges rot dabei ist, würde es ja clred heißen, und schon wäre es micht mehr genau 9 bzw. mit Trenner 10 Zeichen lang?.

Sanchez 30. Okt 2003 11:31

Re: Farbcodes
 
Sakura hat in diesem Thread die FUnktion ColorToStr geschrieben, die liefert nie clRed zurück sondern immer den Hexwert der Farbe.

F.W. 31. Okt 2003 15:35

Re: Farbcodes
 
Sie gibt nicht immer die selbe Länge zurück, ich habe mal ein Bild konvertiert, geht übrigens schnell, also danke erstmal!
Aber:
Der erste Farbcode ist immer 7 Zeichen lang (z.B. $0000FF), dann folgen 9stellige Zahlen(z.B. $00FF0000).
Ob in der Zeile dann nochmal ein 7 Zeichen langer Farbcode enthalten ist, habe ich jetzt nicht geprüft.

Wieso ist aber in jeder Zeile der erste Farbcode nnur 7stellig?

Sanchez 2. Nov 2003 13:48

Re: Farbcodes
 
eigentlich sollte jeder Farbcode 7stellig sein

F.W. 2. Nov 2003 16:04

Re: Farbcodes
 
So sieht mein Code aus:
Delphi-Quellcode:
var
 X, Y: Integer;
 S: String;
begin
 for Y := 0 to Image1.Height-1 do
     ListBox1.Items.Add('');
 G.MaxValue := Image1.Height-1;
 for Y := 0 to Image1.Height-1 do begin
     G.Progress := Y;
     S := '';
     for X := 0 to Image1.Width-1 do begin
         Insert(ColorToHex(Image1.Canvas.Pixels[X, Y]), S, Length(S)-1);
     end;
     ListBox1.Items[Y] := S;
 end;
end;
Eine Zeile von einem 10x10 Pixel Schwarzweißbild:
$000000$00FFFFFF$00000000$00FFFFFF$00000000$00FFFF FF$00000000$00FFFFFF$00000000$00FFFFFF00
Habe ich vielleicht einen Fehler bei Insert, ich konnte nicht finden.

F.W. 6. Nov 2003 15:12

Re: Farbcodes
 
Ich habe die Insert Methode geändert und jetzt geht alles.

Danke!


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