Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ? (https://www.delphipraxis.net/196234-interessante-tools-fuer-clipboard-management-wie-jpg-png-copy-pasten.html)

Rollo62 3. Mai 2018 09:39


Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Hallo zusammen,

habe mich gerade etwas mit Clipboard und Imageformaten beschäftigt.
Die beiden hier Ditto und Clcl finde ich ganz interessant für die Analyse.

Vielleicht kann es ja noch jemand gebrauchen.

Was ich eigentlich suche ist
  • wie man JPG/PNG im Clipboard mit ANDEREN Applikationen austauschen könnte.
    Eigene Apps können ein CustomFormat registrieren, aber fremde Apps kennen das erstmal nicht.
  • So wie ich das sehe muss es dann immer über Bitmaps/DIBs gehen, und die Kompression und Transparenz ist weg.

Oder hat da von euch noch jemand einen besonderen Trick den ich nicht kenne
(Vielleicht anders verpacken: per Streams, per ZIP, per BASE64-Encode, ...
vielleicht einen globalen Handler (DLL) registrieren (aber wo und wie), ...) ?


Rollo

jobo 3. Mai 2018 09:52

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Keine Ahnung aber ne Idee:
Viele Anwendungen können per Drag&Drop sowie per Copy/Paste (aus dem Explorer in die Anwendung) Dateien(!) handhaben.
Wenn man es also schaft, aus dem eigenen Programm das aktuelle Bild als z.B. PNG Datei in den Puffer zu bekommen, ist man vielleicht ein Stück weiter, zumindest bei Anwendungen die Paste eine PNG oder JPG Datei aus dem Explorer schlucken.

Rollo62 3. Mai 2018 09:59

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Ja dankesehr für den Tipp.
Vielleicht ist das ein Ausweg, muss ich mal checken.
Aber nicht alle Applikationen können mit DnD umgehen, aber vielleicht reicht es bei meiner Anwendung.

Rollo

KodeZwerg 3. Mai 2018 10:01

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Clipboard Format Spy
Ich hoffe das geht in die richtige Richtung.

Rollo62 3. Mai 2018 10:13

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Hallo Kodezwerg,

dankesehr, die Tools reichten schon aus.
Aber noch eins, und dann mit Delphi-Source, das ist immer gern gesehen :-)

Rollo

himitsu 3. Mai 2018 10:16

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Jupp, beide Apps müssen nur das "selbe" Format/CustomFormat nutzen.

CustomFormats sind zwar zur Laufzeit zufällige WORDs, aber die entstanden aus einem STRING, welcher eigentlich eindeutig ist, damit jeder Beteiligte das Gleiche bekommt.


"Dieses" Drag&Drop läuft auch über das Clipboard ab, zusammen mit Interfaces oder Windows-Messages, aber da gibt es Komponenten, welche einem die Arbeit abnehmen das selber Umsetzen zu müssen,
vor allem da bei sowas die Inhalte im Clipboard oftmals in mehreren Varianten gleichzeitig drin sind, damit die andere Seite sich etwas aussuchen kann, was sie kennt, aus einer Liste was du anbietest.

z.B. Text aus WORD > als RTF, als Unicode-Text und ANSI-Text (ohne Formatierungen) und in einem eigenen ClipboardFormat (CF).

KodeZwerg 3. Mai 2018 10:31

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Zu Delphi 7 Zeiten hatte ich das Clipboard Format Spy Beispiel genutzt um Dinge aus der Zwischenablage korrekt anzuzeigen und abzuspeichern, für diesen Zweck hat es prima geklappt, es arbeitet dabei genau wie himitsu schreibt, über Listen gelangt man an entsprechenden Inhalt. In dem Code siehst du prima wie man da durch-enumeriert und darauf zugreift.
Viel Erfolg mit Deinem Vorhaben!

Rollo62 5. Mai 2018 18:19

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Mir ging es um den Austausch mit anderen pgm, word irfanvie etc.

Customformat funktioniert ja nu wenn beide das gleiche nutzen
Und .eines wissens gibt es keinen Standard für jpg png gif etc.
Oder hat zb. Word sowas vorgesehen ?

Rollo

Rollo62 5. Mai 2018 18:22

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Mir ging es um den Austausch mit anderen pgm, word irfanvie etc.

Customformat funktioniert ja nu wenn beide das gleiche nutzen
Und .eines wissens gibt es keinen Standard für jpg png gif etc.
Oder hat zb. Word sowas vorgesehen ?

Also copy als jpg und paste in Word kommt es kompri.iert an.


Rollo

himitsu 6. Mai 2018 10:02

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Standards von Microsoft gab es schon lange keine Neuen.

ABER, es gibt Quasi-Standards, welche sich verbreiten.
Also ein Entwickler baut ein CustomFormat für sich und sein(e) Programm(e),
andere Programme/Entwickler schauen sich das ab und nutzen es auch, um selber und mit ihm reden zu können.
Und irgendwann nutzen es nahezu alle anderen Programme,
aber natürlich führt Microsoft da keine Liste.

Einfach ein größeres Programm nehmen und schauen was es dir beim Kopieren anbietet.
Eventuell gibt es auch im Netz hier und da ein paar Listen/Definitionen, wo Andere sich das alles schon angesehn oder die Dokumenteation der Programme studiert haben.

Redeemer 6. Mai 2018 13:38

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Ein JPG in die Zwischenablage zu kopieren, ist sinnlos. Es gibt nur zwei Sachen, für die man einen JPG-Stream brauchen könnte (verlustfreies Drehen/Spiegeln und Ausschneiden), aber das nutzt keiner mit der Zwischenablage.
"PNG" und "Alphakanal" sind auch zwei verschiedene Begriffe. PNGs in die Zwischenablage zu kopieren, ist sinnlos, da sie bei jeder Änderung neu kodiert werden müssen (was immerhin verlustfrei ist). Für Alphakanäle hat sich leider kein Standard durchgesetzt.

himitsu 6. Mai 2018 15:21

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Diese Bilder im "original" Speicherformat zu kopieren hat nur einen Vorteil, wenn sie am Ziel im selben Format bleiben und nicht verändert werden.
> Dann bleibt bei den verlustbehafteten Formaten die Qualität gleich.

PS: Bilder als 32-Bit-Bitmap (mit Alpha) da rein und zusätzlich als IStream, kleiner Dateien als Global-Memory oder extern als Path verlinken (die original-Datei).

Rollo62 6. Mai 2018 16:29

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
1. Siehe himitzu
2. Der Speicherbeyarf in der Zielapp, wenn es embedded wird.

Leider kann man das nicht immer gut feststellen wie apps das handhaben, ich gehe aber mittlerweile davon aus das es immer als bmp im Ziel ankommt.
Ob das ZielApp daraus etwas anderes konvertiert hängt von dessen Gusto ab.
Ich denke das dann immer eine ZielApp eigene Konvertierung eingesetzt wird, aber nie das OrginalApp Datei.

Damit muss ich wohl leben ...
Romlo

KodeZwerg 6. Mai 2018 21:01

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Es gibt dutzende Möglichkeiten was mit Clipboard anzustellen, ehe Du Dich um Formate sorgst, schau lieber wie Deine Ziel App überhaupt mit der Außenwelt Kommuniziert. Das von Dir genannte "Ditto" ist schon mega komplex und Umfangreich, man wird ja förmlich erschlagen mit Möglichkeiten.

Rollo62 7. Mai 2018 05:34

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
@Kodezwerg
Ochmal zur Klarstellung: Es geht nicht in erster Linie um meine App.
Es geht drum wie ich das JPG/PNG in meiner und anderen konservieren kann, ohne das es zu BMP aufbläht.

Am Besten erscheint mir vielleicht als Beispiel IrFanView, das kann alle Fomate bearbeiten und per Copy-Paste übernehmen.
Aber erst nach dem Speichern wird das neue (oder alte)) Format erstellt.
Solange es in IrFanView in der Bearbeitung ist wird es intern womöglich als BMP im Memory sein
(macht ja auch Sinn).

Aber wenn ich das jetzt per CopyPaste rausgeben möchte wie kann ich erzwingen das JPG o.ä. erhalten bleibt, so das der Empfänger das nicht umwandln muss.

Mir scheint das es da wohl keine allgemeine Lösung gibt, das DnD will ich mir noch genaur anschauen.
Ich hätte gehofft das man ein CustomFormal irgendwie global registrieren könnte, so das es clevere Apps auch nutzen könnten, aber das ist wohl nicht vorgesehen.
Dann scheint es nur formatsicher über Export/Import zu funktionieren, geht auch ist aber nicht sehr elegant.

Rollo

KodeZwerg 7. Mai 2018 10:41

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
how-would-you-copy-a-png-image-to-the-clipboard-using-delphi
Zitat:

It could be that they use an alternative clipboard format, see http://msdn.microsoft.com/en-us/libr...13(VS.85).aspx for a list of available clipboard formats. Or they could register their own clipboard format such as

RegisterClipboardFormat('PNG')
and then simply write the png data to the clipboard. If the clipboard format string specified is standard (i.e. other applications register the same clipboard format) then you will be able to paste it into other applications which support this clipboard format.

You might need to call windows functions directly as Delphi's clipboard wrapper isn't very good.

how-to-save-pngimage-from-clipboard
Get current clipboard formats
Hier eine bessere Version als von PasteBin >>>
Delphi-Quellcode:
uses
  ActiveX;

function GetClipboardFormatString(Format: Word): string;
var
  S: string;
begin
  case Format of
    1: S := 'CF_TEXT';
    2: S := 'CF_BITMAP';
    3: S := 'CF_METAFILEPICT';
    4: S := 'CF_SYLK';
    5: S := 'CF_DIF';
    6: S := 'CF_TIFF';
    7: S := 'CF_OEMTEXT';
    8: S := 'CF_DIB';
    9: S := 'CF_PALETTE';
    10: S := 'CF_PENDATA';
    11: S := 'CF_RIFF';      
    12: S := 'CF_WAVE';
    13: S := 'CF_UNICODETEXT';
    14: S := 'CF_ENHMETAFILE';
    15: S := 'CF_HDROP';
    16: S := 'CF_LOCALE';
    17: S := 'CF_DIBV5';
    $0080: S := 'CF_OWNERDISPLAY';
    $0081: S := 'CF_DSPTEXT';
    $0082: S := 'CF_DSPBITMAP';
    $0083: S := 'CF_DSPMETAFILEPICT';
    $008E: S := 'CF_DSPENHMETAFILE';
    $0200: S := 'CF_PRIVATEFIRST';
    $02FF: S := 'CF_PRIVATELAST';  
    $0300: S := 'CF_GDIOBJFIRST';
    $03FF: S := 'CF_GDIOBJLAST';
  else
    begin    
      SetLength(S, 255);
      SetLength(S, GetClipboardFormatName(Format, PChar(S), 255));    
      if Length(S) = 0 then
        S := 'Unknown, unregistered clipboard format';
      Result := S + ' (' + IntToStr(Format) + ')';
      Exit;
    end;
  end;
  Result := 'Standard clipboard format (' + S + ')';
end;

function GetClipboardFormats: string;
var
  S: string;
  FormatEtc: TFormatEtc;
  DataObject: IDataObject;
  EnumFormatEtc: IEnumFormatEtc;
begin
  Result := '';
  if Succeeded(OleGetClipboard(DataObject)) then
  begin
    if Succeeded(DataObject.EnumFormatEtc(DATADIR_GET, EnumFormatEtc)) then
    begin
      S := DupeString('-', 65) + sLineBreak +
        'Clipboard data formats: ' + sLineBreak +
        DupeString('-', 65) + sLineBreak;
      while EnumFormatEtc.Next(1, FormatEtc, nil) = S_OK do
        S := S + GetClipboardFormatString(FormatEtc.cfFormat) + sLineBreak;
      Result := S;
    end;
  end;
end;

function GetClipboardInfoDIB: string;
var
  S: string;
  ClipboardData: HGLOBAL;
  BitmapInfoHeader: PBitmapInfoHeader;
const
  BI_JPEG = 4;
  BI_PNG = 5;
begin
  Result := '';
  if OpenClipboard(0) then
  try
    ClipboardData := GetClipboardData(CF_DIB);
    if ClipboardData <> 0 then
    begin
      BitmapInfoHeader := GlobalLock(ClipboardData);
      if Assigned(BitmapInfoHeader) then
      try
        S := DupeString('-', 65) + sLineBreak +
          'Clipboard data of CF_DIB format: ' + sLineBreak +
          DupeString('-', 65) + sLineBreak +
          'Width: ' + IntToStr(BitmapInfoHeader.biWidth) + ' px' + sLineBreak +
          'Height: ' + IntToStr(BitmapInfoHeader.biHeight) + ' px' + sLineBreak +
          'Bit depth: ' + IntToStr(BitmapInfoHeader.biBitCount) + ' bpp' + sLineBreak +
          'Compression format: ';
        case BitmapInfoHeader.biCompression of
          BI_RGB:  S := S + 'Uncompressed format (BI_RGB)';
          BI_RLE8: S := S + 'RLE format for bitmaps with 8 bpp (BI_RLE8)';
          BI_RLE4: S := S + 'RLE format for bitmaps with 4 bpp (BI_RLE4)';
          BI_BITFIELDS: S := S + 'Not compressed with color masks (BI_BITFIELDS)';
          BI_JPEG: S := S + 'Compressed using JPEG file format (BI_JPEG)';
          BI_PNG:  S := S + 'Compressed using PNG file format (BI_PNG)';
        end;
        S := S + sLineBreak;
        Result := S;
      finally
        GlobalUnlock(ClipboardData);
      end;    
    end;
  finally
    CloseClipboard;
  end;
end;

function GetClipboardInfoDIBV5: string;
var
  S: string;
  ClipboardData: HGLOBAL;
  BitmapInfoHeader: PBitmapV5Header;
const
  BI_JPEG = 4;
  BI_PNG = 5;
begin
  Result := '';
  if OpenClipboard(0) then
  try
    ClipboardData := GetClipboardData(CF_DIBV5);
    if ClipboardData <> 0 then
    begin
      BitmapInfoHeader := GlobalLock(ClipboardData);
      if Assigned(BitmapInfoHeader) then
      try
        S := DupeString('-', 65) + sLineBreak +
          'Clipboard data of CF_DIBV5 format: ' + sLineBreak +
          DupeString('-', 65) + sLineBreak +
          'Width: ' + IntToStr(BitmapInfoHeader.bV5Width) + ' px' + sLineBreak +
          'Height: ' + IntToStr(BitmapInfoHeader.bV5Height) + ' px' + sLineBreak +
          'Bit depth: ' + IntToStr(BitmapInfoHeader.bV5BitCount) + ' bpp' + sLineBreak +
          'Compression format: ';
        case BitmapInfoHeader.bV5Compression of
          BI_RGB:  S := S + 'Uncompressed format (BI_RGB)';
          BI_RLE8: S := S + 'RLE format for bitmaps with 8 bpp (BI_RLE8)';
          BI_RLE4: S := S + 'RLE format for bitmaps with 4 bpp (BI_RLE4)';
          BI_BITFIELDS: S := S + 'Not compressed with color masks (BI_BITFIELDS)';
          BI_JPEG: S := S + 'Compressed using JPEG file format (BI_JPEG)';
          BI_PNG:  S := S + 'Compressed using PNG file format (BI_PNG)';
        end;
        S := S + sLineBreak;
        Result := S;
      finally
        GlobalUnlock(ClipboardData);
      end;    
    end;
  finally
    CloseClipboard;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := GetClipboardFormats;
  if IsClipboardFormatAvailable(CF_DIB) then
    S := S + sLineBreak + GetClipboardInfoDIB;
  if IsClipboardFormatAvailable(CF_DIBV5) then
    S := S + sLineBreak + GetClipboardInfoDIBV5;
  ShowMessage(S);
end;

save-bitmap-with-transparency-to-png-in-delphi
Delphi-Quellcode:
Use PNGImage. In Delphi, try this:

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.Create;
  try
    oPNGDest.Assign(oBMPSrc);
    oPNGDest.SaveToFile(sFilename);
  finally
    oPNGDest.Free;
  end;
end;
If that doesn't work for you, you'll probably have to copy over the alpha and RGB values individually.

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.CreateBlank(COLOR_RGBALPHA, 8, oBMPSrc.Width, oBMPSrc.Height);
  try
    oPNGDest.CreateAlpha;
    // Copy over RGB
    ..
    // Copy over Alpha
    ..
    // Save to file
    oPNGDest.SaveToFile(sFilename);
  finally
    oPNGDest.Free;
  end;
end;
Das beste am Schluss:
png-image-mit-transparenz-clipboard
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;
Wenn Du mit all diesen Informationen nichts anfangen kannst, dann glaube ich das ich nicht verstehe worum es Dir eigentlich geht.

Rollo62 9. Mai 2018 14:13

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Hallo Kodezwerg,

dankesehr für die Mühe.
Das sieht vielversprechend aus, werde ich demnächst checken.

Rollo

Redeemer 9. Mai 2018 16:15

AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
 
Zitat:

Zitat von Rollo62 (Beitrag 1401479)
Am Besten erscheint mir vielleicht als Beispiel IrFanView, das kann alle Fomate bearbeiten und per Copy-Paste übernehmen.
Aber erst nach dem Speichern wird das neue (oder alte)) Format erstellt.
Solange es in IrFanView in der Bearbeitung ist wird es intern womöglich als BMP im Memory sein
(macht ja auch Sinn).

Aber wenn ich das jetzt per CopyPaste rausgeben möchte wie kann ich erzwingen das JPG o.ä. erhalten bleibt, so das der Empfänger das nicht umwandln muss.

Mir scheint das es da wohl keine allgemeine Lösung gibt, das DnD will ich mir noch genaur anschauen.
Ich hätte gehofft das man ein CustomFormal irgendwie global registrieren könnte, so das es clevere Apps auch nutzen könnten, aber das ist wohl nicht vorgesehen.
Dann scheint es nur formatsicher über Export/Import zu funktionieren, geht auch ist aber nicht sehr elegant.

IrfanView lädt das Bild als DIB in den Speicher und interessiert sich ab diesem Punkt nicht mehr für die Datei, da es ausschließlich mit der DIB im Speicher arbeitet. Zu diesem Zeitpunkt schmeiß IrfanView auch den Alphakanal weg, da es Alphakanäle im Speicher nicht unterstützt. Du kannst die Datei sofort löschen, wenn das Bild angezeigt wird (außer für verlustfreie JPEG-Bearbeitung und Mehrseitenbilder, aber diese beiden Features sind nur mit Dateien und nicht mit der Zwischenlage möglich, da IrfanView auch nur DIBs aus der Zwischenablage unterstützt).


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 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