ฉันจะสร้างภาพหน้าจอของขอบเขตหน้าจอบน Arch Linux ด้วย i3 WM ได้อย่างไร


27

ประมาณหนึ่งเดือนที่ผ่านมาฉันเปลี่ยนจาก Ubuntu 14.04 LTS เป็น Arch และฉันมีความสุขมากกับการตัดสินใจครั้งนี้ อย่างไรก็ตามฉันคิดถึงคุณสมบัติบางอย่างกับ distro ใหม่ของฉันโดยเฉพาะอย่างยิ่งShift+ printscrซึ่งใน Unity ช่วยให้สามารถเลือกพื้นที่หน้าจอได้

ฉันใช้ i3 WM ดังนั้นคำถามของฉันคือฉันจะกำหนดค่าลักษณะการทำงานของ Unity-like screenshot เพื่อให้สามารถ snap พื้นที่หรือหน้าจอของ Windows ด้วยแป้นพิมพ์ลัดหรือบางอย่าง (โดยไม่ต้องขุดลงใน id ของหน้าต่างและคอนโซล)

คำตอบ:


29

คุณสามารถใช้importส่วนหนึ่งของ ImageMagick

จับภาพภูมิภาค

ss.pngนี้จะเปลี่ยนเคอร์เซอร์ของคุณลงในเล็งและเมื่อคุณคลิกและลากไปในรูปแบบกล่องกล่องที่จะถูกบันทึกเป็น

import ss.png

จับภาพหน้าจอทั้งหมด

import -window root ss.png

นอกจากนี้คุณยังสามารถแทนที่คำrootด้วย id หน้าต่างเพื่อจับภาพหน้าต่างที่ระบุ


1
เรียบง่ายสมบูรณ์แบบตามที่ฉันต้องการ - และฉันไม่ต้องดาวน์โหลดโปรแกรมอื่น
Darren Haynes

1
นอกจากนี้คุณยังสามารถคลิกที่หน้าต่างหลังจากนั้นimport ss.pngเพื่อจับภาพหน้าจอของหน้าต่างนั้น
John Gowers

9

เป็นเวลานานแล้วที่ฉันได้ถามคำถามนี้และดูเหมือนว่ามีประโยชน์สำหรับผู้ใช้บางคน ดังนั้นฉันจึงจัดทำสคริปต์ของตัวเองสำหรับการทำภาพหน้าจอxclipและimagemagickแพ็คเกจ

ก่อนอื่นติดตั้งการอ้างอิงดังกล่าวข้างต้น จากนั้นคุณสามารถทำสิ่งที่คุณต้องการด้วยสคริปต์ด้านล่าง สนับสนุนการสร้างภาพหน้าจอของทั้งหน้าจอหรือภูมิภาคของหน้าจอและคัดลอกภาพหน้าจอไปยังคลิปบอร์ดโดยอัตโนมัติเพื่อให้คุณสามารถวางได้ทุกที่ (เบราว์เซอร์ ei หรือผู้ส่งสารโทรเลข)

สองสามไม่ยากที่จะเกิดขึ้นกับแฮ็กจะเพิ่มการสนับสนุนสำหรับการจับภาพหน้าต่างที่เฉพาะเจาะจงและสลับส่วนการคัดลอก

#!/usr/bin/env bash

# screenshots stuff
# TODO: docs

function help_and_exit {
    if [ -n "${1}" ]; then
        echo "${1}"
    fi
    cat <<-EOF
    Usage: scregcp [-h|-s] [<screenshots_base_folder>]

    Take screenshot of a whole screen or a specified region,
    save it to a specified folder (current folder is default)
    and copy it to a clipboard. 

       -h   - print help and exit
       -s   - take a screenshot of a screen region
EOF
    if [ -n "${1}" ]; then
        exit 1
    fi
    exit 0
}

if [ "${1}" == '-h'  ]; then
    help_and_exit
elif [ "${1:0:1}" == '-' ]; then
    if [ "${1}" != '-s' ]; then
        help_and_exit "error: unknown option ${1}"  
    fi
    base_folder="${2}"
else
    base_folder="${1}"
    params="-window root"
fi  

file_path=${base_folder}$( date '+%Y-%m-%d_%H-%M-%S' )_screenshot.png
import ${params} ${file_path}
xclip -selection clipboard -target image/png -i < ${file_path}

และนี่คือทางลัดอ้างอิงของฉันสำหรับการi3wmใช้ประโยชน์จากสคริปต์นี้:

# take a screenshot of a screen region and copy it to a clipboard
bindsym --release Shift+Print exec "scregcp -s /home/ddnomad/pictures/screenshots/"

# take a screenshot of a whole window and copy it to a clipboard
bindsym --release Print exec "scregcp /home/ddnomad/pictures/screenshots/"

6

มีคุณพยายามscrotยูทิลิตี้จับภาพหน้าจอ commandline ง่าย

ref.,: https://faq.i3wm.org/question/202/what-do-you-guys-use-for-printscreen//


ว้าวหลังจาก googling ฉันรู้แล้วว่าสก็อตนั้นมีความสามารถทุกอย่างที่ฉันต้องการ แปลกเกินไปฉันไม่พบมันด้วยตัวเอง ขอบคุณครับ!
ddnomad

คุณยังสามารถใช้ scrot -s เพื่อจับภาพพื้นที่เฉพาะ เรียกใช้คำสั่งแล้วคลิกค้างไว้จากนั้นคลิกที่จุดที่สองมันจะสร้างไฟล์ที่มีวันที่เป็นชื่อไฟล์ในไดเรกทอรีปัจจุบันของคุณ
vimdude

5

ก่อนอื่นให้ติดตั้ง xclip, imagemagick และ jq!

pacman -S imagemagick jq xclip

ฉันมีบรรทัดนี้ในการกำหนดค่า i3 ของฉัน:

bindsym $mod+Print exec \
    import -window $( \
        i3-msg -t get_tree | \
        jq 'recurse(.nodes[]) | select(.focused).window' \
    ) png:- | \
    xclip -selection clipboard -t image/png

สิ่งนี้จะทำให้ภาพหน้าจอของหน้าต่างที่ใช้งานอยู่บนคลิปบอร์ดของคุณเมื่อคุณกด mod (Window / Alt) + Printscreen

i3-msg -t get-tree รับ windows ทั้งหมดจาก i3 เป็น json จากนั้นเราใช้ jq เพื่อรับ id หน้าต่างของหน้าต่างเพ่งความสนใจ เราส่งมันไปยังคำสั่ง imagemagicks นำเข้าและส่งผลให้ xclip ที่จะวางไว้บนคลิปบอร์ด!


2

Flameshotเป็นทางเลือกที่เหมาะสม

bindsym Print       exec flameshot full
bindsym Shift+Print exec flameshot gui

คุณสามารถใช้ตัวเลือก-p /path/to/directoryเพื่อข้ามการเลือกไดเรกทอรีบันทึก


1

ตัวเลือกที่ง่ายมากถ้าคุณติดตั้งไว้หรือไม่สนใจว่าจะใช้xfce4-screenshooterและ i3 config จะเป็น:

bindsym Print exec --no-startup-id xfce4-screenshooter

Caveat: แม้ว่าจะค่อนข้างเบา แต่ก็มีบางอย่างที่ต้องพึ่งพาหากคุณไม่ได้ใช้โปรแกรม xfce4 อื่น ๆ


1

ใช้Maim มันได้รับการพัฒนามากขึ้นอย่างแข็งขันและขึ้นอยู่กับเลอะซึ่งเป็นวิธีที่ดีกว่า

อย่าใช้สกอต กล่องการเลือกของมันจะทำลายและทิ้งการแสดงผลไว้ในสกรีนช็อต


(1)“ slop” คืออะไร? (2) มันดีกว่าอะไรจริง ๆ (3) ทำไม
G-Man กล่าวว่า 'Reinstate Monica'

1. เลือกการดำเนินการใช้เพื่อเลือกพื้นที่หน้าต่าง [ github.com/naelstrof/slop] 2. ดีกว่าการขีดข่วนเพราะมันไม่ผ่านการเลือกกล่องที่เสียหาย (ลอง scrot มากกว่า htop) 3. idk
Hritik

1

ฉันชอบชัตเตอร์สำหรับความสามารถหลังการประมวลผล (วงกลมสีแดงที่วาดด้วยมือ!) และตัวเลือกการกำหนดค่าที่ครอบคลุม

คุณสามารถคว้าพื้นที่หน้าจอได้โดยเรียกใช้

shutter --select

คุณสามารถตั้งค่าการเชื่อมโยงคีย์ใน.config/i3/configลักษณะดังนี้:

bindsym Print         exec shutter --full
bindsym Shift+Print   exec shutter --select

ใช้เวลาในการโหลดครั้งที่สองดังนั้นคุณอาจต้องการเริ่มระบบอัตโนมัติในพื้นหลัง:

exec shutter --min_at_startup

ชัตเตอร์จะสามารถเข้าถึงได้ผ่านไอคอนถาดแล้วให้ตัวเลือกที่มีประโยชน์มากมายนอกเหนือจากด้านบน


ไม่สามารถติดตั้ง Shutter ได้อย่างง่ายดายบน Ubuntu 18.04 ในเวลานี้ (เครื่องมือแก้ไขขึ้นอยู่กับไลบรารีที่ใช้งานไม่ได้ PPA แบบกำหนดเองไม่ทันสมัย) เสียใจ
Raphael

1

สคริปต์ perl6 นี้ใช้รูทพื้นที่หน้าต่างหรือหน่วงเวลา ScreenShots โดยใช้การนำเข้าและบันทึกไว้ในไฟล์ $ และในคลิปบอร์ด

#!/usr/bin/env perl6
use v6;

sub print_window(Str $file) {
  qx{xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"} ~~ /(0x\S*)/;
  run <import -window>, $0, $file;
}

sub MAIN( Str $option where $option ∈ <root area window delay> ) {
  my $today = DateTime.now( 
    formatter => { 
      sprintf "%04d_%02d_%02d_%02d-%02d-%02d", .year, .month, .day, .hour, .minute, .second 
    } 
  );
  my $file  = "$*HOME/Dades/Imatges/ScreenShots/$today.png";

  given $option {
    when 'root'   { run <import -window root>, $file }
    when 'area'   { run 'import', $file              }
    when 'window' { print_window($file)              }
    when 'delay'  { sleep 10; print_window($file)    }
  }
  run <xclip -selection clipboard -target image/png -i>, $file;
  run <xmessage -nearmouse -timeout 3>, "Screenshot in clipboard, and saved in $today.png";
}

นี่คือการเชื่อมโยงที่สำคัญใน i3 เพื่อเรียกใช้สคริปต์:

bindsym $mod+Print exec Print_Screen root 
bindsym --release $mod+Shift+Print exec Print_Screen area
bindsym $mod+Mod1+Print exec Print_Screen delay
bindsym $mod+Control+Print exec Print_Screen window
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.