Getpixel Colour

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Pascal95

Getpixel Colour

Beitrag von Pascal95 »

Hallo,
ich suche eine Funktion, die mir die RGB-Farben eines Pixels in einem BMP Bild, das ich in mein Programm geladen habe, ausgibt.
Damit meine ich die Komponente TImage, in Image1.Picture ist das Bild geladen. Wie kriege ich nun die Farbe an dem Pixel mit der Position (4|7) ?

Vielen Dank
Pascal

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Getpixel Colour

Beitrag von Socke »

Ich gehe davon aus, dass Image1 ein TImage ist. In dem Falle so:

Code: Alles auswählen

var
  cl: TColor;
  r, g, b: Byte;
cl := Image1.Canvas.Pixels[4, 7]; // als TColor
RedGreenBlue(cl, r, g, b); // einzelne Farbkomponenten
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Pascal95

Re: Getpixel Colour

Beitrag von Pascal95 »

Hey danke!
Genau das hab ich gesucht, wusste garnicht, dass man die Pixels so einfach über Canvas.Pixels[x,y] ansteuern kann!

Pascal

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1620
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Getpixel Colour

Beitrag von corpsman »

Man kann schon, aber du solltest dir gut überlegen ob du es so machen willst.

Denn es ist Langsam !!

Wenn du nur hier und da mal nen Pixelwert haben willst ist das ok.

Hast du aber vor das ganze Bild zu bearbeiten lohnt sich das umwandeln in ein TLazIntfImage.
--
Just try it

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Getpixel Colour

Beitrag von Bauer321 »

corpsman hat geschrieben:Man kann schon, aber du solltest dir gut überlegen ob du es so machen willst.

Denn es ist Langsam !!

Wenn du nur hier und da mal nen Pixelwert haben willst ist das ok.

Hast du aber vor das ganze Bild zu bearbeiten lohnt sich das umwandeln in ein TLazIntfImage.
ich bin mir da jetzt nicht ganz sicher aber ich miene es gab vor nen paar wochen mal wen der das getestet hat und festgestellt hat das ein TImage schneller als ein TLazIntfImage ist
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1620
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Getpixel Colour

Beitrag von corpsman »

Also ich kann die Argumentation nicht ganz nach vollziehen ( in diesem Sample braucht TImage mit 74 sec zu 0.044 TLazIntfImage deutlich länger )

Code: Alles auswählen

Procedure TForm1.Button1Click(Sender: TObject);
Var
  bm: Tbitmap;
  TempIntfImg: TLazIntfImage;
  ImgHandle, ImgMaskHandle: HBitmap;
  CurColor: TFPColor;
  i, j: Integer;
  c: dword;
Begin
  If OpenDialog1.Execute Then Begin
    bm := Tbitmap.create;
    bm.LoadFromFile(OpenDialog1.FileName);
    bm.PixelFormat := pf24bit;
    TempIntfImg := TLazIntfImage.Create(0, 0);
    TempIntfImg.LoadFromBitmap(bm.Handle, bm.MaskHandle);
    c := gettickcount;
    // Zugriff auf Pixel mittels
    For i := 0 To bm.Width - 1 Do Begin
      For j := 0 To bm.height - 1 Do Begin
        CurColor := TempIntfImg.Colors[i, j];
        CurColor.red := (255 - (CurColor.red Shr 8)) Shl 8;
        CurColor.blue := (255 - (CurColor.blue Shr 8)) Shl 8;
        CurColor.green := (255 - (CurColor.green Shr 8)) Shl 8;
        TempIntfImg.Colors[i, j] := CurColor;
      End;
    End;
    label1.caption := inttostr(GetTickCount - c);
    TempIntfImg.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
    bm.Handle := ImgHandle;
    bm.MaskHandle := ImgMaskHandle;
    TempIntfImg.free;
    bm.SaveToFile(OpenDialog1.FileName + 'inv.bmp');
    bm.free;
  End;
End;
 
Procedure TForm1.Button2Click(Sender: TObject);
Var
  bm: Tbitmap;
  img: Timage;
  i, j: Integer;
  c: dword;
  CurColor: TFPColor;
Begin
   If OpenDialog1.Execute Then Begin
    bm := Tbitmap.create;
    bm.LoadFromFile(OpenDialog1.FileName);
    bm.PixelFormat := pf24bit;
    img := timage.create(Nil);
    img.picture.Assign(bm);
    c := gettickcount;
    // Zugriff auf Pixel mittels
    For i := 0 To bm.Width - 1 Do Begin
      For j := 0 To bm.height - 1 Do Begin
        CurColor := img.Canvas.Colors[i, j];
        CurColor.red := (255 - (CurColor.red Shr 8)) Shl 8;
        CurColor.blue := (255 - (CurColor.blue Shr 8)) Shl 8;
        CurColor.green := (255 - (CurColor.green Shr 8)) Shl 8;
        img.Canvas.Colors[i, j] := CurColor;
      End;
    End;
    label2.caption := inttostr(GetTickCount - c);
    bm.Assign(img.Picture);
    img.free;
    bm.SaveToFile(OpenDialog1.FileName + 'inv2.bmp');
    bm.free;
  End;      
End;
--
Just try it

Pascal95

Re: Getpixel Colour

Beitrag von Pascal95 »

Bei mir hat TImage aber auch lange gedauert.
Es war aber, wie "corpsman" meinte, auch nur dazu gedacht einzelne Pixel zu erkennen und nicht das ganze Bild zu analysieren.

Falls ich mal etwas schnelleres brauche, werde ich die Alternative genauer betrachten.

Antworten