Dolphin Sağ Tık Menüsüne HEIC Dönüştürme ve Optimize Etme Seçeneği Eklemek
Uzun süredir iOS tabanlı bir telefon kullanıyorum ve bildiğiniz üzere iOS’ta çekilen görsellerin formatı çoğu zaman HEIC oluyor. Bu format depolama açısından oldukça verimli olsa da, bazı web siteleri veya paneller tarafından desteklenmediği için görsel yüklerken problem yaşayabiliyorum.
Bu nedenle kolları sıvadım ve Dolphin için yalnızca *.HEIC / *.heic dosyalarında çalışacak özel bir alt menü ekledim.
Bu anlatım KDE Dolphin dosya yöneticisi içindir. GNOME Files, Thunar veya Nemo gibi farklı dosya yöneticilerinde sağ tık menüsüne özel işlem ekleme yöntemi farklıdır.
Uyarı
Bildirim göndermek için Hyprland ile uyumlu olacak şekilde notify-send kullandım. Hyprland/Wayland tarafında bildirimlerin görünmesi için mako, dunst, swaync veya benzeri bir notification daemon çalışıyor olmalıdır. Eğer farklı bir masaüstü ortamı kullanıyorsanız, bildirim kısmını kendi masaüstü ortamınıza uygun şekilde değiştirmeniz gerekebilir.
Öncelikle oluşturacağımız alt menünün tam olarak ne yapacağını netleştirelim. Bu alt menü üzerinden HEIC dosyalarını JPG olarak optimize edebileceğiz. Ayrıca JPG için upload dostu bir küçültme/optimizasyon seçeneğimiz olacak. Son olarak PNG formatında kayıpsız çıktı alabileceğiz ve işlem tamamlandığında sistem bildirimi göreceğiz.
Gerekli Paketlerin Kurulması
Bu işlem için temel olarak libheif, libjpeg-turbo, libpng, jpegoptim, oxipng, imagemagick ve bildirim için libnotify paketlerine ihtiyacımız olacak. Bu paketleri kurarken kullandığınız dağıtıma uygun paket yöneticisini tercih etmelisiniz.
Arch, CachyOS, Manjaro veya başka bir Arch tabanlı sistem kullanıyorsanız resmi depo paketleri için pacman kullanabilirsiniz. AUR paketlerine ihtiyaç duyduğunuz durumlarda ise paru veya yay gibi AUR yardımcılarından yararlanabilirsiniz.
Debian, Ubuntu, Linux Mint, Pop!_OS veya benzeri Debian/Ubuntu tabanlı bir sistem kullanıyorsanız paket kurulumları için apt paket yöneticisini kullanabilirsiniz.
Bu yazıdaki komutlar ağırlıklı olarak Arch tabanlı sistemler üzerinden örneklendirilmiştir. Farklı dağıtımlarda paket adları küçük değişiklikler gösterebilir.
1
2
3
4
5
sudo pacman -S libheif libjpeg-turbo libpng jpegoptim oxipng imagemagick
# ya da
paru -S libheif libjpeg-turbo libpng jpegoptim oxipng imagemagick
1
sudo apt install libheif-examples libjpeg-turbo-progs libpng-tools jpegoptim oxipng imagemagick
HEIC İşlemleri için Script Oluşturmak
Öncelikle kullanıcı dizininde script’i oluşturacağımız alanı hazırlayalım.
1
2
3
4
mkdir -p ~/.local/bin
# Editör olarak isterseniz nano da kullanabilirsiniz.
code ~/.local/bin/heic-dolphin
Dosya açıldıktan sonra içerisine aşağıdaki script’i ekleyelim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#!/usr/bin/env bash
set -u
export PATH="$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
LOG_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/heic-dolphin"
LOG_FILE="$LOG_DIR/heic-dolphin.log"
mkdir -p "$LOG_DIR"
exec >>"$LOG_FILE" 2>&1
echo ""
echo "===== $(date) ====="
echo "Args: $*"
echo "PATH: $PATH"
notify() {
local msg="$1"
echo "NOTIFY: $msg"
if command -v notify-send >/dev/null 2>&1; then
notify-send \
--app-name="HEIC Dolphin" \
--icon="image-x-generic" \
"HEIC Dolphin" \
"$msg"
else
echo "notify-send bulunamadı: $msg"
fi
}
fatal() {
echo "FATAL: $1"
notify "Hata: $1"
exit 1
}
file_error() {
local file="$1"
local msg="$2"
echo "ERROR [$file]: $msg"
}
mode="${1:-}"
shift || true
[ -n "$mode" ] || fatal "Mod gelmedi."
[ "$#" -gt 0 ] || fatal "Dosya gelmedi."
command -v heif-dec >/dev/null 2>&1 || fatal "heif-dec bulunamadı. libheif kurulu mu?"
if [ "$mode" = "jpg-upload" ]; then
command -v magick >/dev/null 2>&1 || fatal "magick bulunamadı. imagemagick kurulu mu?"
fi
success_count=0
fail_count=0
total_count=0
for file in "$@"; do
total_count=$((total_count + 1))
echo ""
echo "Processing: $file"
if [ ! -f "$file" ]; then
file_error "$file" "Dosya değil, atlandı."
fail_count=$((fail_count + 1))
continue
fi
dir="$(dirname "$file")"
base="$(basename "$file")"
name="${base%.*}"
if [ ! -w "$dir" ]; then
file_error "$file" "Bu klasöre yazma izni yok: $dir"
fail_count=$((fail_count + 1))
continue
fi
case "$mode" in
jpg)
out="$dir/${name}_optimized.jpg"
echo "Output: $out"
if ! heif-dec -q 95 "$file" "$out"; then
file_error "$file" "HEIC → JPG dönüştürme başarısız."
fail_count=$((fail_count + 1))
continue
fi
if command -v jpegoptim >/dev/null 2>&1; then
jpegoptim --strip-all --all-progressive "$out" || echo "jpegoptim başarısız ama çıktı üretildi."
fi
if [ ! -f "$out" ]; then
file_error "$file" "JPG çıktı oluşmadı."
fail_count=$((fail_count + 1))
continue
fi
echo "OK: $out"
success_count=$((success_count + 1))
;;
jpg-upload)
tmp="$(mktemp --suffix=.jpg)"
rm -f "$tmp"
out="$dir/${name}_upload.jpg"
echo "Temp: $tmp"
echo "Output: $out"
if ! heif-dec -q 100 "$file" "$tmp"; then
rm -f "$tmp"
file_error "$file" "HEIC geçici JPG'ye dönüştürülemedi."
fail_count=$((fail_count + 1))
continue
fi
if ! magick "$tmp" \
-auto-orient \
-resize 50% \
-strip \
-sampling-factor 4:2:0 \
-interlace Plane \
-quality 82 \
"$out"; then
rm -f "$tmp"
file_error "$file" "Upload dostu JPG oluşturulamadı."
fail_count=$((fail_count + 1))
continue
fi
rm -f "$tmp"
if command -v jpegoptim >/dev/null 2>&1; then
jpegoptim --strip-all --all-progressive "$out" || echo "jpegoptim başarısız ama çıktı üretildi."
fi
if [ ! -f "$out" ]; then
file_error "$file" "Upload JPG çıktısı oluşmadı."
fail_count=$((fail_count + 1))
continue
fi
echo "OK: $out"
success_count=$((success_count + 1))
;;
png)
out="$dir/${name}_lossless.png"
echo "Output: $out"
if ! heif-dec "$file" "$out"; then
file_error "$file" "HEIC → PNG dönüştürme başarısız."
fail_count=$((fail_count + 1))
continue
fi
if command -v oxipng >/dev/null 2>&1; then
oxipng -o 4 --strip safe "$out" || echo "oxipng başarısız ama çıktı üretildi."
fi
if [ ! -f "$out" ]; then
file_error "$file" "PNG çıktı oluşmadı."
fail_count=$((fail_count + 1))
continue
fi
echo "OK: $out"
success_count=$((success_count + 1))
;;
*)
fatal "Geçersiz mod: $mode"
;;
esac
done
echo ""
echo "Done. Total: $total_count, Success: $success_count, Failed: $fail_count"
if [ "$fail_count" -eq 0 ]; then
notify "$success_count dosya başarıyla işlendi."
else
notify "$success_count dosya işlendi, $fail_count dosyada hata var. Logu kontrol et."
fi
exit 0
Dosyayı kaydettikten sonra söz dizimi kontrolü yapalım ve dosyayı çalıştırılabilir hale getirelim.
1
2
bash -n ~/.local/bin/heic-dolphin
chmod +x ~/.local/bin/heic-dolphin
Eğer bash -n komutunda herhangi bir çıktı görmüyorsanız script’in söz diziminde problem yok demektir. Bir hata çıktısı alırsanız, çıktıyı yorum olarak paylaşabilir veya bir yapay zekadan yardım alarak çözebilirsiniz.
Ayrıca manuel bir test yapalım. Elinizdeki bir HEIC dosyasının tam konumunu kopyalayın ve aşağıdaki komutta DOSYA_KONUMU kısmına yazın:
1
~/.local/bin/heic-dolphin jpg "DOSYA_KONUMU"
Eğer işlem başarılı olursa hem bildirim gelmeli hem de dosyanın bulunduğu klasörde dosyaadi_optimized.jpg şeklinde bir çıktı oluşmalıdır.
Upload dostu çıktıyı test etmek için:
1
~/.local/bin/heic-dolphin jpg-upload "DOSYA_KONUMU"
Bu işlem sonucunda dosyanın bulunduğu klasörde dosyaadi_upload.jpg şeklinde bir çıktı oluşmalıdır.
Dolphin Sağ Tık Menüsüne Eklemek
Dolphin sağ tık menüsü için KDE Service Menu dosyası oluşturmamız gerekiyor.
Önce gerekli klasörü oluşturalım:
1
2
mkdir -p ~/.local/share/kio/servicemenus
code ~/.local/share/kio/servicemenus/heic-tools.desktop
Dosyanın içine şu içeriği ekleyelim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Desktop Entry]
Type=Service
MimeType=image/heic;image/heif;image/heic-sequence;image/heif-sequence;
Actions=jpg;jpg-upload;png;
X-KDE-Submenu=HEIC İşlemleri
X-KDE-Protocols=file
X-KDE-Priority=TopLevel
[Desktop Action jpg]
Name=JPG olarak optimize et
Icon=image-jpeg
Exec=/home/KULLANICI_ADINIZ/.local/bin/heic-dolphin jpg %F
[Desktop Action jpg-upload]
Name=JPG upload dostu küçült
Icon=image-jpeg
Exec=/home/KULLANICI_ADINIZ/.local/bin/heic-dolphin jpg-upload %F
[Desktop Action png]
Name=PNG kayıpsız çıktı al
Icon=image-png
Exec=/home/KULLANICI_ADINIZ/.local/bin/heic-dolphin png %F
Uyarı
Bu dosya içeriğindeki KULLANICI_ADINIZ kısmını kendi kullanıcı adınızla değiştirmezseniz script çalışmaz. Kullanıcı adınızı öğrenmek için terminalde whoami komutunu kullanabilirsiniz. Dilerseniz aşağıdaki komutlarla Exec satırlarını otomatik olarak da güncelleyebilirsiniz.
1
2
3
4
5
script_path="$(realpath ~/.local/bin/heic-dolphin)"
sed -i "s|Exec=.*heic-dolphin jpg %F|Exec=$script_path jpg %F|g" ~/.local/share/kio/servicemenus/heic-tools.desktop
sed -i "s|Exec=.*heic-dolphin jpg-upload %F|Exec=$script_path jpg-upload %F|g" ~/.local/share/kio/servicemenus/heic-tools.desktop
sed -i "s|Exec=.*heic-dolphin png %F|Exec=$script_path png %F|g" ~/.local/share/kio/servicemenus/heic-tools.desktop
Burada özellikle %F kullanıyoruz. Çünkü %F, Dolphin’den seçilen birden fazla dosyanın script’e gönderilmesini sağlar. Eğer burada %f kullanırsanız yalnızca tek dosya işlenir.
Son olarak KDE servis menüsünü yenileyelim.
1
command -q kbuildsycoca6; and kbuildsycoca6; or kbuildsycoca5
1
2
3
4
5
if command -v kbuildsycoca6 >/dev/null 2>&1; then
kbuildsycoca6
else
kbuildsycoca5
fi
Bu işlemden sonra Dolphin’i kapatıp tekrar açın. Artık .heic dosyalarına sağ tıkladığınızda HEIC İşlemleri adında bir alt menü görmeniz gerekir.
Hata Ayıklama
Bu yapıda hata ayıklamayı kolaylaştırmak için script içine log sistemi ekledim. Script her çalıştığında şu dosyaya log yazar:
1
~/.local/state/heic-dolphin/heic-dolphin.log
Son logları görmek için:
1
tail -n 80 ~/.local/state/heic-dolphin/heic-dolphin.log
Eğer Dolphin sağ tık menüsünden işlem yaptığınız halde logda yeni satır oluşmuyorsa, .desktop dosyasındaki Exec satırı hatalı olabilir.
Eğer logda şöyle bir hata görüyorsanız:
1
heif-dec bulunamadı. libheif kurulu mu?
libheif veya Debian/Ubuntu tarafında libheif-examples paketini kurmanız gerekir.
Eğer logda şöyle bir hata görüyorsanız:
1
magick bulunamadı. imagemagick kurulu mu?
imagemagick paketini kurmanız gerekir.
Eğer sadece seçtiğiniz ilk dosya işleniyorsa, .desktop dosyasındaki Exec satırlarında %F yerine %f kullanmış olabilirsiniz. Çoklu dosya desteği için %F kullanılmalıdır.
Sonuç
Dolphin’in Service Menu yapısı sayesinde dosya yöneticisine oldukça pratik özel işlemler eklenebilir. Bu örnekte HEIC dosyaları için sağ tık menüsüne üç farklı seçenek ekledik:
- JPG olarak optimize etme
- Upload dostu küçültülmüş JPG oluşturma
- PNG olarak kayıpsız çıktı alma
Bu yaklaşımın avantajı basit olmasıdır. Ekstra bir grafik arayüz yazmaya gerek yoktur. Dolphin zaten seçilen dosyaları script’e gönderir, script de çıktıyı aynı klasöre üretir. Üstelik işlem sonucunu notify-send ile bildirim olarak gösterebiliriz.
Günlük kullanım için en mantıklı seçenek genellikle JPG upload dostu küçült seçeneğidir. Çünkü birçok web sitesi veya panel için tam boy HEIC/JPG dosyası gereksiz derecede büyük olabilir. Kaliteyi korumak istediğiniz durumlarda PNG çıktısı alabilirsiniz; ancak PNG dosyalarının çoğu zaman JPG’ye göre daha büyük olacağını unutmamak gerekir.