How to save the image in clipboard in variable and restore it to clipboard later?
-
I'm having a similar issue to the original poster (Qt5 for Python), and I think I can clarify what they're trying to say.
So when copying from the Clipboard, many programs add additional MimeType metadata. For example, GIMP's XCF when copying images will include XCF metadata, plus several different variations of the image's binary data.
For example:
['TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TARGETS', 'image/x-xcf', 'image/png', 'image/bmp', 'image/x-bmp', 'image/x-MS-bmp', 'image/x-icon', 'image/x-ico', 'image/x-win-bitmap', 'image/vnd.microsoft.icon', 'application/ico', 'image/ico', 'image/icon', 'text/ico', 'image/tiff', 'image/jpeg', 'application/x-qt-image']
However, Qt does not allow one to faithfully recreate said mimeType metadata. If one tries to use 'setImage', for example, Qt forces their proprietary format:
application/x-qt-image
This is not a valid image mimetype for image data (which must start with "image/" and should be a common recognised format, E.G. png), which means applications like GIMP will not recognise the image data as valid.
There's little point using Qt-specific tags in a global clipboard meant to be used/referenced by external programs.
Trying to use the Qt5 ecosystem, it feels very much like one is coerced into using 'Q-types' even if they might not be suitable nor desirable for third party application specific purposes.
Even if one tries to set a custom mimetype via 'setMimeData', and specifies explicitly what the raw binary data is (E.G. 'image/png'), third party applications still do not recognise it as valid PNG data - even if it is a verbatim cloned copy of the raw image/png data straight from Qt!
Even if this was to work, any subsequent calls to 'setMimeData' overwrites the last set format (so if I try to also set 'image/jpeg' trying to recreate XCF's metadata, it will just replace 'image/png'). There's presently no way to set multiple types of mimetype metadata at once.
@SilentSight said in How to save the image in clipboard in variable and restore it to clipboard later?:
However, Qt does not allow one to faithfully recreate said mimeType metadata.
My test program begs to differ:
#include <QApplication> #include <QCryptographicHash> #include <QClipboard> #include <QMimeData> #include <QDebug> void dumpCB(const QMimeData *m) { foreach (const QString &format, m->formats() ) { const QByteArray data = m->data(format); qDebug() << format << data.size() << "bytes" << QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex(); } } int main(int argc, char *argv[]) { QApplication a(argc, argv); QClipboard *clipboard = QGuiApplication::clipboard(); // Dump current clipboard content qDebug() << "Starting clipboard content:"; dumpCB(clipboard->mimeData()); // Save current clipboard content QMimeData *mdSave = new QMimeData(); const QMimeData *m = clipboard->mimeData(); foreach (const QString &format, m->formats() ) { mdSave->setData(format, m->data(format)); } qDebug() << "Saved clipboard content:"; dumpCB(mdSave); // Clear the clipboard clipboard->clear(); // Dump current clipboard content qDebug() << "Cleared clipboard content:"; dumpCB(clipboard->mimeData()); // Restore the clipboard clipboard->setMimeData(mdSave); // Dump current clipboard content qDebug() << "Restored clipboard content:"; dumpCB(clipboard->mimeData()); return 0; }
Output when starting clipboard contains small image copied from Firefox:
Starting clipboard content: "TIMESTAMP" 4 bytes "f11b876fb69d51c23c88f4dc549d7b54" "TARGETS" 84 bytes "97eb07e16cdb61c9a15427e618004c07" "MULTIPLE" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "SAVE_TARGETS" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "text/html" 343 bytes "430ff9e5ce38b44605b33f421df1d84a" "text/_moz_htmlinfo" 6 bytes "00f8c2ad49f4f1df4476b93a9470d69d" "text/_moz_htmlcontext" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "image/png" 27304 bytes "7eed20e7396dc51d57ddd421168733b9" "image/jpeg" 3578 bytes "c80bcacb87f3c25dae2aa357050ed508" "image/bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-MS-bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/x-ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/x-win-bitmap" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/vnd.microsoft.icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "application/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "text/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/tiff" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "application/x-qt-image" 27304 bytes "7eed20e7396dc51d57ddd421168733b9" Saved clipboard content: "TIMESTAMP" 4 bytes "f11b876fb69d51c23c88f4dc549d7b54" "TARGETS" 84 bytes "97eb07e16cdb61c9a15427e618004c07" "MULTIPLE" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "SAVE_TARGETS" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "text/html" 343 bytes "430ff9e5ce38b44605b33f421df1d84a" "text/_moz_htmlinfo" 6 bytes "00f8c2ad49f4f1df4476b93a9470d69d" "text/_moz_htmlcontext" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "image/png" 27304 bytes "7eed20e7396dc51d57ddd421168733b9" "image/jpeg" 3578 bytes "c80bcacb87f3c25dae2aa357050ed508" "image/bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-MS-bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/x-ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/x-win-bitmap" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/vnd.microsoft.icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "application/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "text/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/tiff" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "application/x-qt-image" 27304 bytes "7eed20e7396dc51d57ddd421168733b9" Cleared clipboard content: Restored clipboard content: "TIMESTAMP" 4 bytes "f11b876fb69d51c23c88f4dc549d7b54" "TARGETS" 84 bytes "97eb07e16cdb61c9a15427e618004c07" "MULTIPLE" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "SAVE_TARGETS" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "text/html" 343 bytes "430ff9e5ce38b44605b33f421df1d84a" "text/_moz_htmlinfo" 6 bytes "00f8c2ad49f4f1df4476b93a9470d69d" "text/_moz_htmlcontext" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "image/png" 27304 bytes "7eed20e7396dc51d57ddd421168733b9" "image/jpeg" 3578 bytes "c80bcacb87f3c25dae2aa357050ed508" "image/bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-MS-bmp" 49206 bytes "d5a381d0c4f2d730430e88ce8c58920d" "image/x-icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/x-ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/x-win-bitmap" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/vnd.microsoft.icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "application/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/icon" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "text/ico" 67646 bytes "b6bf4a8d2474fc089606659729f96bb0" "image/tiff" 0 bytes "d41d8cd98f00b204e9800998ecf8427e" "application/x-qt-image" 27304 bytes "7eed20e7396dc51d57ddd421168733b9"
You will note that Qt presents an "image/png" format and an "application/x-qt-image" format (even though the source is not a Qt executable) and that they are identical data:
"image/png" 27304 bytes "7eed20e7396dc51d57ddd421168733b9" "application/x-qt-image" 27304 bytes "7eed20e7396dc51d57ddd421168733b9"
This is virtual mapping and I assume that internally they are the same buffer. You will see that Firefox (not Qt) has similar shared arrangement for other "non-standard" types e.g., "image/bmp", "image/x-bmp", and "image/x-MS-bmp", and many more for various icon forms.
The save/restore approach in the example is possibly not efficient because it may cause several copies of identical data where the source was shared. Without inspecting the Qt source I cannot say if there is a better way.
There's presently no way to set multiple types of mimetype metadata at once.
Sure there is. Put several different types into a QMimeData and call QClipboard::setMimeData().
I do, however, see that the restored clipboard is not recognised by some other programs. Gimp does not but Libreoffice Draw does. I do not have the time to debug that.