![]() |
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 ![]() ![]() Vielleicht kann es ja noch jemand gebrauchen. Was ich eigentlich suche ist
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 |
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. |
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 |
AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
|
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 |
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). |
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! |
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 |
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 |
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. |
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. |
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). |
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 |
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.
|
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 |
AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
![]() Zitat:
![]() ![]() 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; ![]()
Delphi-Quellcode:
Das beste am Schluss:
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; ![]()
Delphi-Quellcode:
Wenn Du mit all diesen Informationen nichts anfangen kannst, dann glaube ich das ich nicht verstehe worum es Dir eigentlich geht.
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: 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 |
AW: Interessante Tools für Clipboard Management, Wie JPG/PNG copy/pasten ?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 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