Bitmap Canvas RawImage
Bitmap Canvas RawImage
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.
- 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
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.
Winni
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);
...
Re: Bitmap Canvas RawImage
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.
Und von einem Canvas eines RawImages habe ich kein Wort gesagt.
Re: Bitmap Canvas RawImage
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
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
Re: Bitmap Canvas RawImage
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.
Re: Bitmap Canvas RawImage
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.
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.
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Bitmap Canvas RawImage
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.
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
Mit Java und C/C++ sehe ich rot
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
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).
Re: Bitmap Canvas RawImage
Naja, so schnell schläft mein Gesicht nicht ein.

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
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Bitmap Canvas RawImage
bei mir 4578
Intel(R) Celeron(R) J4105 1,5GHz
dafür in Silent Technologie, man hört die Pixel nicht....


dafür in Silent Technologie, man hört die Pixel nicht....

Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: Bitmap Canvas RawImage
OK, dann liegt dein Rechner so etwa beim Zuse Z3 mit seiner Rechengeschwindigkeit... 

Gruß, Michael
Re: Bitmap Canvas RawImage
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?
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:
https://www.cpubenchmark.net/cpu.php?cp ... GHz&id=691
Auf Windows kann es anders aussehen, aber wer benutzt schon Windows?

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:

https://www.cpubenchmark.net/cpu.php?cp ... GHz&id=691
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Bitmap Canvas RawImage
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.
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Bitmap Canvas RawImage
Kannst Du das Testprogramm dort mal laufen lassen ?P.S. Ich habe noch eine viel "bessere" CPU, welche ich noch fast täglich benutze in meinem Küchen-Netbook:![]()
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: Bitmap Canvas RawImage
Vielleicht später, aber ich hatte eben eine bessere Idee:siro hat geschrieben: Sa 28. Mai 2022, 09:56Kannst Du das Testprogramm dort mal laufen lassen ?P.S. Ich habe noch eine viel "bessere" CPU, welche ich noch fast täglich benutze in meinem Küchen-Netbook:![]()
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.