![]() |
AW: Direct2D.Canvas in einer Bitmap speichern
Zitat:
|
AW: Direct2D.Canvas in einer Bitmap speichern
Hast du mein Beispiel denn irgendwie verändert? Funktioniert es denn so wie es ist bei dir in einer VCL-Form?
Du hast bspw. hier ein Semikolon nach MappedRect.bits drin Zitat:
Die Exception-Meldung ist zu generisch, das kann von VCLBitmap.Handle, über VCLBitmap.Height bis zu ungültigen Zeiger in MappedRect.bits oder leeres unausgefülltes BitmapInfo alles sein. Siehst du denn einen schwarzen Hintergrund mit roten Rechteck und blauen Rand und einer gelben Linie von links oben nach rechts unten auf den D2DCanvas/Rendertarget im Formular? |
AW: Direct2D.Canvas in einer Bitmap speichern
Ja, der Canvas zeichnet alles.
Und ja ich habe per Copy-paste alles in die IDE geholt, Der Kern ist zu 100% identisch, inkl. dem Aufruf von
Delphi-Quellcode:
.
SetDIBits
Der Rückgabewert ist 0! Daher geht dort irgendwas schief. Meine Vermutung liegt auch bei den MappedRect.bits, Klappt es bei dir? Und vielen Dank für deine Mithilfe |
AW: Direct2D.Canvas in einer Bitmap speichern
Ja sicher klappt das bei mir?!
Sonst hätte ich den Quelltext ja nicht gepostet. Arbeitest du denn an einen richtigen Rechner mit dedizierter GPU (Intel, AMD, Nvidia) oder müssen wir erstmal irgendwelche Probleme wegen Remote Desktop, Terminalsession oder virtueller Maschine mit ungenügender GPU-Unterstützung ausschließen??? CopyBitmap.Map muss ja funktionieren, weil es mit Succeeded(HR) abgesichert. Was sagt denn der Debugger? Sind alle Werte sinnvoll belegt? Ergänze bitte mal den Quelltext wie folgt:
Delphi-Quellcode:
VCLBitmap := TBitmap.Create(SizeU.Width, SizeU.Height);
try VCLBitmap.PixelFormat := TPixelFormat.pf32bit; OutputDebugString(PChar('VCLBitmap.Canvas.Handle: ' + THandle(VCLBitmap.Canvas.Handle).ToHexString)); OutputDebugString(PChar('VCLBitmap.Handle: ' + THandle(VCLBitmap.Handle).ToHexString)); OutputDebugString(PChar('VCLBitmap.Height: ' + VCLBitmap.Height.ToString)); OutputDebugString(PChar('MappedRect.bits: ' + THandle(MappedRect.bits).ToHexString)); OutputDebugString(PChar(' BitmapInfo.bmiHeader.biSize: ' + BitmapInfo.bmiHeader.biSize.ToString)); OutputDebugString(PChar(' BitmapInfo.bmiHeader.biHeight: ' + BitmapInfo.bmiHeader.biHeight.ToString)); OutputDebugString(PChar(' BitmapInfo.bmiHeader.biWidth: ' + BitmapInfo.bmiHeader.biWidth.ToString)); OutputDebugString(PChar(' BitmapInfo.bmiHeader.biPlanes: ' + BitmapInfo.bmiHeader.biPlanes.ToString)); OutputDebugString(PChar(' BitmapInfo.bmiHeader.biBitCount: ' + BitmapInfo.bmiHeader.biBitCount.ToString)); NumberOfScanLinesCopied := SetDIBits(VCLBitmap.Canvas.Handle, VCLBitmap.Handle, 0, VCLBitmap.Height, MappedRect.bits, BitmapInfo, DIB_RGB_COLORS); if NumberOfScanLinesCopied > 0 then begin if ABitmapFileName = '' then begin ABitmapFilename := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'Test.bmp'; end; VCLBitmap.SaveToFile(ABitmapFilename); end else RaiseLastOSError; finally VCLBitmap.Free; end; Da müsste dann was rauskommen, was ungefähr so aussieht und Win32:
Code:
Debug Output: VCLBitmap.Canvas.Handle: C101322F Process Direct2DSave.exe (2140)
Debug Output: VCLBitmap.Handle: B905326C Process Direct2DSave.exe (2140) Debug Output: VCLBitmap.Height: 442 Process Direct2DSave.exe (2140) Debug Output: MappedRect.bits: 03A30000 Process Direct2DSave.exe (2140) Debug Output: BitmapInfo.bmiHeader.biSize: 40 Process Direct2DSave.exe (2140) Debug Output: BitmapInfo.bmiHeader.biHeight: -442 Process Direct2DSave.exe (2140) Debug Output: BitmapInfo.bmiHeader.biWidth: 640 Process Direct2DSave.exe (2140) Debug Output: BitmapInfo.bmiHeader.biPlanes: 1 Process Direct2DSave.exe (2140) Debug Output: BitmapInfo.biBitCount.biSize: 32 Process Direct2DSave.exe (2140) |
AW: Direct2D.Canvas in einer Bitmap speichern
ich arbeite auf einem richtigen Rechner,
- Prozessor Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 1992 MHz, 4 Kern(e), 8 logische(r) Prozessor(en) - System-SKU LENOVO_MT_20L7_BU_Think_FM_ThinkPad T480s
Delphi-Quellcode:
Debug-Ausgabe: VCLBitmap.Canvas.Handle: 0000000022010EB5 Prozess _Test.exe (16108)
Debug-Ausgabe: VCLBitmap.Handle: 0000000001053574 Prozess _Test.exe (16108) Debug-Ausgabe: VCLBitmap.Height: 424 Prozess _Test.exe (16108) Debug-Ausgabe: MappedRect.bits: 000002422D6E0000 Prozess _Test.exe (16108) Debug-Ausgabe: BitmapInfo.bmiHeader.biSize: 40 Prozess _Test.exe (16108) Debug-Ausgabe: BitmapInfo.bmiHeader.biHeight: -424 Prozess _Test.exe (16108) Debug-Ausgabe: BitmapInfo.bmiHeader.biWidth: 624 Prozess _Test.exe (16108) Debug-Ausgabe: BitmapInfo.bmiHeader.biPlanes: 1 Prozess _Test.exe (16108) Debug-Ausgabe: BitmapInfo.biBitCount.biSize: 32 Prozess _Test.exe (16108) |
AW: Direct2D.Canvas in einer Bitmap speichern
ich habe meinen Unterschied erkannt, ich arbeite mit Win64...
mit Win32 klappt es |
AW: Direct2D.Canvas in einer Bitmap speichern
Wild, in Win64 geht's bei mir auch nicht.
Ich kann aber auch nur die ersten 3307 Bytes von MappedRect.bits auslesen, danach ist Zugriffsverletzung.
Delphi-Quellcode:
...
HR := CopyBitmap.Map(MapOptions, MappedRect); if Succeeded(HR) then begin SetLength(NewPtr, MappedRect.pitch * SizeU.Height); Stream := TBytesStream.Create(NewPtr); Stream.Write(MappedRect.bits, (3 * 1024) + 235); ... |
AW: Direct2D.Canvas in einer Bitmap speichern
Kann auch gut sein, dass die Intel-Treiber da einen Hau weg haben.
Wenn es in 32-Bit geht und 64-Bit nicht ist schon komisch. Auf Arbeit hatten wir mit alten Intel-Treibern auch irre Probleme mit OpenGL. Das haben die auch erst kürzlich gelöst. Vielleicht kannst du das Programm woanders mit dedizierter Grafikkarte von AMD oder Nvidia laufen lassen. |
AW: Direct2D.Canvas in einer Bitmap speichern
Es gibt bei Bitmaps auch noch ein paar andere Punkte, auf die man mal achten könnte.
* Wenn es nicht 32 Bit pro Pixel sind, dann gibt es eventuell ein Alignment der einzelnen Lines (zumindestens beim Delphi/GDI-Bitmap) * und wie rum liegen die Lines im Speicher * * von unten links nach oben rechts oder von oben links nach unten rechts (also Line 0 gefolgt von den Anderen oder die anderen Lins vor der Line 0 ... wenn man alles zusammen kopiert und nicht jede Line einzeln abfragt) * * oder liegen die Lines garnicht zusammenhängend im Speicher? * * das wäre z.B. eine Erklärung für "Ich kann aber auch nur die ersten 3307 Bytes von MappedRect.bits auslesen, danach ist Zugriffsverletzung" |
AW: Direct2D.Canvas in einer Bitmap speichern
Zitat:
____ Ich vermute eine unterschiedliche Bit-Strucktur zw. Win32 und Win64. Auch wenn ich das als unlogisch empfinde. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz