Merhaba arkadaşlar,
Üzerinde çalıştığım bir betikte indirilen JPEG görüntülerini animasyonlu bir GIF haline getirmek için ImageMagick
paketi içerisindeki convert
aracını kullanıyordum. Betiği bitirip Pardus 17.4 üzerinde denediğimde GIF dosyasının animasyonlu bir şekilde oluşmadığını fark ettim. Bunun üzerine sorunun kaynağını araştırdım ve sürecin sonunda problemin ImageMagick
paketinin Türkçe lokalizasyonunda olduğunu keşfettim. Şöyle ki:
Sorun
Terminal üzerinde şöyle bir komut çalıştırdığınızda,
convert resim-1.jpg resim-2.jpg resim-3.jpg -delay 20 -loop 0 deneme.gif
ImageMagick çıktı dosyasının uzantısını anlamak için büyük harfe dönüştürüp, kontrol ediyor büyük ihtimal. Fakat sisteminizde LC_ALL
değişkeninin değeri tr_TR.UTF8
ise -ki Pardus’da bu varsayılan olarak böyle geliyor doğal olarak-, o zaman şöyle bir sorun oluşuyor: İngilizce’de İ(büyük i) harfi yok fakat Türkçede var. Fakat ‘gif’ uzantısı büyük harfe dönüştürülmek istendiğinde, İngilizce’de gif != GİF
olduğundan dolayı işlemin sonunda uzantı GiF
olarak kalıyor ve ImageMagick
bu uzantıyı tanımlamıyor ve gif dosyasını düzgün bir şekilde oluşturamıyor. Eğer yukarıdaki komuta -debug All
kısmını eklerseniz kayıtlar arasında şöyle bir hata mesajını göreceksiniz:
2019-01-17T22:57:40+03:00 0:00.160 0.160u 6.9.7 Exception convert-im6.q16[8244]: module.c/OpenModule/1320/Exception
unable to register image format `GiF': /usr/lib/x86_64-linux-gnu/ImageMagick-6.9.7/modules-Q16/coders/gif.so: undefined symbol: RegisterGiFImage
Keşfettiğim bu hata ImageMagick
tarafından olduğu için kendilerine GitHub üzerinden raporladım. Hatanın olduğunu doğruladılar ve bir sonraki versiyon güncellemesinde düzelteceklerini belirttiler. GitHub issue sayfasına buradan ulaşabilirsiniz.
Geçici Çözüm
ImageMagick
geliştiricileri sorunu sağlam bir şekilde çözene kadar, geçici bir çözüm olarak yukarıdaki komutu şu şekilde kullanarak hatadan kurtulabilirsiniz:
LC_ALL=en_US.UTF8 convert resim-1.jpg resim-2.jpg resim-3.jpg -delay 20 -loop 0 deneme.gif
convert
komutundan önce yazdığımız kısım sayesinde komple sistemimizin dil ayarlarını değiştirmek yerine sadece o komuta mahsus olacak şekilde değiştirebiliyoruz. Bu komuttan sisteminizin dil ayarları etkilenmez.
Deney
Hatayı keşfetmek için aşağıdaki C kodlarını deney amacıyla kodladım ve denedim.
#include <stdio.h>
#include <ctype.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "tr_TR.utf8");
// setlocale(LC_ALL, "en_US.utf8");
char ext = 'i';
printf("%c\n", toupper(ext));
}
Sonuç: