![]() |
PNG - Image mit Transparenz in Clipboard
Hallo zusammen
Leider hat mich meine Suche durch das Internet nicht weitergebracht. Ich versuchs jetzt mal bei den Profis :). Ich erstelle ein Bild vom Typ TPngImage. Dieses Bild beinhaltet einen transparenten Bereich. Nun will ich dieses Bild mit der ganzen Transparenz in die Zwischablage nehmen, um es zB. in Excel einzufügen. Funktioniert ziemlich alles ...nur die Transparenz nimmt er nicht mit. Wenn ich das PNG speichere, dann speichert er das Bild mit Transparenz. Im Clipboard macht er das nicht. Der ganze Code ist nur testweise, war am rumprobieren. Daher viel Sinn ergibt das bmp->png nicht. Es gibt eine Methode von TPngImage :SaveToClipboardFormat. Damit komm ich aber wegen KnowHow-Mangel nicht klar. Vielleicht wäre das eine Lösung. Ausserdem habe ich von einer API-Funktion nahmens "RegisterClipboardFormat" gelsen. Ich konnte sie zwar implementieren, aber es tut sich trotzdem nichts. Vielen Dank für eure Hilfe!
Delphi-Quellcode:
uses
pngimage,Clipbrd; var bmp: TBitmap; png: TPngImage; begin bmp := TBitmap.Create; bmp.SetSize(200,200); bmp.Canvas.Brush.Color := clRed; bmp.Canvas.Rectangle( 20, 20, 160, 160 ); bmp.Canvas.Brush.Style := bsClear; bmp.Canvas.Rectangle(1, 1, 199, 199); bmp.Canvas.Brush.Color := clWhite; bmp.Canvas.Pen.Color := clRed; bmp.Canvas.TextOut( 35, 20, 'Hello transparent world'); bmp.TransparentColor := clWhite; bmp.Transparent := True; png := TPngImage.Create; png.Assign( bmp ); png.SaveToFile( 'C:\test.png' ); Clipboard.Assign(png); bmp.Free; png.Free; end; |
AW: PNG - Image mit Transparenz in Clipboard
Wie/Wo liest du denn das Bild aus dem Clipboard wieder aus?
Vielleicht isses ja doch drin, aber das Zielprogramm macht es kaputt. |
AW: PNG - Image mit Transparenz in Clipboard
Wenn du das PNG-Bild innerhalb derselben Anwendung kopieren willst, brauchst du kein Clipboard.
|
AW: PNG - Image mit Transparenz in Clipboard
Wenn du ein PngImage in das Clipboard schreibst, dann wird das dort als simple Bitmap abgelegt. Dabei geht die Transparenz bzw. das Alphablend verloren.
Übrigens verwendet Clipboard.Assign indirekt genau die Methode SaveToClipboardFormat. Selbst wenn du jetzt ein Clipboardformat registrieren würdest, das PNG unterstützt, dann müsste dieses Format ja auch im Zielprogramm implementiert sein. Für Excel ist das aber soweit ich weiß nicht der Fall. |
AW: PNG - Image mit Transparenz in Clipboard
Uwe hat recht... icht hab nach einer Applikation gesucht in der ich per Cut and Paste ein Bild mit Transparenz rüber nehmen kann. Ich hatte nicht realisiert, dass ich das noch nie gesehen habe. Danke für die Aufklärung.
@Perlsau Ich habe Excel geöffnet und möchte von einem parallel laufenden Delphiprogramm ein Bild mit Transparenz ins Excel übernehmen. Das ist das Ziel. @himitsu Interessanter Gedanke ...denke aber mittlerweile dass Clipboard das gar nicht kann (siehe Comment von Uwe) Ich glaube ich kann das Ziel nicht erreichen. |
AW: PNG - Image mit Transparenz in Clipboard
Das ist kein Problem. Ich glaube mich zu erinnern, dass sogar Excel 2003 schon das PNG Format unterstützt hat. Kopieren geht auch sehr einfach über die API (im Test mit einem TImage namens Image1 mit einem geladenen PNG):
Delphi-Quellcode:
var
DataStream: TMemoryStream; Data: Pointer; DataHandle: THandle; ClipboardFormat: Integer; begin // Das Format sollte man natürlich eher nur beim Start der Anwendung einmal registrieren ClipboardFormat := RegisterClipboardFormat('PNG'); DataStream := TMemoryStream.Create; try // Die Bilddaten können natürlich auch direkt aus einer Datei usw. stammen Image1.Picture.Graphic.SaveToStream(DataStream); DataHandle := GlobalAlloc(GMEM_DDESHARE, DataStream.Size); Data := GlobalLock(DataHandle); try DataStream.Position := 0; DataStream.ReadBuffer(Data^, DataStream.Size); finally GlobalUnlock(DataHandle); end; Clipboard.Open; Clipboard.SetAsHandle(ClipboardFormat, DataHandle); Clipboard.Close; finally DataStream.Free; end; |
AW: PNG - Image mit Transparenz in Clipboard
Für die Programme, welche PNG nicht können, könnte man ja zusätzlich noch das Bitmap anbieten.
In das Clipboard passen ja gleichzeitig mehrere Formate rein, wo sich dann jedes Ziel das aussucht, was es versteht. |
AW: PNG - Image mit Transparenz in Clipboard
Zitat:
![]() |
AW: PNG - Image mit Transparenz in Clipboard
Ausprobiert habe ich es übrigens mit Excel 2010, da geht es.
Zitat:
|
AW: PNG - Image mit Transparenz in Clipboard
Wow, echt cool. Das funktioniert!
An TMemoryStream hatte ich nicht gedacht. Vielen Dank jaenicke! :thumb: |
AW: PNG - Image mit Transparenz in Clipboard
Man möge mir verzeihen, dass ich dieses uralte Thema ausgrabe. Ich versuche schon seit mehreren Tagen über diverse Suchmaschinen herauszufinden, wie ich ein -partiell transparentes- PNG aus der Zwischenablage in mein Programm bekomme - leider ohne Erfolg. Da dieses Thema hier in DP und Google bei allen Suchwort-Variationen zu dem Thema immer weit Oben erscheint, und ich letztendlich die von jaenicke genannte Prozedur umgebaut habe, scheint mir dies entsprechend der sinnvollste Platz zu sein, um mein Wissen mit der Nachwelt zu teilen:
Delphi-Quellcode:
Dieser Post erfordert keine Antwort, für Verbesserungsvorschläge bin ich wie immer offen.
unit uClipboardPNG;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm2 = class(TForm) Image1: TImage; procedure Image1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation uses Clipbrd, pngimage; {$R *.dfm} // The given TargetPNG will load the PNG from the clipboard, if possible // Will return True if successfull // TargetPNG won't be changed if unsuccessfull function LoadPNGFromClipboard(_TargetPNG: TPngImage): Boolean; var DataStream: TMemoryStream; Data: Pointer; DataHandle: THandle; PNGClipboardFormat: Integer; begin Result := False; DataStream := NIL; try if not assigned(_TargetPNG) then Exit; PNGClipboardFormat := RegisterClipboardFormat('PNG'); DataStream := TMemoryStream.Create; Clipboard.Open; DataHandle := Clipboard.GetAsHandle(PNGClipboardFormat); Clipboard.Close; // DataHandle will only be <> 0, if the clipboard contains a PNG Image if DataHandle <> 0 then begin Data := GlobalLock(DataHandle); if Data <> nil then begin try DataStream.Write(Data^, GlobalSize(DataHandle)); DataStream.Position := 0; Result := True; finally GlobalUnlock(DataHandle); end; end; end; // If Handle has been assigned and data has been read, load the PNG Data into the PNGImage if Result then begin _TargetPNG.LoadFromStream(DataStream); end; except // end; FreeAndNil(DataStream); end; // The given TargetImage will contain a TPNGImage with the clipboard's content, if clipboard contains a PNG // Returns True if successfull // TargetImage won't be changed if unsuccessfull function LoadImageFromClipboard_PNG(_TargetImage: TImage): Boolean; var png: TPngImage; begin Result := False; png := NIL; try if not assigned(_TargetImage) then Exit; png := TPngImage.Create; Result := LoadPNGFromClipboard(png); _TargetImage.Picture.Assign(png); except // end; FreeAndNil(png); end; procedure TForm2.Image1Click(Sender: TObject); begin // Load PNG into Image1 from Clipboard if not LoadImageFromClipboard_PNG(Image1) then begin // If not successfull, clear Image1 Image1.Picture.Assign(NIL); // If Clipboard <> PNG, feel free to use other methods to load it, like // Image1.Picture.Assign(Clipboard); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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