Bir görüntü dosyasını C koduna dönüştürmek

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,796
Örneğin elimizde PNG formatında bir görüntü dosyası var ve bunu gömülü bir sistemde doğrudan kullanmak istiyoruz, çünkü dosyayı saklayacak bir disk yok. Bu durumda dosya içeriğinin bir C array haline getirilmesi gerekir. Bu işi yapmak için grafik arayüzlü programlar bolca mevcut. Ayrıca bunun internet siteleri de var. Dosyayı yüklüyorsun, dönüşümü yapıp sonucu lokal olarak kaydetmeni sağlıyor. Ama bu yöntemlerin hiçbirisi otomasyona uygun değil. Mesela bir firmware projesini build ederken, bu build işleminin bir parçası olarak bu dönüşümü yapmak istiyorsak, bu grafik arayüzlü programların veya internet sitelerinin hiçbir faydası olmuyor.

Bu noktada gene bize en verimli çözümü Linux komut satırı sağlıyor. xxd isimli program, tam olarak bu işi yapan bir program.

Bash:
[ta@bonsai src]$ xxd -i image.png image.h
[ta@bonsai src]$ cat image.h
unsigned char image_png[] = {
  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x7c,
  0x08, 0x06, 0x00, 0x00, 0x00, 0xbb, 0x77, 0x0f, 0x0e, 0x00, 0x00, 0x00,
  0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b,
  0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44,
  0x41, 0x54, 0x78, 0x9c, 0xed, 0x7d, 0x09, 0x7c, 0x55, 0xc5, 0xd9, 0xfe,
  0x73, 0x6e, 0x42, 0x12, 0x12, 0x72, 0xb3, 0x40, 0x80, 0xb0, 0x25, 0xec,
  0x22, 0x90, 0x04, 0xa8, 0x50, 0xad, 0x42, 0x14, 0xb4, 0xf6, 0x6b, 0x05,
  0x6d, 0x5d, 0xaa, 0x9f, 0x0a, 0xae, 0xad, 0xf5, 0xab, 0x68, 0xd5, 0xaf,
*
*
*
  0x9a, 0x56, 0x19, 0xa6, 0xc9, 0x34, 0x82, 0x66, 0xa0, 0xb6, 0x12, 0xff,
  0x1f, 0xa5, 0xfb, 0x38, 0x31, 0xab, 0xfd, 0xde, 0x81, 0x00, 0x00, 0x00,
  0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
unsigned int image_png_len = 17649;

Burada xxd programına verdiğimiz -i argümanı, bir C include dosyası çıktısı istediğimizi programa bildiriyor. Artık tek yapmamız gereken, firmware kaynak kodunda image.h dosyasını include etmek.
 
Burada xxd programının oluşturduğu array değişkeni unsigned char olarak tanımlamış. Böyle yapınca da, derleyici bu array'i RAM belleğe koyuyor. Bende de fazla RAM bellek yok, flash'a koymasını istiyorum. array'i const unsigned char olarak tanımlarsam işim olacak, ama xxd nin bunu değiştirme gibi bir özelliği yok. Sorun da değil, linux komut satırı bu konuda gayet etkili bir çözüm sunuyor.

Bash:
$ xxd -i image.jpg | sed -e 's/unsigned char/const unsigned char/g' > image.h
$ cat image.h
const unsigned char image_png[] = {
  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x7c,
  0x08, 0x06, 0x00, 0x00, 0x00, 0xbb, 0x77, 0x0f, 0x0e, 0x00, 0x00, 0x00,
  0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b,
  0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44,
  0x41, 0x54, 0x78, 0x9c, 0xed, 0x7d, 0x09, 0x7c, 0x55, 0xc5, 0xd9, 0xfe,
  0x73, 0x6e, 0x42, 0x12, 0x12, 0x72, 0xb3, 0x40, 0x80, 0xb0, 0x25, 0xec,
  0x22, 0x90, 0x04, 0xa8, 0x50, 0xad, 0x42, 0x14, 0xb4, 0xf6, 0x6b, 0x05,
  0x6d, 0x5d, 0xaa, 0x9f, 0x0a, 0xae, 0xad, 0xf5, 0xab, 0x68, 0xd5, 0xaf,
*
*
*
  0x9a, 0x56, 0x19, 0xa6, 0xc9, 0x34, 0x82, 0x66, 0xa0, 0xb6, 0x12, 0xff,
  0x1f, 0xa5, 0xfb, 0x38, 0x31, 0xab, 0xfd, 0xde, 0x81, 0x00, 0x00, 0x00,
  0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
unsigned int image_png_len = 17649;

Olay bu kadar. xxd programının çıktısı bir filtreleyici olan sed programına veriliyor. O da "unsigned char" gördüğü her dizilimi "const unsigned char" olarak değiştiriyor.
 

Forum istatistikleri

Konular
5,840
Mesajlar
99,591
Üyeler
2,480
Son üye
mozcelikors

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top