Getpixel Colour
Getpixel Colour
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
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
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Getpixel Colour
Hey danke!
Genau das hab ich gesucht, wusste garnicht, dass man die Pixels so einfach über Canvas.Pixels[x,y] ansteuern kann!
Pascal
Genau das hab ich gesucht, wusste garnicht, dass man die Pixels so einfach über Canvas.Pixels[x,y] ansteuern kann!
Pascal
- 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
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.
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
Just try it
-
- 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
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 istcorpsman 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.
www.mcpatcher.net | www.hoeper.me
- 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
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
Just try it
Re: Getpixel Colour
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.
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.