[ Megoldva ] Kép konvertálása c forráskóddá

Fórumok

Szeretnék egy képet C forráskóddá konvertálni. A kép 256x192-es, 1 bites. Eredményként egy olyan C tömböt szeretnék kapni, amiben 1 bájt 8 pixelnek felel meg, de már lassan megelégednék olyannal is, ahol egy bájt egy pixel.

A GIMP konerziója 3 vagy 4 bájtos RGB(A) adatot generált, így inkább az ImageMagick convert parancsával próbálkoztam. Sajnos azzal sem sikerült elérnem a kellő eredményt. Ha jól vettem ki a leírásból, GIF formátumú tömböt generál, és nem bitmap-et.

Ha valaki meg tudná mondani, hogy a "convert" parancsot hogyan kell felparaméterezni ahhoz, hogy pixelenkénti C tömböt generáljon egy képből, azt nagyon megköszönném.

Megoldás: A célfájl kiterjesztése legyen .xbm

Hozzászólások

Egyelőre ez nem segített. Csináltam teszthez egy 256x192-es fehér képet, 1 bites palettával. Ezt próbáltam konvertálni a következő paranccsal:

convert c256x192.gif -define h:format=XBM -compress none img1.h

Az eredmény egy C tömb, amiben nem csupa egyforma 38468 bájt van. Az eredeti képben pedig 49152 pixel, aminek jó esetben 6144 bájtnak kellene lennie.

Egyébként próbáltam a PBM és MONO formátumokat is, de ezek sem hozták a megfelelő eredményt.

convert -size 256x192 xc:white white.bmp
convert white.bmp white.xbm
$ head white.xbm 
#define white_width 256
#define white_height 192
static char white_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 

 

Nekem ez így működik.

Azért 38468 byte a file mérete, mert a formátum 1 byteot ~6 byteon tárol " 0x00,". (plusz header, plusz \n, plusz soreleji space)

Szerkesztve: 2023. 01. 30., h – 13:44

Valaszd kette a problemat. Egyreszt barmibol igy tudsz `unsigned char` jellegu C tombot csinalni:

$ echo abc | xxd -i
  0x61, 0x62, 0x63, 0x0a
$ dd if=/dev/urandom bs=1 count=64 | xxd -i
  0x4a, 0x64, 0x8e, 0xda, 0x84, 0xe1, 0x84, 0x7a, 0xa2, 0xd4, 0x26, 0x82,
  0x58, 0x8a, 0x52, 0x35, 0x5f, 0x93, 0xe0, 0x3a, 0xf4, 0x3e, 0x75, 0x28,
  0xe9, 0x15, 0x5f, 0xdb, 0x7e, 0xae, 0xae, 0x55, 0x58, 0xbd, 0x28, 0x30,
  0x9b, 0xb6, 0xd1, 0x71, 0x08, 0x4a, 0x62, 0xd1, 0x00, 0x84, 0x3e, 0x0d,
  0x8c, 0xd4, 0x41, 0x2a, 0x28, 0x35, 0xf5, 0x41, 0x91, 0x59, 0xba, 0xcd,

Masreszt meg hogy mivel csinalsz egy 0/1 (1bites) bitmap-et. Arra tenyleg jo lehet a convert/bmp vagy netpbm vagy ilyesmi. Konkretan en meg csak greyscale-t csinaltam ezutobbival, de siman lehet hogy van valami depth vagy hasonlo parametere. Mondjuk ha jol ertem, valami modon mar eleve adott nalad ez a kep (A kép 256x192-es, 1 bites.). Szoval nulladik kerdes az is lehet hogy ez milyen formaban/formatumban adott tulajdonkeppen nalad? 

Szerk: imigy: `convert x.jpeg -monochrome -colors 2 x.bmp` Ha teljes pipeline kell, akkor: 

convert x.jpeg -monochrome -colors 2 bmp:- | dd bs=1 skip=146 | xxd -i

(itten kiserleti informatikaval arra jutottam hogy 146 byte a BMP header, de persze ez lehet mas is... szoval ez kicsit trial & error)

Mi a cél: hogy ne kelljen fájlból beolvasni, vagy hogy könnyű legyen a pixeleket programból kezelni?