General overview
The goal is pretty simple :
- copy image in the clipboard
- using ideally no graphical library related solution, or if it’s necessary Qt
- Working on Unices or ideally a no OS-related solution
- With just python tools, no subprocess to call an external no python command
Working tries
I was able to do it with several ways but none fulfilled these four constraints.
The Gtk solution
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GdkPixbuf
from PIL import Image
def copy_image_to_clipboard(image_path):
# Chargin image with pillow
image = Image.open(image_path)
rgba_image = image.convert("RGBA")
data = rgba_image.tobytes()
# Creating a GTK compatible pixbuf
pixbuf = GdkPixbuf.Pixbuf.new_from_data(
data,
GdkPixbuf.Colorspace.RGB,
True, # has_alpha
8, # bits_per_sample
image.width,
image.height,
image.width * 4
)
# Getting the path
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.set_image(pixbuf)
clipboard.store() # S'assurer que l'image reste après la fin du script
# Example
copy_image_to_clipboard("image.png")
Gtk.main()
This one works, but it doesn’t satisfied the 2d constraint cause it use Gtk tools and not Qt or a non-graphical library.
The xclip
with subprocess solution
import subprocess
def copy_image_to_clipboard(image_path):
subprocess.run(["xclip", "-selection", "clipboard", "-t", "image/png", "-i", image_path])
print(f"✅ Image copiée dans le presse-papier : {image_path}")
copy_image_to_clipboard("/tmp/image.png")
This other one also work but depend on xclip
command and it’s OS related, so it infringe
the 3d and 4th constraints
The unworking Qt trie
import sys
from PyQt6 import QtCore, QtGui
from PIL import Image
def copy_image_to_clipboard(image_path):
# Check if the image exists
if not QtCore.QFile.exists(image_path):
print(f"Error: the file {image_path} was not found.")
return
# Create the Qt application if it doesn't already exist
if QtGui.QGuiApplication.instance() is None:
app = QtGui.QGuiApplication(sys.argv)
# Load the image with PIL and convert it to QImage
image = Image.open(image_path).convert("RGBA")
qimage = QtGui.QImage(image.tobytes(), image.width, image.height, QtGui.QImage.Format.Format_RGBA8888)
# Check if the conversion was successful
if qimage.isNull():
print("Error: the conversion of the image to QImage failed.")
return
# Copy the image to the clipboard
clipboard = QtGui.QGuiApplication.clipboard()
clipboard.setImage(qimage)
print(f"✅ Image copied to clipboard: {image_path}")
# Example usage
copy_image_to_clipboard("/tmp/image.png") # Replace with your image path
This one is full Qt (2), it seams to be not OS related (3), use only python tools (4), but it doesn’t copy anything (The 1st constraint) so, it’s useless.
The question
How to copy image into clipboard using just Qt (and also other library for image processing or dedicated to clipboard management but not a full graphical library like Gtk) ?