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
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: GDI+ Bilddrehung mit Transparenz

  Alt 27. Feb 2019, 15:49
Geändert von Sherlock (Heute um 13:29 Uhr) Grund: eine Variable war überflüssig
Wenn du jetzt myRotate rausgekürzt hast, dann war das zuviel.
  Mit Zitat antworten Zitat
Duck-of-Devastation

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

AW: GDI+ Bilddrehung mit Transparenz

  Alt 27. Feb 2019, 16:41
Moin!

Vielen Dank für Eure Vorschläge!

Ist es so, dass die Transparenzfarbe in dem Pixel links oben (oder so) festgelegt ist?
Dann könntest Du möglicherweise alle Pixel drehen - außer die in den 4 Ecken.
Das ist es leider nicht, die Ausgangsbitmap hat einen "echten" Alphakanal (mit semitransparenten Pixeln).

Hier mal eine Alternative zu GDI+, die ich persönlich übersichtlicher finde: WIC.
Sherlock
Das probier ich mal aus, vielen Dank! Wobei ich mich ursprünglich für GDI+ entschieden hatte, weil das Antialiasing der rotierten Bitmap dort zu schön aussieht. Ich hatte zuerst die Rotation mit PlgBlt umgesetzt, aber das sind nach der Rotation so hässliche "Kanten" im rotierten Bild zu sehen. WIC hatte ich bislang allerdings noch gar nicht auf der Rechnung...

VG
Sven
Sven
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: GDI+ Bilddrehung mit Transparenz

  Alt 27. Feb 2019, 18:26
Zitat:
Das ist es leider nicht, die Ausgangsbitmap hat einen "echten" Alphakanal (mit semitransparenten Pixeln).
Verstehe das Problem nicht.

Du lädst das Bitmap mit GDI+ wenn ich das richtig verstehe.
Danach hast du ein Graphics Image <> TBitmap.

Was hält dich nun davon ab das Image zu HBitmap zu konvertieren und dieses dann zur Rotation zu verwenden.
Weder die Farben noch der Alpha Channel wird dadurch berührt da ändert sich nichts.

GDI++ ..

Nachtrag:
Mein Ansatz.

Delphi-Quellcode:
  if img <> 0 then
  begin
  // GetImageSize(Img, ImgW, ImgH);
    GdipGetImagePixelFormat(img, format);
    if format = PixelFormat32bppARGB then // Accept files with alpha channel
    begin
       GdipCreateHBITMAPFromBitmap(pointer(img), hbmReturn, $00ff0000);
       if hbmReturn <> 0 then
          Result := hbmReturn;
    end;

    GdipDisposeImage(img);
  end;

gruss

Geändert von EWeiss (11. Jul 2019 um 15:55 Uhr)
  Mit Zitat antworten Zitat
Duck-of-Devastation

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

AW: GDI+ Bilddrehung mit Transparenz

  Alt 27. Feb 2019, 18:41
Verstehe das Problem nicht.

Du lädst das Bitmap mit GDI+ wenn ich das richtig verstehe.
Danach hast du ein Graphics Image <> TBitmap.

Was hält dich nun davon ab das Image zu HBitmap zu konvertieren und dieses dann zur Rotation zu verwenden.
Weder die Farben noch der Alpha Channel wird dadurch berührt da ändert sich nichts.

gruss
Hi...

nein, ich habe ursprünglich ein TBitmap "bmp" (aus einer ImageList, ich lade es also nicht direkt mit GDI+), das ich drehen möchte. Dazu möchte ich es mit Transparenz in eine TGPBitmap "tmp" wandeln/ kopieren, dann drehen und wieder zurückgeben.

Mit

Tmp := TGPBitmap.Create(Bmp.Handle, Bmp.Palette);
hat die TGPBitmap Tmp nachher aber das Pixelformat 32bppRGB statt 32bppARGB, der Alphakanal verschwindet bei der Umwandlung. Mein Problem ist also der Schritt von TBitmap zu TGPBitmap…


VG
Sven
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: GDI+ Bilddrehung mit Transparenz

  Alt 27. Feb 2019, 18:47
Wie ich schon sagte..
TBitmap zu TGPBitmap := Graphics Image.
Es spielt keine rolle welches Format du verwendest am ende ist es immer ein Graphics Image Object.

PNG, JPG, BMP und Konsorte.

Zitat:
aus einer ImageList, ich lade es also nicht direkt mit GDI+
Und das Bitmap wenn du es schon hast hat kein Handle?
Dann reicht ein GdipCreateBitmapFromHBITMAP..

Zitat:
hat die TGPBitmap Tmp nachher aber das Pixelformat 32bppRGB
Nicht schon vorher, also in der ImageList?
Prüfe das doch mal vorher mit GdipGetImagePixelFormat.
Du musst also sicherstellen das dein Bitmap in der ImgageList auch schon im 32Bit ARGB Format vorliegt.

Teste das hier.
Du must die Bitmaps vorher in ein GDI+ fähigen Bitmap Format (Graphics Image Object) konvertieren sonst wird das nichts!
Delphi-Quellcode:
function ImageListToGPBitmap(SourceImageList: TImageList): TGPBitmap;
var
    bmp: TGPBitmap;
    g: TGPGraphics;
    dc: HDC;
    i: Integer;
    x: Integer;

    procedure GdipCheck(Status: Winapi.GDIPAPI.TStatus);
    begin
        if Status <> Ok then
            raise Exception.CreateFmt('%s', [GetStatus(Status)]);
    end;
begin
    //Note: Code is public domain. No attribution required.
    bmp := TGPBitmap.Create(SourceImageList.Width*SourceImageList.Count, SourceImageList.Height);
    GdipCheck(bmp.GetLastStatus);

    g := TGPGraphics.Create(bmp);
    GdipCheck(g.GetLastStatus);

    g.Clear($00000000);
    GdipCheck(g.GetLastStatus);

    dc := g.GetHDC;

    for i := 0 to dmGlobal.imgImages.Count-1 do
    begin
        x := i * dmGlobal.imgImages.Width;

        ImageList_DrawEx(dmGlobal.imgImages.Handle, i, dc,
                        x, 0, dmGlobal.imgImages.Width, dmGlobal.imgImages.Height,
                        CLR_NONE, CLR_DEFAULT,
                        ILD_TRANSPARENT);
    end;
    g.ReleaseHDC(dc);
    g.Free;

    Result := bmp;
end;
gruss

Geändert von EWeiss (27. Feb 2019 um 19:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.821 Beiträge
 
Delphi 12 Athens
 
#6

AW: GDI+ Bilddrehung mit Transparenz

  Alt 28. Feb 2019, 06:48
Geändert von Sherlock (Heute um 13:29 Uhr) Grund: eine Variable war überflüssig
Wenn du jetzt myRotate rausgekürzt hast, dann war das zuviel.
Gnarf!
In der Tat. Ich hab die im Endergebnis 10 Minuten später nicht mehr gesehen und dachte "weg damit!"

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:12 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