Bitmap Canvas RawImage

artelogic
Beiträge: 15
Registriert: Mi 20. Apr 2022, 12:42

Bitmap Canvas RawImage

Beitrag von artelogic »

Wenn ich eine Bitmap über LoadFromRawImage(ARawImage, True) "erstelle", kenne ich die Adresse der Pixel-Daten (ARawImage.Data). Wie kriege ich es hin, dass der Canvas der Bitmap auch auf diese Daten zeigt, so dass Canvas-Funktionen (wie TextOut oder dergleichen) eben genau diese Daten bearbeiten?
Zuletzt geändert von artelogic am Do 26. Mai 2022, 22:17, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bitmap Canvas RawImage

Beitrag von Winni »

Hi!

Du gehst von falschen Vorraussetzungen aus.
Ein TRawImage besitzt keinen Canvas.


Mit LoadFromRawImage kopierst Du die Daten from RawImage in die TBitmap.
Dann kannst Du auf dem Canvas der Bitmap zeichnen.

Code: Alles auswählen

var tmp : TBitmap;
      raw :  TRawImage;
.... 
tmp.LoadFromRawImage(Raw, True) ;
tmp.canvas.line (0,0,100,100);
...
Winni

artelogic
Beiträge: 15
Registriert: Mi 20. Apr 2022, 12:42

Re: Bitmap Canvas RawImage

Beitrag von artelogic »

So wie mir das aussieht, kopiere ich die Daten nicht, wenn ADataOwner True ist. Aber vielleicht liege ich dennoch falsch. Was ich brauche, ist ein Zeiger auf die PixelDaten, der fix ist.

Und von einem Canvas eines RawImages habe ich kein Wort gesagt.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Bitmap Canvas RawImage

Beitrag von theo »

Beschreibe doch mal dein Ziel.
So versteht man gar nicht, worum es dir geht und kann somit nicht effizient helfen.

Es gibt viele Wege mit FPC / Lazarus und die verschiedenen "Welten" können manchmal ganz schön verwirrend sein.
Z.B.
https://wiki.lazarus.freepascal.org/fcl ... nvas_Setup
https://wiki.freepascal.org/BGRABitmap_tutorial

artelogic
Beiträge: 15
Registriert: Mi 20. Apr 2022, 12:42

Re: Bitmap Canvas RawImage

Beitrag von artelogic »

Ich will Pixel-Daten (4x8bit) sowohl über Canvas-Funtionen (TextOut, Ellipse, usw.) als auch direkt über meine eigenen Funktionen, wofür ich eben einen Zeiger auf die Pixel-Daten brauche, bearbeiten.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Bitmap Canvas RawImage

Beitrag von theo »

Ich glaube nicht, dass das so geht, wie du dir das vorstellst, v.A. nicht Cross Platform.
Du kannst aber mit Canvas.Pixels zeichnen. Mit Bitmap.Beginupdate/Endupdate sollte es auch etwas schneller gehen.

Ansonsten TLazIntfImage, TFPImage oder dies
https://wiki.lazarus.freepascal.org/Fas ... xel_access
https://wiki.freepascal.org/Developing_ ... xel_access
https://wiki.freepascal.org/BGRABitmap_tutorial
etc.

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitmap Canvas RawImage

Beitrag von Mathias »

Mit Pixels schläft einem das Gesicht ein. Mit man sehr schnell Pixel setzen will, kommt man nicht herum direkt in die RawImage zu schreiben.
Nur wie der Vorredner sagt, bei Cross muss man einiges beachten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Bitmap Canvas RawImage

Beitrag von af0815 »

artelogic hat geschrieben:
Fr 27. Mai 2022, 12:14
Ich will Pixel-Daten (4x8bit) sowohl über...
Es sind nicht immer 4x8Bit an Pixeldaten. Besonders wenn man auf verschiedenen Plattformen unterwegs ist. Auch die Reihenfolge ist nicht in Stein gemeißelt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Bitmap Canvas RawImage

Beitrag von theo »

Mathias hat geschrieben:
Fr 27. Mai 2022, 22:39
Mit Pixels schläft einem das Gesicht ein.
Naja, so schnell schläft mein Gesicht nicht ein. :lol:
Natürlich gibt es Schnelleres, aber wenn man es richtig macht, kann man (je nach Anforderung) damit schon leben.

Dieser Code ist auf meinem Rechner (i5) in 160ms erledigt:

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
var
  W, H, i, j: integer;
  ABmp: TBitmap;
  tick: QWord;
begin
  tick := GetTickCount64;
  W := 1000;
  H := 1000;
  ABmp := TBitmap.Create;
  ABmp.SetSize(W, H);

  ABmp.BeginUpdate(True);

  for i := 1 to W do
    for j := 1 to H do
      if Odd(i) then
        ABmp.Canvas.Pixels[i, j] := clYellow
      else
        ABmp.Canvas.Pixels[i, j] := clGreen;
  ABmp.Canvas.TextOut(5,5,'Ein Test');

  ABmp.EndUpdate;

  Canvas.Draw(1, 1, aBmp);
  Caption := IntToStr(GetTickCount64 - Tick);
  ABmp.free;   //Sorry, ging anfänglich im Eifer des Gefechts vergessen.
end; 


Wie gesagt, es kommt auf die Anforderungen an, aber so unterirdisch ist das nicht.

EDIT: Lazarus 2.3.0 (rev main-2_3-1247-g0716a2c3bd) FPC 3.2.2 x86_64-linux-gtk2

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Bitmap Canvas RawImage

Beitrag von siro »

bei mir 4578 :roll: :P Intel(R) Celeron(R) J4105 1,5GHz
dafür in Silent Technologie, man hört die Pixel nicht.... :mrgreen:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Bitmap Canvas RawImage

Beitrag von six1 »

OK, dann liegt dein Rechner so etwa beim Zuse Z3 mit seiner Rechengeschwindigkeit... :lol:
Gruß, Michael

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Bitmap Canvas RawImage

Beitrag von theo »

Gut, vielleicht müsste ich noch sagen, dass ich das auf Linux GTK2 getestet habe.
Auf Windows kann es anders aussehen, aber wer benutzt schon Windows? :mrgreen:

EDIT: @siro, der Unterschied bei den CPUs erklärt diesen grossen Geschwindigkeitsunterschied nicht. Muss also an Windows oder der Lazarus Version liegen.
https://www.cpubenchmark.net/compare/In ... 3414vs3159

P.S. Ich habe noch eine viel "bessere" CPU, welche ich noch fast täglich benutze in meinem Küchen-Netbook: :wink:
https://www.cpubenchmark.net/cpu.php?cp ... GHz&id=691

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Bitmap Canvas RawImage

Beitrag von siro »

Windows 10 64 Bit
Lazarus 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_64-win64-win32/win64
Ich habe eine OnBoard Grafik, vielleicht deshalb ?

Direkt auf dem Form.canvas benötigt er bei mir 5313ms, ist also nicht so gross der Gewinn bei Bitmap.
Eventuell kann man mit BGRAbitmap noch mehr herausholen ? hab ich noch nicht probiert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Bitmap Canvas RawImage

Beitrag von siro »

P.S. Ich habe noch eine viel "bessere" CPU, welche ich noch fast täglich benutze in meinem Küchen-Netbook: :wink:
Kannst Du das Testprogramm dort mal laufen lassen ?
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Bitmap Canvas RawImage

Beitrag von theo »

siro hat geschrieben:
Sa 28. Mai 2022, 09:56
P.S. Ich habe noch eine viel "bessere" CPU, welche ich noch fast täglich benutze in meinem Küchen-Netbook: :wink:
Kannst Du das Testprogramm dort mal laufen lassen ?
Vielleicht später, aber ich hatte eben eine bessere Idee:
Da ich mir letzten Sonntag von privat (dann doch noch) einen 8GB Raspi 4b besorgt habe, habe ich es damit getestet und komme auf 950 ms.

OS: 64bit bullseye.
Lazarus 2.3.0 (rev main-2_3-1334-g0d94210f62) FPC 3.2.2 aarch64-linux-gtk2

Das ist langsam, aber immer noch unter 1 Sekunde.
Bei einer "Full HD" Bitmap-Grösse (1920 × 1080), dauert es 1900ms, also knapp zwei Sekunden.

EDIT: Der Rechner mit dem Celeron U3600 ist etwas besser als der Raspi, mit 850 ms auf GTK2.

Antworten