Entwickler-Ecke

Multimedia / Grafik - farbton von bild ändern?


en!gma - Do 19.05.05 15:06
Titel: farbton von bild ändern?
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 - 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 - 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 - 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 - 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 - 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 - 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 - Do 19.05.05 19:36

es soll halt mit allen rgb farben funktionieren.
mit rot war nur ein beispiel


delfiphan - 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 - 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 - 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.


delfiphan - 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 - 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.


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 - Fr 20.05.05 14:17

ok danke, das werd ich mal ausprobieren


en!gma - 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

Delphi-Quelltext
1:
p:=src.ScanLine[src.Height-1];                    

und

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 - Sa 21.05.05 16:33

EDIT: so ich habs:

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;


en!gma - 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 - 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


Phantom1 - 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

Delphi-Quelltext
1:
p:=src.ScanLine[src.Height-1];                    

und

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:

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


en!gma - Sa 21.05.05 17:02

erstmal @ fearofthedark:
ich habs sofort mit bmp versucht.
habs noch nicht mit jpeg versucht.

@phantom1:
irgendwie ist es das gleiche wie bei fearofthedark : /
oder mach ich was falsch?
oder mom ich lad mal das bild hoch, dass ich benutzt habe


F34r0fTh3D4rk - Sa 21.05.05 17:04

du machst was falsch :D (habe meinen Code jetzt mit kommentaren versehen)

hast du stretch oder transparent oder so benutzt ?


en!gma - Sa 21.05.05 17:06

nein garnichts von alldem.
aber ich merke gerade, villeicht liegt es daran, dass ich mein bild auf schwarz weiss only eingestellt hab bei photoshop.
muss das bild 32 bit sein? oder ist das egal?


//edit
ahh jetzt gehts ;D
nur ich muss die form erst einmal minimieren und dann wieder maximieren?!?


F34r0fTh3D4rk - Sa 21.05.05 17:08

hab ich auch


en!gma - Sa 21.05.05 17:12

ahh ok
viiiiiieeeeeeeeeeelen dank euch beiden.
es ist genauso, wie ich es gebraucht habe : )


F34r0fTh3D4rk - Sa 21.05.05 17:12

sag ich doch :mrgreen: du solltest aber scanline benutzen, weil schneller :idea:


Phantom1 - Sa 21.05.05 17:19

user profile iconen!gma hat folgendes geschrieben:

nur ich muss die form erst einmal minimieren und dann wieder maximieren?!?


sieht so aus als wenn du ein Image1.Repaint vergessen hast ;O)


F34r0fTh3D4rk - Sa 21.05.05 17:26

wenn man bei meinem code grün benutzt kommt das was ganz merkwürdiges bei raus (aber es ist grün ^^) ich such den fehler mal :wink:

EDIT: ich finde keinen fehler, ihr etwa ?