0

I'm using this script from HN* to select regions on the screen and copy their text, I took out the line with mogrify. It uses spectacle but it takes a moment before opening the UI, is it possible and would it be faster if Spectacle stayed open in the background? The slurp CLI starts instantly for me for selecting regions, I looked for command line screenshot tools to maybe use with it or has its own region support but didn't find any. Neither maim scrot and grim don't work on Plasma Wayland. I installed the ksnip flatpak but the option for rectangular regions doesn't show for me.

* The script:

  #!/bin/bash 
  # Dependencies: tesseract-ocr imagemagick 
  # on gnome: gnome-screenshot 
  # on kde: spectacle
  # on x11: xsel
  # on wayland: wl-clipboard

die(){ notify-send "$1" exit 1 } cleanup(){ [[ -n $1 ]] && rm -r "$1" }

SCR_IMG=$(mktemp -d) || die "failed to take screenshot"

shellcheck disable=SC2064

trap "cleanup '$SCR_IMG'" EXIT

#notify-send "Select the area of the text" if which "spectacle" &> /dev/null then spectacle -n -b -r -o "$SCR_IMG/scr.png" || die "failed to take screenshot" else gnome-screenshot -a -f "$SCR_IMG/scr.png" || die "failed to take screenshot" fi

increase image quality with option -q from default 75 to 100

mogrify -modulate 100,0 -resize 400% "$SCR_IMG/scr.png" || die "failed to convert image" #should increase detection rate

tesseract "$SCR_IMG/scr.png" "$SCR_IMG/scr" &> /dev/null || die "failed to extract text" if [ "$XDG_SESSION_TYPE" == "wayland" ] then wl-copy < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard" else # xsel -b -i < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard" xclip -selection clipboard -i < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard"
fi

Notify the user what was copied but truncate the text to 100 characters

notify-send "Text extracted from image" "$(head -c 100 "$SCR_IMG/scr.txt")" || die "failed to send notification" exit #!/bin/bash

Dependencies: tesseract-ocr imagemagick

on gnome: gnome-screenshot

on kde: spectacle

on x11: xsel

on wayland: wl-clipboard

die(){ notify-send "$1" exit 1 } cleanup(){ [[ -n $1 ]] && rm -r "$1" }

SCR_IMG=$(mktemp -d) || die "failed to take screenshot"

shellcheck disable=SC2064

trap "cleanup '$SCR_IMG'" EXIT

#notify-send "Select the area of the text" if which "spectacle" &> /dev/null then spectacle -n -b -r -o "$SCR_IMG/scr.png" || die "failed to take screenshot" else gnome-screenshot -a -f "$SCR_IMG/scr.png" || die "failed to take screenshot" fi

increase image quality with option -q from default 75 to 100

mogrify -modulate 100,0 -resize 400% "$SCR_IMG/scr.png" || die "failed to convert image" #should increase detection rate

tesseract "$SCR_IMG/scr.png" "$SCR_IMG/scr" &> /dev/null || die "failed to extract text" if [ "$XDG_SESSION_TYPE" == "wayland" ] then wl-copy < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard" else # xsel -b -i < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard" xclip -selection clipboard -i < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard"
fi

Notify the user what was copied but truncate the text to 100 characters

notify-send "Text extracted from image" "$(head -c 100 "$SCR_IMG/scr.txt")" || die "failed to send notification" exit

1 Answers1

0

I edited the script to take a screenshot asynchronously, get the region with slurp, and use magick to crop it. I also multiply the values from slurp 2x to account for the 200% display scaling I have.

  #!/bin/bash
die(){
notify-send &quot;$1&quot;
exit 1

} cleanup(){ [[ -n $1 ]] && rm -r "$1" } SCR_IMG=$(mktemp -d) || die "failed to take screenshot" trap "cleanup '$SCR_IMG'" EXIT

spectacle -nbo &quot;$SCR_IMG/scr.tiff&quot; &amp;
region=($(slurp -b &quot;#00000000&quot; -c &quot;#80808080&quot; -w 2 -f &quot;%w %h %x %y&quot;))
for i in &quot;${!region[@]}&quot; 
do
    region[i]=$(expr ${region[i]} &quot;*&quot; &quot;2&quot;)
done
magick &quot;$SCR_IMG/scr.tiff&quot; -crop &quot;${region[0]}x${region[1]}+${region[2]}+${region[3]}&quot; &quot;$SCR_IMG/scr.tiff&quot; 

tesseract &quot;$SCR_IMG/scr.tiff&quot; &quot;$SCR_IMG/scr&quot; &amp;&gt; /dev/null || die &quot;failed to extract text&quot;

wl-copy < "$SCR_IMG/scr.txt" || die "failed to copy text to clipboard" notify-send "Text extracted from image" "$(head -c 100 "$SCR_IMG/scr.txt")" || die "failed to send notification" exit