Autor Beitrag
jornbyte
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 22.06.05 22:31 
Moin!

Probier das mal:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden volle Höhe 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:
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
      // 24 Bit Pixelformat
      PixelFormat := pf24bit;

      // Konvertiert das Bild gleichzeitig nach bmp falls es sich zum Beispiel um ein JPEG handeln sollte.
      Width := Image1.Picture.Width;
      Height := Image1.Picture.Height;
      Canvas.Draw(0, 0, Image1.Picture.Graphic);

      // Zeile holen
      for Y := 0 to Height -1 do begin
        pData := ScanLine[Y];

        // Spalte
        for X := 0 to Width -1 do begin
          // In Grau umrechnen
          pData^.rgbtRed   := (pData^.rgbtRed + pData^.rgbtGreen + pData^.rgbtBlue) div 3;
          pData^.rgbtGreen := pData^.rgbtRed;
          pData^.rgbtBlue  := pData^.rgbtRed;

          // Pointer aufs nächste Pixel setzen.
          Inc(pData);
        end;
      end;
    end;

    // Bild wieder dem Image zuweisen
    Image1.Picture.Bitmap.Assign(bmp);
  finally
    // frei geben
    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.

ausblenden 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;

  // Zeile
  for Y := 0 to Height -1 do begin

    // Spalte
    for X := 0 to Width -1 do begin
      // Irgendetwas machen

      // Taste abfragen
      if GetAsyncKeyState(VK_ESCAPE) <> 0 then begin
        Canceled := True;
        BREAK; // innere Schleife abbrehen
      end;
    end;

    // äußere Schleife abbrechen
    if Canceled then
      BREAK;
  end;

  // Bild zum Beispiel wieder dem Image zuweisen, wenn nicht abgebrochen wurde
  if not Canceled then
    // mach was.
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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 23.06.05 09:27 
@ Lossy eX, Narses

Es geht, ich Danke euch. (habe bistimm bald wieder eine Frage)

_________________
mfg jornbyte
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 23.06.05 09:46 
Moin!

user profile iconLossy 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? :wink: Es ist aber verständlicher... (und ausserdem hab ich damit gerechnet, dass einer mit der Scanline-Variante kommt; also, hat doch geklappt! :wink:)

user profile iconLossy eX hat folgendes geschrieben:
Besser wäre es wenn man das Bild mit Scanlines konvertiert. In etwa so.
ausblenden Delphi-Quelltext
1:
2:
// In Grau umrechnen
pData^.rgbtRed   := (pData^.rgbtRed + pData^.rgbtGreen + pData^.rgbtBlue) div 3;

Leider ist der Durchschnitt der Werte aber kein Grauwert. :mahn: Du mußt schon die subjektive Helligkeit heranziehen, und das hat user profile iconjornbyte ja sogar schon selbst richtig gemacht! :wink:

cu
Narses
Darth Sitthiander
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: Fr 17.03.06 19:16 
hallo

ich hab da mal ne frage, und zwar hiermit

ausblenden 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; //Farbton Auswahl
  for x := 0 to image1.Width do //x schleife
    for y := 0 to image1.Height do //y schleife
      begin
        r1 := getrvalue(image1.Canvas.pixels[x,y]); //Rot Anteile aus dem SW Bild
        g1 := getgvalue(image1.Canvas.pixels[x,y]); //Grün Anteile aus dem SW Bild
        b1 := getbvalue(image1.Canvas.pixels[x,y]); //Blau Anteile aus dem SW Bild
        r2 := getrvalue(color); //Rot Anteile der Mischfarbe
        g2 := getgvalue(color); //Grün Anteile der Mischfarbe
        b2 := getbvalue(color); //Blau Anteile der Mischfarbe
        r1 := 255 - r1; //SW R invertieren
        g1 := 255 - g1; //SW G invertieren
        b1 := 255 - b1; //SW B invertieren
        r3 := (r2 * r1); //R mischen
        g3 := (g2 * g1); //G mischen
        b3 := (b2 * b1); //B mischen
        image1.Canvas.pixels[x, y] := RGB(r3, g3, b3); //Farbe zusammenfügen und setzen
      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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Fr 17.03.06 19:23 
user profile iconDarth 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? :gruebel:

Alstar
Darth Sitthiander
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: So 19.03.06 17:55 
jemand eine antwort? Danke schonmal.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 19.03.06 18:00 
user profile iconDarth 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: Do 23.03.06 16:41 
aber bei mir kommt immernoch diese Fehlermeldung:

ausblenden Delphi-Quelltext
1:
[Fehler] ftsg.pas(161): Nicht genügend wirkliche Parameter					


oder

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 24.03.06 09:27 
user profile iconDarth 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95



BeitragVerfasst: Sa 25.03.06 21:16 
Danke, ich versuch mein bestes. Darf ich aber trotzdem fragen falls ich nicht weiterkomme?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.