Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   PNG - Image mit Transparenz in Clipboard (https://www.delphipraxis.net/179732-png-image-mit-transparenz-clipboard.html)

geesmith 27. Mär 2014 17:30

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;

himitsu 27. Mär 2014 17:38

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.

Perlsau 27. Mär 2014 17:58

AW: PNG - Image mit Transparenz in Clipboard
 
Wenn du das PNG-Bild innerhalb derselben Anwendung kopieren willst, brauchst du kein Clipboard.

Uwe Raabe 27. Mär 2014 18:48

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.

geesmith 27. Mär 2014 19:59

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.

jaenicke 28. Mär 2014 09:58

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;

himitsu 28. Mär 2014 10:07

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.

Uwe Raabe 28. Mär 2014 10:21

AW: PNG - Image mit Transparenz in Clipboard
 
Zitat:

Zitat von jaenicke (Beitrag 1253766)
Ich glaube mich zu erinnern, dass sogar Excel 2003 schon das PNG Format unterstützt hat.

Probieren geht bekanntlich über studieren. Meine Aussage stützt sich lediglich auf diese Auflistung: Excel Clipboard Formats

jaenicke 28. Mär 2014 10:26

AW: PNG - Image mit Transparenz in Clipboard
 
Ausprobiert habe ich es übrigens mit Excel 2010, da geht es.

Zitat:

Zitat von himitsu (Beitrag 1253769)
Für die Programme, welche PNG nicht können, könnte man ja zusätzlich noch das Bitmap anbieten.

Das ist auch wichtig, ja.

geesmith 28. Mär 2014 20:18

AW: PNG - Image mit Transparenz in Clipboard
 
Wow, echt cool. Das funktioniert!

An TMemoryStream hatte ich nicht gedacht.

Vielen Dank jaenicke! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.
Seite 1 von 2  1 2      

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