Как скопировать изображение в буфер обмена, вставить в другое приложение?

Я хочу установить буфер обмена в файл 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, снимок экрана будет сделан с возможностью скопировать в буфер обмена или просто сохранить файл.

введите описание здесь

Решение командной строки

  1. Чтобы просто скопировать изображение 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
Другие вопросы по тегам