AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia ID2D1Bitmap1 von TBitmap erstellen

ID2D1Bitmap1 von TBitmap erstellen

Ein Thema von Cypheros · begonnen am 28. Aug 2025 · letzter Beitrag vom 29. Aug 2025
Antwort Antwort
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#1

ID2D1Bitmap1 von TBitmap erstellen

  Alt 28. Aug 2025, 23:53
Hi Delphianer,

hänge momentan bei einer Routine um ein TBitmap in ein ID2D1Bitmap1 zu überführen. Sehe den Wald vor lauter Bäumen nicht mehr.

Code:
function TcyImage.CreateBitmap(Bitmap: TBitmap; D2DContext: ID2D1DeviceContext): ID2D1Bitmap1;
var
  BitmapInfo: TBitmapInfo;
  buf: array of Byte;
  BitmapProperties: D2D1_BITMAP_PROPERTIES1;
  Hbmp: HBitmap;
  LPitch: Cardinal;
begin
  FillChar(BitmapInfo, SizeOf(BitmapInfo), 0);
  BitmapInfo.bmiHeader.biSize := Sizeof(BitmapInfo.bmiHeader);
  BitmapInfo.bmiHeader.biHeight := -Bitmap.Height;
  BitmapInfo.bmiHeader.biWidth := Bitmap.Width;
  BitmapInfo.bmiHeader.biPlanes := 1;
  BitmapInfo.bmiHeader.biBitCount := 32;

  SetLength(buf, Bitmap.Height * Bitmap.Width * 4);
  // Forces evaluation of Bitmap.Handle before Bitmap.Canvas.Handle
  Hbmp := Bitmap.Handle;
  GetDIBits(Bitmap.Canvas.Handle, Hbmp, 0, Bitmap.Height, @buf[0], BitmapInfo, DIB_RGB_COLORS);

  BitmapProperties := System.Default(D2D1_BITMAP_PROPERTIES1);
  BitmapProperties.dpiX := 0;
  BitmapProperties.dpiY := 0;
  BitmapProperties.bitmapOptions := D2D1_BITMAP_OPTIONS_NONE;
  BitmapProperties._pixelFormat.format := DXGI_FORMAT_B8G8R8A8_UNORM;
  if (Bitmap.PixelFormat <> pf32bit) or (Bitmap.AlphaFormat = afIgnored) then
    BitmapProperties._pixelFormat.alphaMode := D2D1_ALPHA_MODE_IGNORE
  else
    BitmapProperties._pixelFormat.alphaMode := D2D1_ALPHA_MODE_PREMULTIPLIED;

  LPitch := 4 * Bitmap.Width;

  if assigned(D2DContext) then
    D2DContext.CreateBitmap(D2D1SizeU(Bitmap.Width, Bitmap.Height), @buf[0], LPitch, @BitmapProperties, Result);
end;
Es wir leider nur ein weißes Bild ausgegeben bei D2DContext.DrawBitmap(CreateBitmap(Bitmap), @LRect, 1, D2D1_INTERPOLATION_MODE_DEFINITION_LINEAR);
Frank Siek
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.653 Beiträge
 
Delphi 12 Athens
 
#2

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 00:15
Ist dort was Passendes dabei?
https://www.delphipraxis.net/212686-...speichern.html
https://en.delphipraxis.net/topic/67...how-to-use-it/

Delphi-Referenz durchsuchenTDirect2DCanvas klingt ja irgendwie passend.
function TDirect2DCanvas.CreateBitmap(Bitmap: TBitmap): ID2D1Bitmap;



Falls dir der VCL-Quellcode zur Verfügung steht (ich vermute mal in D11, also 22.0, dürfte es ähnlich aussehn)
C:\Program Files (x86)\Embarcadero\Studio\23.0\source\vcl\Vcl.StyleBitmap.pas
Delphi-Quellcode:
function TseBitmapLink.GetScaledBitmapLink(AWidth, AHeight: Integer; ADPI: Integer): TseBitmapLink;
var
  ...
  D2DCanvas: TDirect2DCanvas;
  D2DBitmap: ID2D1Bitmap;
...
      D2DBitmap := D2DCanvas.CreateBitmap(Buffer);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 00:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 00:22
Leider nicht. Hatte ich schon auf dem Schirm aber da geht es um den umgekehrten Weg von ID2D1Bitmap1 nach TBitmap.

Habe festgestellt, dass die MfPack-Definitionen einige Fehler enthalten. Möglicherweise liegt es daran.
Frank Siek
  Mit Zitat antworten Zitat
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 00:28
Danke fürs Update. Hab den Source-Code von 11.1 und StyleBitmap.pas gibt es nicht (mehr).
Frank Siek

Geändert von Cypheros (Gestern um 00:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 00:38
ID2D1Bitmap1 ist bei Delphi 11.1 nicht definiert, da Embarcadero wohl der Meinung ist, dass Direct2D 1.0 genug für Delphi ist, obwohl viele "gute" Features erst ab Direct2D 1.1 existieren.

Der Source aus meinem ersten Post ist zu 98% aus Vcl.Direct2D.pas für ID2D1Bitmap von Embarcadero.
Frank Siek

Geändert von Cypheros (Gestern um 00:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.653 Beiträge
 
Delphi 12 Athens
 
#6

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 00:40
PS: Ich hatte da oben noch bissl was hinzugefügt/geändert.


Habe festgestellt, dass die MfPack-Definitionen einige Fehler enthalten.
ID2D1Bitmap1 ist bei Delphi 11.1 nicht definiert, da Embarcadero wohl der Meinung ist, dass Direct2D 1.0 genug für Delphi ist,
Nja, theoretisch gibt es da was, das nennt sich WinMD.
Da hatte sich Microsoft was Schönes einfallen lassen und Emba hatte, in seiner unvergleichlich qualitativ hochwertigen Art, es versucht nutzbar zu machen.
https://www.delphipraxis.net/214473-...vor-winmd.html (in Version 1.0 dahingerotzt und dann vergessen)

Delphi war mit Headern eh immer ein bissl sehr weit hinterher. (teilweise wurden grade eben erst gefühlt 20 Jahre alte Fehler behoben und Andere werden wohl nie repariert/aktualisiert)
Drum gab es ja JEDI, Indy und Co.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 00:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 00:50
Leider sind die Suchmaschinen durch KI total blöde geworden und man könnte glauben, dass unter Delphi und anderen Programmiersprachen kein Direct2D 1.1+ genutzt wird.

Versuche seit einer Woche mit Direct2D 1.1 zu arbeiten aber es gibt nur sehr wenig darüber.
Frank Siek

Geändert von Cypheros (Gestern um 00:53 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
467 Beiträge
 
#8

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 07:53
Hi,
Es wir leider nur ein weißes Bild ausgegeben bei D2DContext.DrawBitmap(CreateBitmap(Bitmap), @LRect, 1, D2D1_INTERPOLATION_MODE_DEFINITION_LINEAR);
I see what might be the problem, so :

Check and handle the result of GetDIBits, did it fail ? Most likely it did !
If it did not fail then try to fill Buf with something before calling GetDIBits (even random values), see if it does output something, if that didn't help then a small but more complete code that handle ID2D1DeviceContext could greatly help.

on side note: the problem is also could be easily the bitmap you are trying to convert is problematic, see https://learn.microsoft.com/en-us/wi...tmapinfoheader there is few field you are not filling and leaving it to zero state like biCompression if this is used then size of Buf might be different.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 09:01
Thanks for your ideas but the bitmap is perfect and I can use Bitmap.SaveToFile to see that this is a valid bitmap. The result of FD2DContext.CreateBitmap is zero and the ID2D1Bitmap1 is assigned, so the conversion seams to be working.
Frank Siek
  Mit Zitat antworten Zitat
Benutzerbild von Cypheros
Cypheros

Registriert seit: 12. Sep 2024
Ort: Büren
40 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: ID2D1Bitmap1 von TBitmap erstellen

  Alt Gestern, 09:29
Ok, Problem gelöst. Der Code funktioniert, ich hatte an einer anderen Stelle noch Testcode, der die Bitmap wieder übermalt hat.
Frank Siek
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 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