Toon posts:

[Delphi] Scanline

Pagina: 1
Acties:
  • 136 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo allemaal,

Ik moet op mijn scherm een aantal vlak bijelkaar liggende pixels analyseren op kleur. Eerst gebruikte ik hiervoor de GetPixel functie. Deze was echter niet snel genoeg. Nu heb ik de onderstaande code geschreven aan de hand van een aantal examples die ik heb gevonden op internet:

code:
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
26
27
28
29
30
31
32
33
34
35
36
37
const
  RectWidth = 200;
  RectHeight = 100;
  RectLeft = 10;
  RectTop = 20;
var
  Bitmap: TBitmap;
  DC: HDC;
  w, h, x, y: Integer;
  PixelPtr: PRGBQuad;
begin
  Bitmap := TBitmap.Create;
  try
    w := RectWidth;
    h := RectHeight;
    Bitmap.Width := w;
    Bitmap.Height := h;
    DC := GetDC(0);
    try
      BitBlt(Bitmap.Canvas.Handle, 0, 0, w, h,
             DC, w, h, SRCCOPY);
    finally
      ReleaseDC(0, DC);
    end;
    Bitmap.PixelFormat := pf32Bit;
    for y := 0 to h - 1 do
    begin
      PixelPtr := PRGBQuad(Bitmap.ScanLine[y]);
      for x := 0 to w - 1 do
      begin
         //iets doen met pointer
        Inc(PixelPtr);
      end;
    end;
  finally
    Bitmap.Free;
  end;


Nu moet ik iets doen met die pointer. Ik ben alleen niet erg bekent met het op deze manier gebruiken van pointers. Weet iemand wat ik met PixelPtr^ moet doen om de RGB-kleur van de betreffende pixel te verkrijgen

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12 01:59

curry684

left part of the evil twins

Uitlezen.

Professionele website nodig?


Verwijderd

Topicstarter
Als ik nou een integer maak I maak.
En dan doen ik:

code:
1
I := Integer (PixelPtr^)


Is de uitkomst daarvan dan de RGB kleur?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20-12 22:30

Tomatoman

Fulltime prutser

PixelPtr is een PRGBQuad, oftewel een pointer naar een TRGBQuad. PixelPtr^ is dus de TRGBQuad zelf. Wil je bijvoorbeeld de rood-component van de pixel hebben, dan kun je uitlezen via PixelPtr^.rgbRed. De definitie van TRGBQuad kun je vinden in Windows.pas.

Een goede grap mag vrienden kosten.


  • jhksema
  • Registratie: Januari 2002
  • Laatst online: 15-11 16:04
Verwijderd schreef op 30 March 2003 @ 16:12:
[...]


Als ik nou een integer maak I maak.
En dan doen ik:

code:
1
I := Integer (PixelPtr^)


Is de uitkomst daarvan dan de RGB kleur?
Geeft misschien wel een leuk effect. RGB is 3 bytes, dus je leest met 32-bits integer RGB van 1 pixel en R van volgende pixel. Of is dit niet het effect wat je wil bereiken?

Verwijderd

Topicstarter
even iets anders mbt tot bitblt

Ik maak een screenshot van een bepaald gedeelte4 van mijn scherm. Hiervoor heb ik deze code geschreven:

code:
1
2
3
4
5
6
7
8
procedure TForm1.BitBtn2Click(Sender: TObject);
var
  DC: HDC;
begin
    DC := GetDC (0);
    BitBlt(Image1.Canvas.Handle, 0, 0, 200, 100, DC, 866, 606, SRCCOPY);
    ReleaseDc (0, DC);
end;


Echter kan deze code maar een keer een screenshot maken. Als ik voor een tweede keer op de knop druk als mijn beeld is gewijzigt gebeurt er helemaal niets

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20-12 22:30

Tomatoman

Fulltime prutser

jhksema schreef op 30 maart 2003 @ 16:32:
[...]
Geeft misschien wel een leuk effect. RGB is 3 bytes, dus je leest met 32-bits integer RGB van 1 pixel en R van volgende pixel. Of is dit niet het effect wat je wil bereiken?
Dit is onjuist. Een TRGBQuad is 32 bits lang.
Verwijderd schreef op 30 maart 2003 @ 17:09:
[...]
Echter kan deze code maar een keer een screenshot maken. Als ik voor een tweede keer op de knop druk als mijn beeld is gewijzigt gebeurt er helemaal niets
Bedankt voor de mededeling :)

Een goede grap mag vrienden kosten.

Pagina: 1