![]() |
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: |
Re: Farbcodes
Check mal ColorToRGB ab!
mfg phlux |
Re: Farbcodes
Das hab' ich schon, da ist die Länge aber auch nicht immer gleich lang :cry: .
|
Re: Farbcodes
Dann teste mal folgende Funktionen:
Delphi-Quellcode:
...:cat:...
function HexToColor(St: String): TColor;
begin Result := TColor(StrToInt(St)); end; function ColorToHex(Col: TColor): String; begin Result := '$' + IntToHex(Integer(Col), 8); end; |
Re: Farbcodes
Ich hab's probiert, es dauert aber selbst bei kleinen Bildern zu lange.
Ich glaube es geht einfach nicht... Danke! |
Re: Farbcodes
Wie greifst du den auf die Pixel zu?
|
Re: Farbcodes
und wenn du immer R + G + B nimmst und diese mit führenden Nullen?? dann hast du immer 9stellige ergebnisse
|
Re: Farbcodes
Mein Code sieht so aus:
Delphi-Quellcode:
An der Stelle von !! müsste dann sowas wie ColorToString oder ähnliches stehen.
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; 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] |
Re: Farbcodes
Wie Luckie schon meinte, daß, was lange dauert ist der Zugriff über Pixels. Suche mal nach
![]() ...:cat:... |
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? |
Re: Farbcodes
Zitat:
Zitat:
|
Re: Farbcodes
Ok, habe es auf ScanLine "umgebaut".
Aber wie kann ich jetzt den Farbcode in beispielsweise einem TMemo ausgeben? |
Re: Farbcodes
Wie sieht den dein Code jetzt aus?
|
Re: Farbcodes
So:
Delphi-Quellcode:
Habe das jetzt schon probiert, geht aber immernoch sehr langsam, kann man da garnichts machen?
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; [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
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! |
Re: Farbcodes
hi,
Du hast die Scanlines nicht richtig verwendet. Schau dir mal in diesem Thread ![]() grüße, daniel |
Re: Farbcodes
Ich habe jetzt was schnelles gedunden:
Delphi-Quellcode:
G ist eine Gauge, damit ich weiß, wo er gerade steckt.
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; 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?. |
Re: Farbcodes
Sakura hat in diesem Thread die FUnktion ColorToStr geschrieben, die liefert nie clRed zurück sondern immer den Hexwert der Farbe.
|
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? |
Re: Farbcodes
eigentlich sollte jeder Farbcode 7stellig sein
|
Re: Farbcodes
So sieht mein Code aus:
Delphi-Quellcode:
Eine Zeile von einem 10x10 Pixel Schwarzweißbild:
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; $000000$00FFFFFF$00000000$00FFFFFF$00000000$00FFFF FF$00000000$00FFFFFF$00000000$00FFFFFF00 Habe ich vielleicht einen Fehler bei Insert, ich konnte nicht finden. |
Re: Farbcodes
Ich habe die Insert Methode geändert und jetzt geht alles.
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz