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ç:
