Как скопировать изображение в буфер обмена, вставить в другое приложение?
Я хочу установить буфер обмена в файл abc.jpg
в формате изображения, чтобы я мог вставить его в gpaint
и т.д. приложения X11, можно?
Я включил функцию снимка экрана в Compiz
Диспетчер Windows, и мне нужно дать командную строку, чтобы скопировать файл снимка изображения в буфер обмена.
8 ответов
scrot + xclip
Ты можешь использовать scrot
с xclip
сделать скриншот и скопировать его в буфер обмена.
scrot '/tmp/%F_%T_$wx$h.png' -e 'xclip -selection clipboard -target image/png -i $f'
Он захватит весь ваш экран и скопирует изображение в буфер обмена. Если вы хотите захватить текущее окно, используйте -u
флаг. Для выбора конкретной области, вы можете добавить -s
флаг. Увидеть $ man scrot
для большего количества вариантов.
Он сохранит ваш скриншот в /tmp
каталог. Вы можете изменить этот каталог там, где вы хотите, чтобы он хранился. Файлы из /tmp
Каталог обычно удаляется после каждой перезагрузки. Если вы хотите немедленно удалить сохраненный файл, сделайте что-то вроде:
scrot -w '/tmp/%F_%T_$wx$h.png' -e 'xclip -selection clipboard -target image/png -i $f && rm $f'
Как я читал в других комментариях, вам это нужно для копирования скриншота в буфер обмена. Надеюсь, это ответит на ваш вопрос.
Если вам просто нужно скопировать уже существующий файл изображения в буфер обмена:
cat 2018-06-16-224938_670x730_scrot.png | xclip -selection clipboard -target image/png -i
Вы можете установить сочетания клавиш / сочетания клавиш в соответствии с текущей рабочей средой / оконным менеджером.
бонус
Объяснение /tmp/%F_%T_$wx$h.png
:
Он используется в качестве имени файла. Они называются format specifiers
, Они бывают двух типов: начиная с %
или же $
,
%F Эквивалент%Y-%m-%d (формат даты ISO 8601). % T Время в 24-часовой записи (%H:%M:%S).
%F_%T_
напечатает что-то вроде: 2018-06-17_02:52:19_
т.е. ваша текущая временная метка. Вы можете настроить формат в соответствии с вашими требованиями. Увидеть $ man strftime
для получения дополнительной помощи.
$wx$h
являются частью внутренних спецификаторов Scrot.
ширина изображения $ h высота изображения
Таким образом, окончательное имя файла будет выглядеть примерно так 2018-06-17_02:52:19_1365x384.png
,
Сначала установите python и pygtk
sudo apt-get install python pygtk
Теперь сохраните следующий скрипт как imgclip.py (см. https://stackoverflow.com/questions/3571855/pasting-image-to-clipboard-in-python-in-linux)
#! /usr/bin/python
import pygtk
pygtk.require('2.0')
import gtk
import os
import sys
def copy_image(f):
assert os.path.exists(f), "file does not exist"
image = gtk.gdk.pixbuf_new_from_file(f)
clipboard = gtk.clipboard_get()
clipboard.set_image(image)
clipboard.store()
copy_image(sys.argv[1]);
Чтобы использовать это:
python /path/to/imgclip.py filename.png
Примечание: проверено склеивание в gimp и xournal. Примечание: это для рабочего стола gnome (отсюда и gtk). Бьюсь об заклад, есть что-то подобное для KDE
Устанавливать xclip
(убедитесь, что версия 0.12+svn84, потому что 0.12 недостаточно); затем добавьте эту строку в поле в менеджере настроек compiz:
xclip -selection clipboard -target image/png -i
После этого вы сможете вставить его в любое другое приложение x
Проверять, выписываться xclip
, Позволяет перемещать текст или файлы в буфер обмена из командной строки.
РЕДАКТИРОВАТЬ:
В этом посте обсуждаются приложения для создания скриншотов из командной строки: http://www.linux.com/archive/feed/57772 включая scrot
, Это из scrot
справочная страница:
scrot - это утилита для захвата экрана, использующая библиотеку imlib2 для загрузки и сохранить изображения. У мошенника есть несколько вариантов, подробно описанных ниже. Уточнить [файл] в качестве имени файла для сохранения скриншота.
Последний вариант - найти приложение X, которое просто делает снимок экрана при нажатии (без подсказок, диалоговых окон и т. Д.), Назначить его комбинации горячих клавиш и использовать xdotool
смоделировать это нажатие клавиш из командной строки??
Я бы отключил функцию скриншота Compiz, просто зайдите на System
-> Preferences
-> Keyboard Shortcuts
(под Desktop
категория) и привязать Print Screen к Take a Screenshot
Теперь, когда вы нажимаете PrintScreen, снимок экрана будет сделан с возможностью скопировать в буфер обмена или просто сохранить файл.
Решение командной строки
- Чтобы просто скопировать изображение
IMG.png
хранится в$DESTINATION
в виде$DESTINATION/IMG.png
, используйте
xclip -in -selection clipboard -target image/png $DESTINATION/IMG.png
Аналогично для
IMG.jpg
изменить аргумент после
-target
т.е.
xclip -in -selection clipboard -target image/jpg $DESTINATION/IMG.jpg
Если вы делаете снимок экрана с помощью
scrot
и хотите сохранить или скопировать, используйте
# Enter path such as $HOME/Pictures/screenshots/ in $DESTINATION.
$DESTINATION = "/path/to/screenshot/folder/"
scrot "$DESTINATION/%Y-%m-%d-%T.png" &&
{
SSNAME="$(ls -t $DESTINATION |head -n1)";
xclip -in -selection clipboard -target image/png "$DESTINATION/$SSNAME" && echo "Copied to clipboard.";
}
Обратите внимание, что есть
&&
послеscrot
команда.
ls -t
будет перечислять и сортировать по времени.
head -n1
будет фильтровать только первый результат, т.е. последний.xclip -in
скажет xclip, что нужно вводить данные из файла.
Вы также можете дать
xclip
командовать в
scrot
с
-e
вариант.
Проверьте этот скрипт, где я использовал вышеупомянутый фрагмент с
notify-send
(что не имеет большого значения:P).
Обновленный ответ @Mandeep Singh
Вы можете использоватьscrot
иxclip
скопировать изображение прямо в буфер обмена.
В отличие от решения Mandeeps, существует способ скопировать выходные данные непосредственно в буфер обмена, не записывая их на диск.
Пример:
scrot -fs - | xclip -selection clipboard -target image/png -i
Я обычно использую-fs
флаги на scrot.s
позволяя мне захватить собственный прямоугольник иf
зависание экрана, пока я выбираю область.
Одинокий-
сообщает scrot о перенаправлении вывода на стандартный вывод, что позволяет вам направить его непосредственно в xclip, как показано в моем примере.
Объединив этот ответ с https://stackoverflow.com/questions/35500163/bash-script-with-scrot-area-not-working , я сейчас использую следующий скрипт:
#!/bin/sh
set -e
tmpdir=$(mktemp --tmpdir -d scrot-xclip-XXXXXXX)
trap 'rm -rf "${tmpdir}"' EXIT
setxkbmap -option grab:break_actions
xdotool key XF86Ungrab
scrot "$@" "${tmpdir}"/'screenshot-%Y-%m-%d_%H:%M:%S.png' -e \
'exec xclip -quiet -t image/png -selection clipboard -i $f'
echo "Clipboard got overwritten"
Идея состоит в том, чтобы удалить созданный файл после повторного использования буфера обмена (xclip -quiet
блокируется, пока это не произойдет).mktemp
также гарантирует, что ни один другой пользователь не сможет прочитать файл снимка экрана.
Я зацепил это как/home/user/bin/scrot-xclip
в мою конфигурацию i3 :
bindsym Print exec --no-startup-id /home/user/bin/scrot-xclip --select --freeze
bindsym $mod+Print exec --no-startup-id /home/user/bin/scrot-xclip --focused