BanditHijo.dev

Memodifikasi Hasil ScreenShot dari Flameshot dengan ImageMagick

Created at: 2020-08-16
Author by: BanditHijo

Requirements

imagemagick 7.x flameshot 0.8.x xclip 0.13 ruby 2.7.x

Sekenario Masalah

Beberapa waktu yang lalu, saya menulis tentang “Membuat Hasil ScreenShot pada GNU/Linux seperti Milik macOS”.

Pada artikel tersebut, script dijalankan setelah gambar hasil screenshot jadi.

Namun, bagaimana apabila screenshot yang dihasilkan berasal dari flameshot?

Kalau membuat sequence command seperti ini,

$ flameshot gui; imagemagick-script

Permasalahannya adalah, apabila kita tidak jadi melakukan screenshot dengan flameshot, maka script imagemagick-script akan tetap dijalankan, dan akan memodifikasi gambar terakhir pada direktori screenshot.

Pemecahan Masalah

Kita perlu memasukkan perintah flameshot ke dalam script.

Nantinya, yang kita panggil bukan lagi flameshot, melainkan script kita –untuk menjalankan flameshot dengan hasil yang telah dimodifikasi dengan imagemagick.

Saya beri nama flameshot-imgck.

$HOME/.local/bin/flameshot-imgck
1#!/usr/bin/env ruby
2
3require 'date'
4
5# Please wite your dir with ~/ first
6screenshot_dir = '~/pic/ScreenShots'
7Dir.chdir(File.expand_path(screenshot_dir))
8original_file = Time.now.strftime('Screenshot_%Y-%m-%d_%H-%M-%S.png')
9target_file = original_file.split('').insert(-5, 'X').join
10color_profile = '/usr/share/color/icc/colord/sRGB.icc'
11border_size = '1'
12background_color = '"#FFFFFF"' # 'none' for transparent; Hex color use '"#000000"'
13background_size = '10'
14shadow_size = '50x10+0+10'
15font = 'JetBrains-Mono-Regular-Nerd-Font-Complete'
16font_size = '11'
17color_fg = '#ffffff'
18color_bg = '#666666'
19author_position = ['SouthWest', '+30+26']
20author = 'Shooter: @' + `echo $USER`.strip
21
22%x(
23flameshot gui --raw > #{original_file}
24
25magick convert #{original_file} -bordercolor '#{color_bg}' -border #{border_size} \
26#{target_file}
27
28magick convert #{target_file} \\( +clone -background black \
29-shadow #{shadow_size} \\) +swap -background none \
30-layers merge +repage #{target_file}
31
32magick convert #{target_file} -bordercolor #{background_color} \
33-border #{background_size} #{target_file}
34
35echo -n " #{author} " | magick convert #{target_file} \
36-gravity #{author_position[0]} -pointsize #{font_size} -fill '#{color_fg}' \
37-undercolor '#{color_bg}' -font #{font} \
38-annotate #{author_position[1]} @- #{target_file}
39
40magick convert #{target_file} -gravity South -chop 0x#{background_size.to_i / 2} \
41#{target_file}
42
43magick convert #{target_file} -gravity North -background #{background_color} \
44-splice 0x#{background_size.to_i / 2} #{target_file}
45
46magick convert #{target_file} -profile #{color_profile} #{target_file}
47)
48
49list_file = `ls -p | grep -v /`
50last_file = list_file.split(' ').last
51if last_file.include? 'X'
52 `notify-send "ImageMagick" "Improving success!" -t 3000`
53 `xclip -selection clipboard -i #{target_file} -t image/png`
54end
55
56size = `find #{last_file} -printf %s`
57if size == '0' || size <= '20'
58 `rm -rf #{last_file}`
59 `notify-send "Flameshot" "Process Aborted!" -t 1000`
60end

Kalau kita menjalankan script di atas, akan menghasilkan dua buah file.

Screenshot_2020-08-16_11-32-45.png    <- Original
Screenshot_2020-08-16_11-32-45X.png   <- Modifikasi

PERHATIAN!

Alamat screenshot_dir dengan alamat yang ada di Flameshot, harus sama.

Kalau tidak, maka script tidak berjalan sebagaimana mestinya.

File Original tidak dimodifikasi, tujuannya sebagai backup. Karena saya menyadari bahwa pengambilan screenshot adalah hal yang sangat crucial dan terkadang tidak dapat diulang dua kali.

File Modifikasi adalah hasil pengolahan dengan imagemagick, kalau dibuka akan seperti ini hasilnya.

Gambar 1

Nah, dengan seperti ini, kita tetap dapat memanfaatkan fitur annotate milik flameshot.

Mulai dari sekarang, hasil flameshot kita akan berbeda dari screenshot-screenshot sebelumnya.

Modifikasi Script

Beberapa modifikasi yang sering saya lakukan adalah:

Menghilangkan Border

Baris ke-11, adalah variabel untuk mendefinisikan border dari hasil screenshot.

Ubah nilainya ke 0 apabila tidak ingin menggunakan border.

$HOME/.local/bin/flameshot-imgck
1border_size = '0'

Mengganti Author (ScreenShoter)

Baris ke-20, adalah variabel untuk mendifinisikan author dari pengambil screenshot.

Ubah nilainya sesuai dengan preferensi teman-teman.

$HOME/.local/bin/flameshot-imgck
1author = 'Shooter: @' + `echo $USER`.strip

Disable Author

Baris ke 35-38, adalah proses pemberian author.

Kalau ingin dihilangkan, cukup dengan memberikan tanda # di setiap awal baris ke-34 sampai baris ke-37.

$HOME/.local/bin/flameshot-imgck
1%x(
2flameshot gui --raw > #{original_file}
3
4...
5...
6
7#echo -n " #{author} " | convert #{target_file} \
8#-gravity #{author_position[0]} -pointsize #{font_size} -fill '#{color_fg}' \
9#-undercolor '#{color_bg}' -font #{font} \
10#-annotate #{author_position[1]} @- #{target_file}
11
12...
13...
14)

Mengganti Author Font

Baris ke-15, adalah variable untuk mendifinisikan font.

Ganti nilainya sesuai dengan preferensi teman-teman.

$HOME/.local/bin/flameshot-imgck
1font = 'JetBrains-Mono-Regular-Nerd-Font-Complete'

INFO

Cara untuk mendapatkan nama font, gunakan perintah di bawah.

$ convert -list font

Untuk mendapatkan hasil yang lebih spesifik, gunakan grep dengan mengambil awal kata dari nama font.

$ convert -list font | grep -i 'fura'

Hasilnya akan seperti ini.

...
...
Font: Fura-Code-Regular-Nerd-Font-Complete
  family: FuraCode Nerd Font
  glyphs: /usr/share/fonts/TTF/Fura Code Regular Nerd Font Complete.ttf
Font: Fura-Code-Regular-Nerd-Font-Complete-Mono
  family: FuraCode Nerd Font Mono
  glyphs: /usr/share/fonts/TTF/Fura Code Regular Nerd Font Complete Mono.ttf
...
...

Tinggal pilih font yang sesuai dengan preferensi teman-teman.

Ambil value yang ada di dalam Font:

Mengganti Author Font Size

Baris ke-16, adalah variable yang mendifinisikan ukuran font.

Ganti sesuai preferensi teman-teman dalan satuan ukuran pt (point).

$HOME/.local/bin/flameshot-imgck
1font_size = '11'

Mengganti Author Position

Baris ke-19, adalah variabel untuk mendifinisikan nilai posisi dari author.

Index ke-0 berisi, 8 arah mata angin + 1 Center.

NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast

Sebagai acuan untuk memposisikan object dengan singkat.

$HOME/.local/bin/flameshot-imgck
1author_position = ['South', '...']

Index ke-1 berisi, jarak +X+Y

$HOME/.local/bin/flameshot-imgck
1author_position = ['...', '+10+10']

Hasilnya,

$HOME/.local/bin/flameshot-imgck
1author_position = ['South', '+10+10']

Background Transparent

Baris ke-12, adalah variable untuk mendifinisikan border color yang digunakan untuk memberikan background pada hasil screenshot.

Ubah nilainya menjadi none untuk transparent.

$HOME/.local/bin/flameshot-imgck
1background_color = "none"

Kalau ingin menggunakan warna,

$HOME/.local/bin/flameshot-imgck
1background_color = "'#002b36'"

Background Padding

Baris ke-13, adalah variable untuk mendifinisikan padding dari background dengan screenshot.

Ganti sesuai preferensi teman-teman.

Sesuaikan dengan besar dari shadow yang digunakan, agar shadow tidak terpotong.

$HOME/.local/bin/flameshot-imgck
1background_size = "20"

Shadow

Baris ke-14, adalah variable untuk mendifinisikan shadow yang ada di bawah screenshot.

Ganti sesuai preferensi teman-teman.

$HOME/.local/bin/flameshot-imgck
1shadow_size = '50x10+0+10'

Color Profile

Menambahkan color profile ini penting untuk Telegram. Kalau tidak menambahkan color profile, gambar kita akan terlihat “over bright” di Telegram Android meskipun tidak terlihat di Telegram Desktop.

$HOME/.local/bin/flameshot-imgck
1# ...
2# ...
3color_profile = '/usr/share/color/icc/colord/sRGB.icc'
4# ...
5# ...
6
7%x(
8flameshot gui --raw > #{original_file}
9
10...
11...
12
13convert #{target_file} -profile #{color_profile} #{target_file}
14
15...
16...
17)

Save to Clipboard!

Jangan lupa modifikasi pendefinisikan shortcut untuk COPY yang defaultnya menggunakan Ctrl+C, menjadi Enter pada file ~/.config/flameshot/flameshot.ini.

$HOME/.config/flameshot/flameshot.ini
1
2# ...
3
4[Shortcuts]
5# ...
6TYPE_COPY=Return
7# ...
8

Apabila telah selesai melakukan screenshot, kita dapat menyimpan dengan menekan tombol ENTER.

Maka, hasil screenshot kita akan disimpan ke clipboard.

$HOME/.local/bin/flameshot-imgck
1list_file = `ls -p | grep -v /`
2last_file = list_file.split(' ').last
3if last_file.include? 'X'
4 `notify-send "ImageMagick" "Improving success!" -t 3000`
5 `xclip -selection clipboard -i #{target_file} -t image/png`
6end

Tinggal kita paste di Telegram.

Namun, dengan Ruby script ini, hasil screenshot tetap berada pada direktori screenshot yang sudah kita set.

Jangan lupa untuk mendisable tombol save pada configurasi interface di Flameshot.

$ flameshot config

Gambar 2

Tujuannya agar kita tidak latah lalu menekan tombol save. Agar hanya ada satu pilihan untuk menyimpan, yaitu menekan tombol ENTER.

Menghandle Escape

Apabila kita tidak jadi melakukan screenshot dan menekan tombol ESC, proses screenshot dengan script ini akan meninggalkan file kosong (sebesar 0 B - 10 B).

Untuk menghandle hal tersebut, saya memilih mendeteksi size dari file tersebut dan menghapusnya.

$HOME/.local/bin/flameshot-imgck
1size = `find #{last_file} -printf %s`
2if size == '0' || size <= '20'
3 `rm -rf #{last_file}`
4 `notify-send "Flameshot" "Process Aborted!" -t 1000`
5end

Pesan Penulis

Mantap!!!

Saya rasa hanya ini yang dapat saya tuliskan saat ini.

Mudah-mudahan dapat bermanfaat untuk teman-teman.

Terima kasih.

(^_^)

BONUS

Alternatif Project

1. Awesome Flameshot (Bash Version oleh Berrabe)

Tidak semua temann-teman memiliki Ruby, namun, biasanya sudah memiliki Bash secara default.

Versi Bash ini dapat menjadi alternatif yang sangat praktis untuk teman-teman.

Terima kasih kepada bro Berrabe telah mem-porting ke Bash.

Teman-teman dapat menikmati source nya di sini yaa, Bash version oleh Berrabe.

gambar_3

gambar_4

Versi Python

PERHATIAN!

Versi Python sudah tidak saya maintain lagi.

Saya beri nama flameshot-imgck-python.

$HOME/.local/bin/flameshot-imgck-pyhton
1#!/usr/bin/env python
2
3import os
4from datetime import datetime
5
6# Please write your screenshot dir with full path. Later, I'll improve this.
7screenshot_dir = "/home/bandithijo/pic/ScreenShots"
8os.chdir(screenshot_dir)
9original_file = datetime.now().strftime("Screenshot_%Y-%m-%d_%H-%M-%S.png")
10target = list(original_file)
11target.insert(-4, 'X')
12target_file = ''.join(target)
13color_profile = "/usr/share/color/icc/colord/sRGB.icc"
14border_size = "1"
15background_color = "white" # "none" for transparent; Hex color use "'#ffffff'"
16background_size = "10"
17shadow_size = "50x10+0+10"
18font = "JetBrains-Mono-Regular-Nerd-Font-Complete"
19font_size = "11"
20color_fg = "#ffffff"
21color_bg = "#666666"
22author_position = ["SouthWest", "+30+26"]
23author = "Shooter: @" + \
24 os.popen("echo $USER").read().rstrip("\n")
25
26os.system(f"""
27flameshot gui --raw > {original_file}
28
29magick convert {original_file} -bordercolor '{color_bg}' -border {border_size} \
30{target_file} \
31
32magick convert {target_file} \\( +clone -background black \
33-shadow {shadow_size} \\) +swap -background none \
34-layers merge +repage {target_file} \
35
36magick convert {target_file} -bordercolor {background_color} \
37-border {background_size} {target_file} \
38
39echo -n " {author} " | magick convert {target_file} \
40-gravity {author_position[0]} -pointsize {font_size} -fill '{color_fg}' \
41-undercolor '{color_bg}' -font {font} \
42-annotate {author_position[1]} @- {target_file} \
43
44magick convert {target_file} -gravity South -chop 0x{int(background_size)/2} \
45{target_file} \
46
47magick convert {target_file} -gravity North -background {background_color} \
48-splice 0x{int(background_size)/2} {target_file} \
49
50magick convert {target_file} -profile {color_profile} {target_file} \
51""")
52
53list_file = os.popen("ls -p | grep -v /").read().split("\n")[:-1]
54last_file = list_file[-1]
55if 'X' in last_file:
56 os.system("notify-send 'ImageMagick' 'Improving success!' -t 3000")
57 os.system(f"xclip -selection clipboard -i {target_file} -t image/png")
58
59size = os.popen(f"find {last_file} -printf %s").read()
60if size == '0' or size <= '20':
61 os.system(f"rm -rf {last_file}")
62 os.system("notify-send 'Flameshot' 'Process Aborted!' -t 1000")

Referensi

  1. Membuat Hasil ScreenShot pada GNU/Linux seperti Milik macOS
    Diakses tanggal: 2020/08/16