BMP képekből kellene most írni egy másik képet

Fórumok

Nem akartam új topicot ezért szerkesztek. A beolvsás szűrés + alakafelsmerést már megírtam (ez csak matek ehez nem kell tudni nagyon prgramozni), de életemben nem írtam ki bináris filet. Mindíg csak TXT-t. Képet meg pláne nem. Mindenképp képet kellene valahogy kicsiholnom. egsz pontosan egy memóriaterület adataiból. De ez nem fontos. Na az a lényeg, hogy hogyan tudok bináriba kiirattani C++-al. (egész pontosan bmp 0-s tömörítésű bmp).

Ebből indult az egész.:
Sziasztok.

Munkám során belefutottam egy ilyen dologba, hogy a bmp képeket képpontokra kell szednem, és azon kell klasztert detektálnom (a klaszterező algoritmoust már rég megírtam, de txt adatokból dolgozik, és nem bmp-ből), csak annyi a baj, hogy a bmp feldolgozása hogyan oldható meg. ki kellene szedni a képből az adott pont x,y kordinátáit + kell egy szám ami az rgb-k összege, és kész. Nem tudom, hogy hogyan induljak, mert még ilyet nem csináltam.

Köszi előre is mindenkinek. Eddig csak numerikus matematikai feladatokat írtam ott nem kellet ilyen. Ja mentségemre nem vagyok programozó. ("Műkedvelő fizikus" volnék.) :-). Jó egy-két doksi is.

Hozzászólások

Rengeteg módja van. Ha sima konzolos applikációt írsz (gondolom azt), akkor javaslom a következőt:

http://cimg.sourceforge.net/

Ez egy jó kis képmegjelenítő/feldolgozó osztály. BMP elvileg megy zsigerből, és ráadásul ad egy egész használható képreprezántációs osztályt is.

Erdemes talan a pnm (ppm, pgm, alkalmazastol fuggoen) formatumot is megnezni. Gyk 1:1-be beolvashatod a memoriaba. A mar meglevo" bmp (vagy akarmi egyeb) formatuombol tudsz a `bmptopnm` paranccsal pnm-et csinalni, illetve a `ppmtopgm` megcsinalja az rgb -> szurkearnyalat konverziot is. Sot, van sima ascii formaja is a pnm-nek, ha ugy egyszerubb a beolvasas (pl sima *scanf() fv-ekkel). Lasd me'g: `man 5 pnm`, `man 5 pgm`.

A.

Szerintem ne állj neki kézzel BMP readert írni, mert egyrész felesleges, másrészt mi történik ha egy egzotikusabb bmp jön szembe? (RLE, más színmélység stb.)

Ami neked kell az egy image lib C-hez.

Most hirtelen az ImageMagick jutott eszembe:
http://www.imagemagick.org/script/magick-wand.php

A második példában kb minden benne van ami neked kell.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

PNM-et egyszeru" kiiratni:


 fprintf(fw,"P6\x0a");
 fprintf(fw,"%d %d\x0a",sx,sy);
 fprintf(fw,"%d\x0a",255);
 for ( i=0 ; i<sy ; i++ )
  {     fwrite(outimg[i],sx*3,1,fw);            }
 fclose(fw);

Ahol

fw

a fopen()-nel megnyitott stream es/vagy stdout, outimg pedig egy unsigned char [sy][3*sx] meretu" tomb, amennyiben a ke'p me'rete sx * sy... ez egy binaris izet ir ki, melynek merete 3*sx*sy+keve's. Ez a kep szines, a tombben sorfolytonosan vannak az R, G es B komponensek, ebben a sorrendben, mindegyik unsigned char tipusu, 0-255 kozotti sza'm.

Ha fw = stdout, akkor a programod | pnmtobmp pipeline-nal tudsz csinalni bmp-t is (meg egyebkent barmi mast is).

C++-ra gondolom trivialisan atirhato a fenti ize.

Szerk: feketefeher is kiirhato, ebben az esetben a tomb unsigned char [sy][sx], az fwrite az csak sx,1 byte-ot ir ki es P6 helyett P5 kell az elso" sorban.

A.