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
- 314 megtekintés
Hozzászólások
Az XBM formátumot keresed.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
6144 byte van a tömbben! Ez kell nekem, köszönöm! Még közvetlenül átméretezéssel és színkonverzióval is működik:
convert img1.png -geometry 256x192 -threshold 50% img1.xbm
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
Mi a cél: hogy ne kelljen fájlból beolvasni, vagy hogy könnyű legyen a pixeleket programból kezelni?
- A hozzászóláshoz be kell jelentkezni
A cél az volt, hogy könnyen tudjon a program hozzáférni a pixelekhez.
- A hozzászóláshoz be kell jelentkezni
Ahhoz nem kell a program részéve tenni a képet, inkább egy libjpeg vagy imagemagick szerű library-t használva memóriában bitmappá alakítani a jpeg-file tartalmát.
- A hozzászóláshoz be kell jelentkezni