| Autor |
Beitrag |
jornbyte
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 22.06.05 22:06
Hallo Leute
Ich habe eine Farbgrafik in der Image 1 zu liegen und will diese in Graustufen umwandeln.
Danach soll das Bild wieder in der Image1 liegen, natürlich in den Graustufen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Color:=ColorToRGB(Image1.Picture.Bitmap[x,y]); R := GetRValue(Color); G := GetGValue(Color); B1 := GetBValue(Color); Gr:= Trunc(B*0.11+G*0.59+R*0.3); Image1.Picture.Pictur[x,y] := RGB(Gr, Gr, Gr); |
Mit Color:=ColorToRGB(Image1.Picture.Bitmap[x,y]); geht es nicht, wer kann mir sagen wie es geht.
Ich möchte auch gleich noch eine 2. Frage stellen: In meinem Proggi habe ich auch eine Schleife die mit Berechnungen und Schreiben beschäftigt ist. Diese Schleife soll, wenn möglich, mit der ESC-Taste abgebrochen werden. Das habe ich schon rausgefunden:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.key(Sender: TObject; var Key: Char); begin MessageDlg(Key + ' has been pressed', mtInformation, [mbOK], 0) end; |
Wie frage ich die ESC-Taste in einer Schleife ab und springe aus einer Schleife raus?
Danke für's Lesen und Antworten.
_________________ mfg jornbyte
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.06.05 22:31
Moin!
Probier das mal:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var i,j: Integer; Color: TColor; begin for i := 0 to Image1.Picture.Bitmap.Width do for j := 0 to Image1.Picture.Bitmap.Height do begin Color := Image1.Picture.Bitmap.Canvas.Pixels[i,j]; Color := Trunc(GetBValue(Color)*0.11+GetGValue(Color)*0.59+GetRValue(Color)*0.3); Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Color,Color,Color); end; end; |
cu
Narses
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 23.06.05 08:54
1. Ahhhh! Doch bitte nicht mit Pixels! Narsens verstehe mich bitte nicht falsch aber das ist ziemlich die langsamste Methode das zu lösen die ich kenne.
Besser wäre es wenn man das Bild mit Scanlines konvertiert. In etwa so.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure TForm1.Button1Click(Sender: TObject); var X, Y: Integer; pData: PRGBTriple; bmp: TBitmap; begin bmp := TBitmap.Create; try with bmp do begin PixelFormat := pf24bit;
Width := Image1.Picture.Width; Height := Image1.Picture.Height; Canvas.Draw(0, 0, Image1.Picture.Graphic);
for Y := 0 to Height -1 do begin pData := ScanLine[Y];
for X := 0 to Width -1 do begin pData^.rgbtRed := (pData^.rgbtRed + pData^.rgbtGreen + pData^.rgbtBlue) div 3; pData^.rgbtGreen := pData^.rgbtRed; pData^.rgbtBlue := pData^.rgbtRed;
Inc(pData); end; end; end;
Image1.Picture.Bitmap.Assign(bmp); finally bmp.Free; end; end; |
2. Mit dieser Methode müsstest du das nicht mehr abbrechbar gestalten, da man für ein 1280x1024 Pixel großes Bild gerade mal einen Bruchteil einer Sekunde benötigen würde. Aber für den Fall, dass du es wo anders gebrauchen könntest. Mit dem Event wirst du aber nichts anfangen können, denn sobald du zum Beispiel in einer Methoden wie Button1Click steckst kann das Tastaturevent noch nicht abgearbeitet werden. Du würdest also erst mitbekommen, dass etwas passiert wäre wenn alles zu spät ist. Hier ein kleines Beispiel wie man das machen könnte.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TForm1.Button1Click(Sender: TObject); var X, Y: Integer; Canceled : boolean; begin Canceled := False;
for Y := 0 to Height -1 do begin
for X := 0 to Width -1 do begin if GetAsyncKeyState(VK_ESCAPE) <> 0 then begin Canceled := True; BREAK; end; end;
if Canceled then BREAK; end;
if not Canceled then end; |
Das ist noch mal der Code von Oben allerdings nur auf das Nötigste reduziert. Evtl kann die ständige Abfrage der Taste auch zu einer gehörigen Verlangsamung führen. Von daher würde es wahrscheinlich auch ausreichen wenn man lediglich in der äußeren Schleife überprüft ob eine Taste gedrückt wurde. So könnte er zu Beispiel noch eine volle Zeile abarbeiten und erst dann mit der Arbeit aufhören.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
jornbyte 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 23.06.05 09:27
@ Lossy eX, Narses
Es geht, ich Danke euch. (habe bistimm bald wieder eine Frage)
_________________ mfg jornbyte
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 23.06.05 09:46
Moin!
Lossy eX hat folgendes geschrieben: | | 1. Ahhhh! Doch bitte nicht mit Pixels! Narsens verstehe mich bitte nicht falsch aber das ist ziemlich die langsamste Methode das zu lösen die ich kenne. |
Hab ich gesagt, dass das schnell ist?  Es ist aber verständlicher... (und ausserdem hab ich damit gerechnet, dass einer mit der Scanline-Variante kommt; also, hat doch geklappt!  )
Lossy eX hat folgendes geschrieben: | Besser wäre es wenn man das Bild mit Scanlines konvertiert. In etwa so.
Delphi-Quelltext 1: 2:
| pData^.rgbtRed := (pData^.rgbtRed + pData^.rgbtGreen + pData^.rgbtBlue) div 3; | |
Leider ist der Durchschnitt der Werte aber kein Grauwert.  Du mußt schon die subjektive Helligkeit heranziehen, und das hat jornbyte ja sogar schon selbst richtig gemacht!
cu
Narses
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Fr 17.03.06 19:16
hallo
ich hab da mal ne frage, und zwar hiermit
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.Button1Click(Sender: TObject); var x, y: integer; r1, g1, b1, r2, g2, b2, r3, g3, b3: integer; color: Tcolor; begin color := clblue; for x := 0 to image1.Width do for y := 0 to image1.Height do begin r1 := getrvalue(image1.Canvas.pixels[x,y]); g1 := getgvalue(image1.Canvas.pixels[x,y]); b1 := getbvalue(image1.Canvas.pixels[x,y]); r2 := getrvalue(color); g2 := getgvalue(color); b2 := getbvalue(color); r1 := 255 - r1; g1 := 255 - g1; b1 := 255 - b1; r3 := (r2 * r1); g3 := (g2 * g1); b3 := (b2 * b1); image1.Canvas.pixels[x, y] := RGB(r3, g3, b3); end; end; |
Wie kann ich es machen, dass das bild dann wieder farbig wird, wenn man auf nen zweiten button klickt? Danke schonmal.
Zuletzt bearbeitet von Darth Sitthiander am Fr 17.03.06 19:36, insgesamt 1-mal bearbeitet
|
|
Alstar
      
Beiträge: 827
|
Verfasst: Fr 17.03.06 19:23
Darth Sitthiander hat folgendes geschrieben: | hallo
ich hab da mal ne frage, und zwar hiermit
[...]
Wie kann ich es machen, dass das bild dann wieder farbig wird, wenn man auf nen zweiten button klickt? Danke schonmal. |
Ich hab auch mal ne Frage: Was hat das in diesem Thread zu suchen?
Alstar
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Fr 17.03.06 19:29
Nun ja hier wird doch darüber diskutiert wie man ein image in graustufen anzeigen kann oder? Und ich möchte gerne wissen wie man das danach mit einem button wieder rückgängig macht.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: So 19.03.06 17:55
jemand eine antwort? Danke schonmal.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 19.03.06 18:00
Darth Sitthiander hat folgendes geschrieben: | | Nun ja hier wird doch darüber diskutiert wie man ein image in graustufen anzeigen kann oder? Und ich möchte gerne wissen wie man das danach mit einem button wieder rückgängig macht. |
Das geht nicht (ohne Zusatzinformationen). Woher soll man bitteschon entscheiden können, ob das schöne hellgrau in Wahrgheit ein Himmelblau oder ein Feuerrot ist?
_________________ We are, we were and will not be.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: So 19.03.06 18:11
Nun ja wenn man doch gerade ein bild in graustufen unterteilt hat, kann man doch die sättigung hochschrauben und schon is wieder alles fast so wies war. So mach ich das bei adobe photoshop. Sonst könnt man ja bei den graustufen um einen bestimmten wert die Sättigung verringern, und beim andern bild um diesen wert wieder erhöhen
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 21.03.06 14:50
Ne. Das geht nicht. Was weg ist ist weg. Wenn du ein Bild in Graustufen umwandelst, dann ist sowohl Rot, Grün und Blau jeweils auf dem gleichen Wert. Die Sättigung kann nur dann funktionieren, wenn dort aber ein Unterschied exisiert. So lange noch ein bisschen Rest da ist könnte man das machen. Auch wenn die Qualität mangels ginringster Datenauflösung wohl nicht so besonders wäre. Je schlechter die Eingangsqualität wäre um so größer wären die sichtbaren Farbabstufungen. Aber bei einem reinen Grau kannst du nichts machen außer zu raten was es gewesen sein könnte. Und ob das so sinnvoll ist lasse ich mal im Raum stehen.
Um also dein in Grau gewandeltes Bild wieder zurück zuverwandeln wäre es besser das Original wieder rauszukramen oder daher zu holen wo du es her hast. Bzw. vorher zu sichern und nur eine Kopie in Grau zu verwandeln.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Di 21.03.06 16:44
Ok, da ist wohl nix zu machen. Und bringen tuts mir auch nix. Aber weisst du wie man die sättigung erhöht, oder soll ich dazu einen neuen thread aufmachen?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 22.03.06 10:08
Ja eigentlich wäre dafür wohl einer neue Thread fällig gewesen. Aber das wäre eigentlich auch schon bei deiner ersten Frage der Fall gewesen. Von daher ist es eh schon in doppelter Hinsicht zu spät.
Um die Sättigung anzupassen musst du deine RGB Werte erst einmal in HSV umwanden. Und dann kannst du sowohl die Farbe (H), die Sättigung (S) als auch die Helligkeit (V) anpassen. Folgendes Post sollte dir dabei vollkommen genügen.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Mi 22.03.06 18:35
Wie funktionier der Aufruf genau? ich habe ihn so und er funktioniert nicht:
RGBtoHSV(255, 255, 255);
Was mache ich falsch? Und was muss ich danach machen wenn ich anhand einer Trackbar die Sättigung erhöhen und senken will? Danke schonmal.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 23.03.06 13:18
Du benotigst noch 3 Intervariablen in denen das zerlegte RGB abgespeichert werden kann. Bzw zum Verständniss HSV ist ein anderer Farbraum in dem die Farbe in Hue (Regenbogen) angegeben ist. Und dann halt Sättigung und Helligeit. Wenn du Sättigung dann auf 0 oder 100 setzt und dann mit der anderen Funktion dieses wieder in RGB umwandelst und auf das Pixel im Bild zuweist kannst du so die Sättigung des Bildes beeinflussen. Da würde ich aber vorschlagen, dass du die Sättigung Prozentual beinflusst. Also nicht bei jedem Pixel die Sättigung + 10 Werte sondern 10 Prozent drauf oder runter. Musste aber mal schaun.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Do 23.03.06 16:41
aber bei mir kommt immernoch diese Fehlermeldung:
Delphi-Quelltext 1:
| [Fehler] ftsg.pas(161): Nicht genügend wirkliche Parameter |
oder
Delphi-Quelltext 1:
| [Fehler] ftsg.pas(161): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen |
Was muss denn da noch rein? ich verstehe das nicht. Könnte es vielleicht sein das ich keine intervariablen benutze? Überhaupt, was sind intervariablen? Danke schonmal.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Fr 24.03.06 09:27
Darth Sitthiander hat folgendes geschrieben: | | Was muss denn da noch rein? ich verstehe das nicht. Könnte es vielleicht sein das ich keine intervariablen benutze? Überhaupt, was sind intervariablen? |
Verstehe das jetzt bitte nicht falsch. Aber zum Geier hast du überhaupt in der Grafikprogrammierung zu suchen? Das woran du jetzt scheiterst sind unterste Grundlagen. Und mit denen solltest du dich erst einmal auseinader setzen. Dsdt bietet dazu viele Tutorials. Und es wäre nett du uns und dir einen gefallen tun könntest und erst einmal die Grundlagen lernen. Um es auch noch mal anders auszudrücken. Du versuchst gerade zu fliegen und kannst noch nicht mal krabbeln. Das geht so nicht!
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Sa 25.03.06 21:16
Danke, ich versuch mein bestes. Darf ich aber trotzdem fragen falls ich nicht weiterkomme?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 27.03.06 08:30
Ja klar dafür ist das ja hier ein Forum. Wenn dann aber bitte in der zugehörigen Sparte. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|