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


umpani - Di 19.08.03 16:18

Also. Dazu musst du die von scanline übergebenen drei farwerte gleichmäßig erhöhen.

Alles klar? Wenn nicht, schau dir mal dieses Bitmap-Tutorial an.

http://www.tutorials.delphi-source.de/bitmap/file005.shtml


Gruß Umpani


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 user profile iconTino: 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 user profile iconTino: Code- durch Delphi-Tags ersetzt.