Entwickler-Ecke

Multimedia / Grafik - Graustufen-Bitmap erstellen und Pixelzugriff beschleunigen


[r2d2] - So 09.11.03 04:17
Titel: Graustufen-Bitmap erstellen und Pixelzugriff beschleunigen
Hi
Ich habe zwei Fragen:
1.
Wie kann man sich eine Graustufen-Bitmap erstellen? Ich meine nicht den Durchschnittswert der RGB-Werte zu berechnen, sondern wirklich eine Bitmap mit nur einem Kanal, die dann auch nur ein drittel des Speichers einer RGB-Bitmap belegt.
2.
Kann man den Zugriff auf die Pixel einer Bitmap irgendwie beschleunigen? Bei Photoshop z.B. gehen Pixelveränderungen ja sehr schnell. Ich krieg eine einfache Abdunklung einer Bitmap in nicht annähernd der Geschwindigkeit hin und so viel kann ich da ja auch nicht anders machen, oder? :shock:

thx


Keldorn - So 09.11.03 11:36

zu. 2. wie machast du denn es jetzt? CanvasPixel ist am langsamsten, scanline ist da schon schneller. Wenn du auf die scanline so wie hier: http://www.efg2.com/Lab/ImageProcessing/Scanline.htm#Optimization zugreifst, holst du nochmal was raus.

Mfg Frank


[r2d2] - Di 11.11.03 00:53

Ich nehm bis jetzt CanvasPixels. Aber wenns anders schneller geht dann schreib ich mein Prog eben um.
Und kennt jemand ne Atwort auf Frage Nr.1? Die wär auch noch wichtig :roll:


Phantom1 - Di 11.11.03 10:31

Zu Frage 1 müsste folgendes reichen:


Delphi-Quelltext
1:
  Bmp.PixelFormat:=pf8bit;  // Bmp ist ein TBitmap                    


Zu Frage 2, habe ich hier mal ein beispiel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Procedure TForm1.BmpGreyScale(Bmp: TBitmap);
Type
  TRGB = Packed Record b, g, r: Byte End;
Var
  PRGB: ^TRGB;
  x,y: Integer;
  m: Byte;
Begin
  Bmp.PixelFormat:=pf24bit;
  For y := 0 to Bmp.Height-1 Do Begin
    PRGB:=Bmp.ScanLine[y];
    For x := 0 to Bmp.Width-1 do begin
      m:=(PRGB^.r+PRGB^.g+PRGB^.b) Div 3;
      PRGB^.r:=m;
      PRGB^.g:=m;
      PRGB^.b:=m;
      Inc(PRGB);
    End;
  End;
End;