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

 ( emberk | 2008. január 23., szerda - 15:43 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.

Köszi szépen bár alap C -ben és nem cpp-ben írom.
Egyébként igen konzolos lesz. úgy is csak a vezérléshez kell a kimeneti adat.

Nem lesz ez necces ansi C-ben sem. Megtaláltam a bmpszerkezet leírását. a fejlécben benne van hogy mi mit követ utána meg egy rgb folyam.

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.

Ez szimpatikus már megoldottam mondjuk 0-s tömörítésű bmp-re, de megnézem ezeket is. köszi.

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

Up!

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.

Akkor pnm-lesz. Köszi szépe. Aha a fenti cuccot már át tudom írni c++ra kösz méegyszer.