Entwickler-Ecke
Multimedia / Grafik - Icon in Zwischenablage kopieren
galagher - Mo 21.03.22 14:33
Titel: Icon in Zwischenablage kopieren
Hallo!
Ich möchte ein Icon in die Zwischenablage kopieren, mit Clipboard.Assign(aIcon); funktioniert das aber nicht. Ich kann das Icon natürlich zuvor in ein Bitmap konvertieren und dieses der Zwischenablage zuweisen, dabei verliere ich aber die eigenschaft Transparent. aber es muss doch auch direkt gehen!
jaenicke - Mo 21.03.22 16:18
Der Internet Explorer kannte ein Format dafür:
Die Frage ist aber was du damit machen möchtest. Möchtest du ein Icon für eine andere Anwendung kopieren oder innerhalb deiner eigenen? Bei einer fremden Anwendung könntest du dort eins kopieren, wenn möglich, und schauen welches Format verwendet wird.
galagher - Mo 21.03.22 19:25
jaenicke hat folgendes geschrieben : |
Die Frage ist aber was du damit machen möchtest. Möchtest du ein Icon für eine andere Anwendung kopieren |
Ja, genau das. In die Windows-Zwischenablage. Ich würde ja auch das Bitmap-Format akzeptieren, wenn
Transparent bei der Konvertierung erhalten bleibt.
Sinspin - Mo 21.03.22 19:32
Irfan View kann das. Habe ich vor Jahren verwendet um herauszufinden wie die ContentId's sind um zu identifizieren was man vor sich hat.
galagher - Mi 23.03.22 17:42
Sinspin hat folgendes geschrieben : |
Irfan View kann das. |
Mein Programm soll's aber auch können! :mrgreen:
jaenicke hat folgendes geschrieben : |
Man kann die Formate auch selbst mit EnumClipboardFormats durchgehen |
Ist also nicht so einfach, wie ich hoffte.
Sinspin - Do 24.03.22 09:18
Die Zwischenablage ist eine recht komplexe Struktur. Microsoft hat einiges geändert über die Jahre was Zugriff und Benachrichtigung von lauschenden Prozessen angeht, das war mal wirklich grausig.
Aber die Zwischenablage in der Lage alles an Daten zu halten und transportieren was es gibt. Sogar parallele Daten sind möglich. Zum Beispiel eine HTML und eine Text Version des gleichen Dokumentes.
jaenicke - Do 24.03.22 09:31
Nicht nur das, man kann sogar nur einen Verweis auf den Inhalt hinterlegen. Erst wenn der Inhalt dann wirklich benötigt wird, muss er geliefert werden. Dadurch kann man auch große Datenmengen sehr schnell in die Zwischenablage kopieren.
galagher - Do 24.03.22 17:22
Da blicke ich leider nicht durch. Und es ist nicht das Zielprogramm, das das Icon in der Zwischenablage ablegt, sondern mein Delphi-Programm. Das Zielprogramm soll das Icon dann von dort einlesen.
jaenicke hat folgendes geschrieben : |
Nicht nur das, man kann sogar nur einen Verweis auf den Inhalt hinterlegen. Erst wenn der Inhalt dann wirklich benötigt wird, muss er geliefert werden. |
Gut und schön, aber das hilft mir nicht weiter! Dass die Zwischenablage Icons nicht so ohne Weiteres verarbeiten kann, finde ich schon seltsam. Schliesslich sind Icons ja eine "typische" Windows-Sache und kein exotisches Datenformat!
Wie also bereite ich die Zwischenablage vor? :nixweiss:
galagher - Fr 25.03.22 17:35
Th69 hat folgendes geschrieben : |
Soll der Anwender dann mit einem anderen Programm interagieren oder soll es nur innerhalb deines Programms zum Kopieren des Icons benutzt werden? |
Es soll dann ausserhalb meines Programmes allgemein verfügbar sein, zB. soll man es mit IcoFX (ein Programm zum Erzeugen und Bearbeiten von Icons) aus der Zwischenablage laden können.
Zuerst möchte ich versuchen, es so hinzubekommen.
Th69 hat folgendes geschrieben : |
Du kannst auch selber ein Clipboard-Format erstellen: |
Ziemlich verwirrend... Welchen Datentyp muss ich denn in
RegisterClipboardFormat angeben?
Mit
Clipboard.Assign(aIcon) erhalte ich die Meldung
Zitat: |
Zwischenablage unterstützt keine Symbole. |
Th69 hat folgendes geschrieben : |
Und warum sollte eine transparente Bitmap nicht funktionieren? [...]
Oder wird diese Transparenz dann nicht in die Zwischenablage übernommen? |
Ich habe alles versucht, was mit Transparenz zusammenhängt - erfolglos. Es ist wohl so, dass die Transparenz nicht in die Zwischenablage übernommen wird.
jaenicke - Fr 25.03.22 19:49
galagher hat folgendes geschrieben : |
Es soll dann ausserhalb meines Programmes allgemein verfügbar sein, zB. soll man es mit IcoFX (ein Programm zum Erzeugen und Bearbeiten von Icons) aus der Zwischenablage laden können. |
IcoFX kann nur die Bilddaten eines einzelnen Formats (z.B. 256x256 mit alpha) aus einem Icon in die Zwischenablage kopieren oder daraus laden. Ein ganzes Icon kann es von dort gar nicht laden.
IcoFX verwendet 32-Bit Bitmaps mit Alphakanal. Lazarus kann damit gut umgehen, bei Delphis TBitmap ist der Support etwas... verbesserungswürdig. Deshalb würde ich für Delphi eher Bibliotheken wie
Graphics32 [
https://github.com/graphics32] verwenden.
galagher - Fr 25.03.22 20:20
jaenicke hat folgendes geschrieben : |
IcoFX kann nur die Bilddaten eines einzelnen Formats (z.B. 256x256 mit alpha) aus einem Icon in die Zwischenablage kopieren oder daraus laden. Ein ganzes Icon kann es von dort gar nicht laden. |
Ich weiss, was du meinst - stimmt, ja.
Wenn das also nicht einfach mit Boardmitteln geht, dann belasse ich es erstmal so, wie es ist. Alternativ kann ich ja das Icon als Datei speichern.
Ich nehme mit Erstaunen zur Kenntnis, dass die Windows-Zwischenablage das Icon-Format nicht (ohne weiteren Aufwand) unterstützt. :hair:
jaenicke - Sa 26.03.22 10:05
Warum verwendest du denn nicht einfach ein PNG? Das kannst du inkl. Transparenz mit Bordmitteln per Assign in die Zwischenablage packen und das wird von IcoFX auch korrekt transparent verwendet.
Man kann zwar auch ein Bitmap mit Alphakanal z.B. in ein TImage werfen, dann wird das auch transparent dargestellt (wenn man Transparent auf False hat), aber das Assign für die Zwischenablage kann das offenbar nicht.
Aber wie geschrieben:
Mit einem PNG klappt es mit IcoFX und anderen problemlos.
galagher - So 27.03.22 20:28
jaenicke hat folgendes geschrieben : |
Warum verwendest du denn nicht einfach ein PNG? |
Weil die Quelle ein Icon ist! Ich müsste also zunächst einen Weg finden, das Icon in ein PNG zu konvertieren, da bin ich gerade dabei, aber noch ohne Erfolg.
jaenicke - Mo 28.03.22 09:16
Ich kenne leider keine sinnvolle Variante ein Icon mit Delphi zu öffnen oder zu editieren. TIcon kann das nur sehr rudimentär. Ich habe danach aber auch noch nie gesucht.
galagher - Mo 28.03.22 17:58
jaenicke hat folgendes geschrieben : |
Ich kenne leider keine sinnvolle Variante ein Icon mit Delphi zu öffnen oder zu editieren. TIcon kann das nur sehr rudimentär. Ich habe danach aber auch noch nie gesucht. |
Ich habe danach gesucht und das hier gefunden:
https://torry.net/pages.php?id=84, siehe dort TIconDialog, das öffnet den "Anderes Symbol"-Dialog von Windows. Mit etwas Umbau des Codes funktioniert die Komponente auch mit Delphi 10.3.
Diese Icons möchte ich - wie gesagt - in die Zwischanablage kopieren.
jaenicke - Mo 28.03.22 20:35
Aber das ist eben nicht so einfach. Denn der Dialog wählt ja nur das Icon aus, aber du brauchst danach ja noch die Auswahl innerhalb der Icon-Datei welches Format du haben möchtest.
Wäre es da nicht einfacher das Icon schlicht komplett an IcoFX zu übergeben? Dort hast du diese Auswahl, kannst kopieren und einfügen, automatisch resizen für neue Formate, ...
galagher - Mo 28.03.22 20:50
Ich arbeite unter anderem mit einer TImageList und einem TJvImageListViewer, um das Symbol darzustellen. Der Dialog wählt es natürlich lediglich aus, aber ich kann es "separieren" und weiterverarbeiten, zB. auch in ein Bitmap konvertieren.
jaenicke hat folgendes geschrieben : |
aber du brauchst danach ja noch die Auswahl innerhalb der Icon-Datei welches Format du haben möchtest. |
Kein spezielles Format, einfach so, wie es ist!
jaenicke hat folgendes geschrieben : |
Wäre es da nicht einfacher das Icon schlicht komplett an IcoFX zu übergeben? |
Ich möchte es nun einmal in der Zwischenablage haben. Wenn das aber nicht geht, und danach sieht's aus, kann ich es immer noch als Datei speichern und mit IcoFX aufrufen, und/oder es als Bitmap in die Zwischenablage stellen.
jaenicke - Mo 28.03.22 21:21
galagher hat folgendes geschrieben : |
Kein spezielles Format, einfach so, wie es ist! |
So wie es ist heißt bei Icons in der Regel, dass es sich um mehrere Bilder in einer Datei handelt. Das versteht IcoFX aber nur als .ico Datei.
Oder kann der Dialog auch ein bestimmtes Format auswählen?
Ohne eine Bibliothek, mit der du Icons richtig öffnen kannst (nicht nur die Pseudo-Variante mit TIcon), wird das nicht klappen.
Jedenfalls bliebe was die Zwischenablage angeht wohl nur die Daten selbst inkl. Alphakanal zur Verfügung zu stellen. Denn wenn ich den Quelltext richtig deute, kann TBitmap zwar den Alphakanal (du könntest vielleicht die entsprechenden Funktionen verwenden), aber beim Kopieren in die Zwischenablage wird dieser nicht verwendet.
galagher - Di 29.03.22 16:29
jaenicke hat folgendes geschrieben : |
So wie es ist heißt bei Icons in der Regel, dass es sich um mehrere Bilder in einer Datei handelt. Das versteht IcoFX aber nur als .ico Datei.
Oder kann der Dialog auch ein bestimmtes Format auswählen? |
Kann er nicht, es ist der ganz normale "Anderes Symbol"-Dialog. Mit "So wie es ist" meinte ich die ausgewählte Symbol-Grafik, nur diese eine! Und diese eine Grafik will ich als Symbol in die Zwischenablage kopieren, was mit
Assign aber nicht klappt.
jaenicke hat folgendes geschrieben : |
aber beim Kopieren in die Zwischenablage wird dieser nicht verwendet. |
Ja, ist wohl so. Ist aber nicht weiter schlimm, denn die ausgewählte Symbol-Grafik kann man ja immer noch als .ico-Datei speichern und mit IcoFX laden etc.
Th69 - Di 29.03.22 17:54
Du scheinst nicht zu verstehen, was
jaenicke [
https://entwickler-ecke.de/user_jaenicke.html] dir geschrieben hat. Beim ICO-Format handelt es sich um ein Container-Format, d.h. es kann verschiedene Icons unterschiedlicher Größe (z.B. 16, 32, 64, ...) beinhalten - es gibt also
nicht "das eine Symbol".
Und du hast immer noch nicht genau beschrieben, was bei
Clipboard.Assign(aIcon) nicht funktioniert!
galagher - Di 29.03.22 20:16
Th69 hat folgendes geschrieben : |
Du scheinst nicht zu verstehen, was jaenicke [https://entwickler-ecke.de/user_jaenicke.html] dir geschrieben hat. Beim ICO-Format handelt es sich um ein Container-Format, d.h. es kann verschiedene Icons unterschiedlicher Größe (z.B. 16, 32, 64, ...) beinhalten - es gibt also nicht "das eine Symbol". |
1 Symbol erhalte ich mit dem "Anderes Symbol"-Dialog... Da erhalte ich
1 Icon, genau 1 Grafik. Diese kann man als .ico-Datei speichern, aber leider nicht so einfach in die Zwischanablage kopieren. Es geht mir nicht um ein Container-Format; ich weiss, dass Icons mehrere Größen enthalten können (aber dies nicht müssen). Und um diese 1 Grafik (32x32) aus dem Dialog geht es mir.
Th69 hat folgendes geschrieben : |
Und du hast immer noch nicht genau beschrieben, was bei Clipboard.Assign(aIcon) nicht funktioniert! |
Doch, das habe ich bereits beschrieben:
galagher hat folgendes geschrieben : |
Mit Clipboard.Assign(aIcon) erhalte ich die Meldung |
Zitat: |
Zwischenablage unterstützt keine Symbole. |
jaenicke - Di 29.03.22 20:52
TIcon.SaveToClipboardFormat löst eine Exception aus, weil dies nicht unterstützt wird. Das ist schon so.
Interessant an der Sache:
Wenn man mit IcoFX eine transparente Grafik kopiert, kann man sie dort auch transparent wieder einfügen. In Zeichenprogrammen wird sie aber nicht transparent eingefügt.
Letztlich lässt sich das dann nur klären, indem man die Daten aus der Zwischenablage genau analysiert.
Moderiert von Th69: Delphi-Tags hinzugefügt
galagher - Di 29.03.22 21:05
jaenicke hat folgendes geschrieben : |
Letztlich lässt sich das dann nur klären, indem man die Daten aus der Zwischenablage genau analysiert. |
Dann lasse ich das, keine Ahnung, wie ich das machen soll.
Th69 - Di 29.03.22 21:18
Und genau dafür habe ich dir ja das FreeClipboardViewer-Tool empfohlen (und die Daten kann man dann in eine Datei speichern und diese dann analysieren).
PS: Sorry, die Fehlermeldung hatte ich überlesen.
galagher - Mi 30.03.22 17:17
Th69 hat folgendes geschrieben : |
Und genau dafür habe ich dir ja das FreeClipboardViewer-Tool empfohlen (und die Daten kann man dann in eine Datei speichern und diese dann analysieren). |
Nach dem Kopieren einer Icon-Grafik mit IcoFX zeigt FreeClipboardViewer den Inhalt der Zwischenablage als Bitmap an. Man kann das als Datei speichern, aber was nützt mir das dann?
Wenn es ein Bitmap ist, muss es einen Weg geben, es transparent in die Zwischenablage zu bringen, denn IcoFX kann das ja auch. Es ist mir aber nicht gelungen, die Transparenz beim Umwandeln vom Icon zum Bitmap zu erhalten.
Th69 - Mi 30.03.22 17:28
Anhand der Bitmap kann man ja rausfinden, ob und wie sie als transparent gespeichert ist (es kann natürlich sein, daß IcoFX hier irgendwas spezielles benutzt).
Hänge doch mal eine von IcoFX (aus Symbol erzeugte) transparente Bitmap sowie eine von dir erzeugte Bitmap hier an.
galagher - Mi 30.03.22 17:54
Th69 hat folgendes geschrieben : |
Hänge doch mal eine von IcoFX (aus Symbol erzeugte) transparente Bitmap sowie eine von dir erzeugte Bitmap hier an. |
Ok, hier:
jaenicke - Mi 30.03.22 18:11
Ich kenne mich mit den Interna nicht so genau aus. Für mich sieht es so aus als ob der Schritt der Ausmultiplikation des Alphakanals fehlt, der im Quelltext vorhanden ist, aber bei der Zwischenablage nicht verwendet wird.
Th69 - Do 31.03.22 10:50
Das erste was mir beim Vergleich beider Dateien mit WinMerge auffällt, ist, daß sich die internen Werte (fast immer) um jeweils 1 unterscheiden (s. Anhang).
Das erklärt aber wohl noch nicht die fehlende Transparenz, macht es aber schwerer diese zu vergleichen.
Ich muß jetzt gleich erst einmal weg, aber heute nachmittag versuche ich mehr zu analysieren.
Sinspin - Do 31.03.22 11:36
galagher hat folgendes geschrieben : |
Wenn es ein Bitmap ist, muss es einen Weg geben, es transparent in die Zwischenablage zu bringen, denn IcoFX kann das ja auch. Es ist mir aber nicht gelungen, die Transparenz beim Umwandeln vom Icon zum Bitmap zu erhalten. |
Ich würde mal auf das PixelFormat tippen dass dabei eine Rolle spielt.
Ich verwende dafür pf32Bit (RGBA). Aber MS hat da in den letzten Jahren soviel getan. In MSDN stehen massen Sachen die mir neu sind. Vlt gibt es also mittlweile ganz andere PixelFormate die das auch können.
Th69 - Do 31.03.22 12:56
Als Pixelformat ist bei beiden (s. an Position 001C in meinem angehängten Bild) der Wert 0x18 = 24 eingetragen - und auch die Dateigrößen sind gleich.
Es ist also kein Alphakanal eingetragen und auch ImageView zeigt beide Bitmaps mit weißem Hintergrund (also
nicht transparent) an.
Dann kann es also nur irgendeine Spezialbehandlung von IcoFX sein, wenn das aus der Zwischenablage kopierte Bitmap (= Icon) transparent angezeigt wird (vllt. merkt es sich intern noch, daß es transparent war).
Wird es denn auch transparent angezeigt, wenn man es aus einer anderen IcoFX-Anwendung (d.h. 2 Instanzen öffnen) kopiert?
Probieren müßte man wirklich mal den Vorschlag von Sinspin und eine 32bit (ARGB) Bitmap in die Zwischenanlage kopieren (mit A = 0 bei der Hintergrundfarbe und 0xFF sonst).
Edit: Hier noch der Link zum Bitmap-Format:
Windows Bitmap [
https://de.wikipedia.org/wiki/Windows_Bitmap]
Sinspin - Do 31.03.22 18:16
Es gibt noch etwas Magie aus alten Zeiten für Bitmaps mit Transparenz. Die Farbe des Pixels, links oben, wird als Transparente Farbe verwendet.
Wenn ich mich recht erinnere gab es aber kein Flag in der Bitmap Datei um transparent oder nicht zu speichern.
Deswegen kam als weitere Magie dazu das man sich entschieden hat reines Magenta (RGB=255,0,255) per default durchsichtig zu zeichenen wenn auch der Pixel links oben Magenta war.
Das ist von ganz ganz früher, Win 3.0/Win 3.1. Ich hatte mir zu der Zeit mal einen Bitmap Viewer für 256 Farben unter DOS (800x600 Pixel :shock: ) geschrieben.
Keine Ahnung ob sich da Heute noch jemand dran hält.
galagher - Do 31.03.22 18:21
Th69 hat folgendes geschrieben : |
Dann kann es also nur irgendeine Spezialbehandlung von IcoFX sein, wenn das aus der Zwischenablage kopierte Bitmap (= Icon) transparent angezeigt wird (vllt. merkt es sich intern noch, daß es transparent war). |
Scheint so, denn:
Th69 hat folgendes geschrieben : |
Wird es denn auch transparent angezeigt, wenn man es aus einer anderen IcoFX-Anwendung (d.h. 2 Instanzen öffnen) kopiert? |
Nein, die Transparenz geht beim Einfügen verloren. Das passiert, wie erwartet, auch, wenn ich eine Icon-Grafik mit IcoFX kopiere, IcoFX beende und dann neu starte. Innerhalb ein und der selben Instanz kann ich jedoch mit Transparenz einfügen.
Sinspin hat folgendes geschrieben : |
Deswegen kam als weitere Magie dazu das man sich entschieden hat reines Magenta (RGB=255,0,255) per default durchsichtig zu zeichenen wenn auch der Pixel links oben Magenta war. [...]
Keine Ahnung ob sich da Heute noch jemand dran hält. |
Ja, ich halte mich da noch dran, wenn ich 16x16 oder 32x32 Bitmaps entwerfe, obwohl die Farbe heutzutage keine Rolle mehr spielt.
jaenicke - Fr 01.04.22 07:49
galagher hat folgendes geschrieben : |
Nein, die Transparenz geht beim Einfügen verloren. Das passiert, wie erwartet, auch, wenn ich eine Icon-Grafik mit IcoFX kopiere, IcoFX beende und dann neu starte. Innerhalb ein und der selben Instanz kann ich jedoch mit Transparenz einfügen. |
Wie wäre es eigentlich mit einem besseren Icon-Editor, der das besser macht?
Der hier hat z.B. keine Probleme mit dem Einfügen von transparenten Bildern:
https://www.computerbild.de/download/Greenfish-Icon-Editor-Pro-2140317.html
(Link zur Computerbild, weil auf anderen Seiten Virenwarnungen kommen)
Man kann den aber auch einfach mit Lazarus selbst erstellen:
https://github.com/JonathanILevi/gfie-src
galagher - Fr 01.04.22 17:50
Danke für den Tipp! Das ändert aber nichts daran, dass ich weder transparente noch sonstige Icons
mit meinem Programm in die Zwischenblage kopieren kann, sondern "nur" nicht-transparente Bitmaps!
Ok, das ist dann eben so. Ist ja auch nicht wirklich ein Problem! :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!