Autor Beitrag
en!gma
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Do 19.05.05 15:06 
hi.
wollte mal fragen ob es möglich ist, von einem bmp oder einem jpg den farbton zu ändern?

also ich möchte, dass alles das, was weiss ist, seine farbe ändert, zu einem farbton, den ich selbst angeben kann.
schwarz soll halt immer schwarz bleiben.
hmm hier mal ein kleines bild, villeicht ist es dann einfacher zu verstehen.
user defined image

mfg

enigma
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Do 19.05.05 15:08 
Mit Zwischentönen oder nur die eine Farbe? Suche in: Delphi-Forum, Delphi-Library SCANLINE: auslesen und bei Bedarf einfach ersetzen

AXMD
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Do 19.05.05 15:10 
also es ist jetzt nur in meinem beispiel schwarz/weiss.
ich dachte eher an alle schwarz/weiss töne.
und halt nur ganz schwarz soll sich nicht ändern.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Do 19.05.05 15:13 
user profile iconen!gma hat folgendes geschrieben:
also es ist jetzt nur in meinem beispiel schwarz/weiss.
ich dachte eher an alle schwarz/weiss töne.
und halt nur ganz schwarz soll sich nicht ändern.


Willst du die anderen auch ersetzen oder nur ein bisschen mehr rosa bzw. rot machen? Was ist das Kriterium für Zwischenfarben? Bei Schwarz/Weiss sind es alle Graustufen, also von (1,1,1) [0,0,0 nicht - das is ja schwarz] über (127,127,127) bis (255,255,255). Und was bei den anderen Farben?

AXMD
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Do 19.05.05 15:18 
also nur 0,0,0
soll nichts verändern.
alles darüber soll schon verändert werden.
wenn das bild ganz weiss ist, soll es halt zB mit meineProzedur(255,0,0) ganz rot werden.
hat das bild zB einen schwarz-weiss übergang, soll es schwarz-orange-rot werden.
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Do 19.05.05 19:14 
ok ich hatte grade eine idee, weiss aber nicht, ob das so klappen kann.
also ich habe einmal mein schwarz/weiss bild, und einmal ein bild, dass meine farbe enthält.
zB rot.
nun ist mein schwarz/weiss bild hmm naja ich würd es fast alphamap nennen.
alles was nicht schwarz ist, wird um so und soviel prozent überdeckt.

könnte das so klappen?
wenn ja, hat jemand ne idee wie?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 19.05.05 19:23 
Kommt immer auf die Anwendung draufan. Was soll z.B. mit grün oder blau werden? Eine einfache Möglichkeit wäre, alle Blau- und Grüntöne wegzulassen, dann ist alles Rot-Schwarz. Aber eben, bevor man eine Umrechnung angeben kann, muss man sich im klaren sein, wass man genau will.
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Do 19.05.05 19:36 
es soll halt mit allen rgb farben funktionieren.
mit rot war nur ein beispiel
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 19.05.05 20:01 
Und was passiert mit blau, wenn ich jetzt grün rot machen will? Ich mein, eine eindeutige Antwort gibt's nicht.
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Do 19.05.05 20:04 
also das standardbild ist IMMER
schwarz/weiss.
und da soll man jetzt einfach weiss/grau durch eine vorher festgelegte farbe ersetzen können.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 19.05.05 20:10 
Wenn das der Fall ist, solltest du mal nach einer Umrechnung der Farbwerte im RGB-Format nach HSV (Helligkeit, Sättigung, Farbton) und zurück suchen.
Dann kannst du einen Farbton (grün, blau, violett, etc.) und eine Sättigung (knallig bis pastell) angeben, und je nach Grauwert die Helligkeit ändern. Diese Werte dann zurückrechnen ins RGB-Modell und dem Pixel zuweisen.

_________________
We are, we were and will not be.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 20.05.05 03:00 
Rechne den Grauwert in den Bereich 0..1 um, und multiplizier diesen Grauwert einfach mit der gewünschten Farbe (z.B. 128,192,96).
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Fr 20.05.05 08:34 
genau wie delfiphan sagte, hier mal ein beispiel:

Ich hab den Code jetzt nicht getestet, hab ihn einfach so aus dem Kopf heraus geschrieben.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Farbton(src: TBitmap; r, g, b: Byte);
var p: TRGBTriple; i: Integer; grau: Double;
begin
  src.PixelFormat:=pf24bit;
  p:=src.ScanLine[src.Height-1];
  for i:=1 to src.Width*src.Height do begin
    grau:=p.rgbtRed / 255// grauwert (bereich 0..1)
    p.rgbtRed:=Round(r * grau);
    p.rgbtGreen:=Round(g * grau);
    p.rgbtBlue:=Round(b * grau);
    Inc(p);
  end;
end;

MfG
Phantom1
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Fr 20.05.05 14:17 
ok danke, das werd ich mal ausprobieren
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Sa 21.05.05 16:15 
ok habs grad mal so ausprobiert, aber leider ohne erfolg.
da ich mich mit diesen farbsachen erhlichgesagt garnicht auskenne,
poste ich einfahc mal die fehler die er ausspuckt:

also er sagt, dass
ausblenden Delphi-Quelltext
1:
p:=src.ScanLine[src.Height-1];					

und
ausblenden Delphi-Quelltext
1:
p: TRGBTriple					

nicht zusammenpassen.
also
Incompatible types: 'tagRGBTriple' and 'Pointer'

kann ich src.ScanLine[src.Height-1] irgendwie in ein trgbTriple umwandeln?
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 21.05.05 16:33 
EDIT: so ich habs:
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 := clred; //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
        image2.Canvas.pixels[x, y] := RGB(r3, g3, b3); //Farbe zusammenfügen und setzen
      end;
end;


Zuletzt bearbeitet von F34r0fTh3D4rk am Sa 21.05.05 17:03, insgesamt 1-mal bearbeitet
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Sa 21.05.05 16:53 
ok thx erstmal, aber was genau macht jex diese prozedur?
habs mal mit nem normalen schwarz weiss bild ausprobiert, und
wenn ich das knöpfchen drücke kommt ein komplett einfarbig rotes bild raus : )
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 21.05.05 16:54 
ist dein bild komprimiert ?

bei mir klappts wunderbar :)

Die Prozedur mischt rot rein ^^ :lol: color auch durch grün ersetzbar


Zuletzt bearbeitet von F34r0fTh3D4rk am Sa 21.05.05 16:58, insgesamt 1-mal bearbeitet
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Sa 21.05.05 16:57 
user profile iconen!gma hat folgendes geschrieben:
ok habs grad mal so ausprobiert, aber leider ohne erfolg.
da ich mich mit diesen farbsachen erhlichgesagt garnicht auskenne,
poste ich einfahc mal die fehler die er ausspuckt:

also er sagt, dass
ausblenden Delphi-Quelltext
1:
p:=src.ScanLine[src.Height-1];					

und
ausblenden Delphi-Quelltext
1:
p: TRGBTriple					

nicht zusammenpassen.
also
Incompatible types: 'tagRGBTriple' and 'Pointer'

kann ich src.ScanLine[src.Height-1] irgendwie in ein trgbTriple umwandeln?


OK, wie gesagt, ich hatte den Code nicht getestet.
Du musst die Variablendeklaration ändern, von "p: TRGBTriple;" in "p: PRGBTriple";

Hier nochmal der Complette Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Farbton(src: TBitmap; r, g, b: Byte);
var p: PRGBTriple; i: Integer; grau: Double;
begin
  src.PixelFormat:=pf24bit;
  p:=src.ScanLine[src.Height-1];
  for i:=1 to src.Width*src.Height do begin
    grau:=p.rgbtRed / 255// grauwert (bereich 0..1)
    p.rgbtRed:=Round(r * grau);
    p.rgbtGreen:=Round(g * grau);
    p.rgbtBlue:=Round(b * grau);
    Inc(p);
  end;
end;


mfg
Phantom1
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 21.05.05 16:59 
mit jpeg wirst du glaube ich probleme bekommen, muss ich mal testen

edit: jo ziemliche :D

also immer schön bitmaps verwenden dann funzt mein code auch :wink: