Entwickler-Ecke
Multimedia / Grafik - Bild bleichen?
StefanH - Di 19.08.03 12:20
Titel: Bild bleichen?
Hallo!
Ich möchte ein Bild bleichen also z.B. aus Schwarz wird grau oder so, kann mir jemand sagen wie das geht?
Stefan
StefanH - Do 21.08.03 14:34
Also erstmal Danke!
Ich hab mit Hilfe des Tut folgendes zusammengeschustert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject);
type PixArray = Array [1..3] of Byte; var p: ^PixArray; h,w,i: Integer; begin For h:=0 to Image1.Picture.Bitmap.Height-1 do begin p:= Image1.Picture.Bitmap.ScanLine[h]; For w:=0 to Image1.Picture.Bitmap.Width-1 do begin for i:=1 to 3 do inc(p^[i],50); end; end; end; |
Des funzt aber net :( entweder, das Bild ist ganz weg, oder es passiert garnix
Stefan
Mr_T - Do 21.08.03 15:42
Hmm, also ich würde es so machen:
(tempint ist vom typ integer und bitmap ist das tbitmap, welches deine Bitmap enthält... v ist ebenfalls ein integer und beinhält die veränderung... ich denke die variablen x,y, r,g und b sind klar ;-) .... es handelt sich im übrigen um nicht getesteten speudocode ;-) )
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| for x := 0 to bitmap.width do begin for y := 0 to bitmap.height do begin tempint := bitmap.canvas.pixels[x,y]; r := TempInt and $FF; g := (TempInt shr 8) and $FF; b := (TempInt shr 16) and $FF; r := r+v; g := g+v; b := b+v; bitmap.canvas.pixels[x,y] := rgb(r,g,b); end; end; |
Eggi - Do 21.08.03 16:02
Hallo
@StefanH
Wenn ich nichts übersehen habe, müsste dein Algorithmus so funktionieren. Dein Problem ist es wohl das dein Ausgangsbild ziemlich hell ist, so das nach der Addition von 50 auf jeden Farbwert nur noch weiße Pixel herrauskommen. Ich denke mal so wird es aussehen wenn dein Bild komplett weg ist. Wenn sich an einem Bild nichts änders nutzt du wohl einen zu kleinen Parameter. Geringe Änderungen sieht man nicht so leicht.
@Mr_T
Versuch solche Operationen bloß nicht über canvas.pixels[x,y] auszuführen. Außer du machst gerne Kaffeepausen *grins*, das ist nämlich total langsam.
mfg Eggi
kasi - Do 21.08.03 18:37
@StefanH
Du durchläuft den w-Wert nicht p steht immer auf dem linken Pixel. So funktioniert es:
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:
| procedure TForm1.Button1Click(Sender: TObject); const MAXBITMAPCOLS = 2048; type TRGBTripleArray = array[0..MAXBITMAPCOLS] of TRGBTriple; PRGBTripleArray = ^TRGBTripleArray; var p: PRGBTripleArray; h,w: Integer; begin For h:=0 to Image1.Picture.Bitmap.Height-1 do begin p:= Image1.Picture.Bitmap.ScanLine[h]; For w:=0 to Image1.Picture.Bitmap.Width-1 do begin p[w].rgbtBlue := min(255,p[w].rgbtBlue+10); p[w].rgbtGreen := min(255,p[w].rgbtGreen+10); p[w].rgbtRed := min(255,p[w].rgbtRed+10); end; end; Image1.Repaint; end; |
TRGBTriple ist in windows.pas und min in math.pas definiert
KASI
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
StefanH - Do 21.08.03 19:45
@Eggi: ICh hab immer 50 genommen. und die Form ist grau und das Bitmap auch...
@Kasi: Deins geht aber:
| Zitat: |
| Du durchläuft den w-Wert nicht p steht immer auf dem linken Pixel. |
| Zitat: |
Delphi-Quelltext 1: 2: 3: 4:
| For w:=0 to Image1.Picture.Bitmap.Width-1 do begin for i:=1 to 3 do inc(p^[i],50); end; | |
Was ist das?
Stefan
Alibi - Do 21.08.03 19:50
Hm, eine umständliche Variante von inc(p^[i],150); ?
kasi - Do 21.08.03 20:11
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| For h:=0 to Image1.Picture.Bitmap.Height-1 do begin p:= Image1.Picture.Bitmap.ScanLine[h]; For w:=0 to Image1.Picture.Bitmap.Width-1 do begin for i:=1 to 3 do inc(p^[i],50); end; end; |
Du setzt den Zeiger auf das erste Pixel der h-ten Zeile dann erhöhst du Bitmap.Width mal die RGB-Werte um 50. Der Zeiger bleibt an der gleichen Stelle.
KASI
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!