AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia GDI+ Bilddrehung mit Transparenz
Thema durchsuchen
Ansicht
Themen-Optionen

GDI+ Bilddrehung mit Transparenz

Ein Thema von Duck-of-Devastation · begonnen am 25. Feb 2019 · letzter Beitrag vom 28. Feb 2019
 
Duck-of-Devastation

Registriert seit: 31. Mär 2010
11 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

GDI+ Bilddrehung mit Transparenz

  Alt 25. Feb 2019, 08:44
Moin!


ich versuche mittels GDI+ ein TBitmap (pf32Bit, bmDIP, afDefined) zu rotieren. Dieses klappt auch mit u.a. Procedure, leider geht dabei die Transparenz flöten und ich kenne mich mit GDI+ leider nicht ausreichend aus (Delphi 10.1 Berlin):


Code:
uses gdipapi, gdipobj; ...

procedure RotateBitmapGDI(Bmp: TBitmap; Degs: Integer; AdjustSize: Boolean;
  BkColor: TColor = clNone);
var
  Tmp: TGPBitmap;
  Matrix: TGPMatrix;
  C: Single;
  S: Single;
  NewSize: TSize;
  Graphs, G2: TGPGraphics;
  P: TGPPointF;
begin


  Tmp := TGPBitmap.Create(Bmp.Handle, Bmp.Palette);
 
  if tmp.getpixelformat=PixelFormatAlpha then showmessage('alpha');
  if tmp.getpixelformat=PixelFormatPAlpha then showmessage('Prealpha');
  if isalphapixelformat(tmp.GetPixelFormat) then ShowMessage('ALPHA');
  if iscanonicalpixelformat(tmp.GetPixelFormat) then ShowMessage('Canonical');
  if tmp.GetPixelFormat=PixelFormat32bppRGB then ShowMessage('32RGB');
  if isindexedpixelformat(tmp.GetPixelFormat) then ShowMessage('Indexed');
  showmessage(inttostr(getpixelformatsize(tmp.GetPixelFormat)));


  Matrix := TGPMatrix.Create;
  try
    Matrix.RotateAt(Degs, MakePoint(0.5 * Bmp.Width, 0.5 * Bmp.Height));
    if AdjustSize then
    begin
      C := Cos(DegToRad(Degs));
      S := Sin(DegToRad(Degs));
      NewSize.cx := Round(Bmp.Width * Abs(C) + Bmp.Height * Abs(S));
      NewSize.cy := Round(Bmp.Width * Abs(S) + Bmp.Height * Abs(C));
      Bmp.Width := NewSize.cx;
      Bmp.Height := NewSize.cy;
    end;
    Graphs := TGPGraphics.Create(Bmp.Canvas.Handle);
    try
      Graphs.Clear(ColorRefToARGB(ColorToRGB(BkColor)));
      Graphs.SetTransform(Matrix);
      Graphs.DrawImage(tmp, (Cardinal(Bmp.Width) - Tmp.GetWidth) div 2, (Cardinal(Bmp.Height) - Tmp.GetHeight) div 2);
    finally
      Graphs.Free;
    end;
  finally
    Matrix.Free;
    Tmp.Free;
  end;
end;

Das Problem ist offenbar, dass bei
Code:
Tmp := TGPBitmap.Create(Bmp.Handle, Bmp.Palette);
das Pixelformat nicht übernommen wird. Ich habe alternativ ausprobiert, die TGPBitmap aus einem Stream zu laden, auch das entfernt aber leider die Transparenz. Wenn ich die tmp-Bitmap selbst mit pixelFormat32bppARGB erzeuge, bin ich leider zu doof, meine TBitmap dort reinzukopieren (ich habe versucht, zu tmp ein TGPGraphics zu erzeugen und mit DrawImage reinzumalen, aber da bin ich offenbar zu blöd zu).


Kann mir da jemand auf die Sprünge helfen?


VG

Sven
Sven
  Mit Zitat antworten Zitat
 


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 01:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz