Autor Wątek: Praca z formatem png...  (Przeczytany 3170 razy)

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 00:13:31
Witam

Patrznuje napisac program, ktory wskazuje mi, w ktorym punkcie (w dokladniej kolumnie) jest jakis jakis punkt :)
Tzn mam np obrazek 100x100 np z zielonym tlem. I na tym obrazku jest linia z punktu 20x10 do punktu 37x89. Chce aby program wczytal obrazek png, a potem wyswietlil na wyjsciu ze linia zaczyna sie od kolumny 20 do kolumny 37 ;)

Szukalem informacji na temat formatu png ale nic ciekawego nie znalazlem...
Program chcialem napisac prosty konsolowy, no ale jak trzeba to OpenGL uzje...

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Marzec 04, 2009, 00:30:21
PNG do RAW'a i przelej to co ci kapucyna wymyśli na algorytm.

Offline Troll

  • Użytkownik
    • Oficjalna strona gry Gizarma

# Marzec 04, 2009, 00:34:44
Do tego co piszesz nie potrzebujesz openGL. OpenGL służy do renderowania grafiki a nie wczytywania PNG-ów.

Jeśli używasz C# lub javy to funkcje do wczytywania PNGu są wbudowane. Jeżeli używasz C/C++ to musisz pewnie zciągnąc jakieś gotowe biblioteki do obsługi PNGów. Raczej nie polecałbym pisania programu który sam parsuje ten format - było by pewnie dużo roboty

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Marzec 04, 2009, 07:46:08
Poczytaj sobie o algorytmie poruszania sie Damy w szachach w ten sposob latow wyznaczysz start koniec i "dlugosc" (dokladnie ilosc pol) zajmowanych przez odcinek ogolnie kombinacja funkcji min(),max() a png to skompresowane bmp takze zawsze mozesz uzyc do zaladowania devila ma on chyba taka wygodna funkcje ILcopyimage gdzie na koncu podajesz swoja tablice char*data; oczywiscie nalezy ja zbudowac przed pobraniem danych a jak to masz to juz wiele nie musisz kombinowac

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 10:40:29
Cytuj
Jeżeli używasz C/C++ to musisz pewnie zciągnąc jakieś gotowe biblioteki do obsługi PNGów.
Tak zdecydowanie c/c++ ale jave tez znam na poziomie podstawowym - jednak wole to napisac w c/c++.

Cytuj
Poczytaj sobie o algorytmie poruszania sie Damy w szachach w ten sposob latow wyznaczysz start koniec i "dlugosc" (dokladnie ilosc pol) zajmowanych przez odcinek ogolnie kombinacja funkcji min(),max()
A to do czego? Ja chce znac tylko x1 i x2 (czyli punkt poczatku i konca lini)

Cytuj
zawsze mozesz uzyc do zaladowania devila ma on chyba taka wygodna funkcje ILcopyimage gdzie na koncu podajesz swoja tablice char*data;
Zobacze cos o tym DEVILE.

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 11:50:58
oki DevIL pobrany :)
Dzieki

Moze jakies tutki do tego ?
Bo na podstawie specyfikacji srednio umiem sie polapac :/

narazie mam ilLoadImage("cos.png"), a co dalej z tym mam robic to nie wiem :) Najchetniej bym zaczynal sprawdzac obrazek px po pikselu i szukac roznych kolorow od tla ;)

EDIT://

wymyslilem cos takiego(a wlasciwie skopiowalem):


 ilInit(); <- tego brakowalo :P
   
  ILuint ImageId = 0;
  ilGenImages(1,&ImageId);
  ilBindImage(ImageId);     // <- gdy to jest w komentarzu to jest ok :P
  ilLoadImage("cos.png") ;
  int width = ilGetInteger (IL_IMAGE_WIDTH);
  int height = ilGetInteger (IL_IMAGE_HEIGHT);
 
  int* pixmap = new int [width * height * 3];
  ilCopyPixels (0, 0, 0, width, height, 1, IL_RGB, IL_UNSIGNED_BYTE, pixmap);
 
  cout<<"szerokosc: "<<width<<endl<<"wysokosc: "<<height<<endl;

program sie odpala, wyskakuje blad i sie wywala :/
Nie wiem gdzie jest problem :/
« Ostatnia zmiana: Marzec 04, 2009, 12:59:00 wysłana przez siwy »

Offline misioslaw

  • Użytkownik
    • www.asmforce.eu

# Marzec 04, 2009, 13:10:26
  ilGenImages(1,&ImageId);
  ilBindImage(ImageId);     // <- gdy to jest w komentarzu to jest ok :P
  ilLoadImage("cos.png") ;
 

Jak na mój gust to powinno być to w innej kolejności

  ilLoadImage("cos.png") ;
  ilGenImages(1,&ImageId);
  ilBindImage(ImageId); 
 

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 13:45:25
  ilGenImages(1,&ImageId);
  ilBindImage(ImageId);     // <- gdy to jest w komentarzu to jest ok :P
  ilLoadImage("cos.png") ;
 

Jak na mój gust to powinno być to w innej kolejności

  ilLoadImage("cos.png") ;
  ilGenImages(1,&ImageId);
  ilBindImage(ImageId); 
 

Nie tak jak to zrobilem jest zdecydowanie dobrze ;)

Mam natomiast kolejny problem zwiazany z odczytaniem tablicy z wartosciami RGB poszczegolnych pxeli:

Obraz jest 3na3 (czarny kwadrat z bialym pxelem w srodku) - jednak wartosci jakie mi wychodza na wyjsciu sa dziwne - chyba to problem zwiazany z typami ale nie wiem jak go rozwiazac.

  int *pixmap = new int [width * height * 3];
  ilCopyPixels (0, 0, 0, width, height, 1, IL_RGB, IL_INT, pixmap);
 
  cout<<"szerokosc: "<<width<<endl<<"wysokosc: "<<height<<endl;
  cout<<"rozmiar: "<<width*height*3<<endl<<endl;
 
  for (int i=0; i<width* height * 3; i=i+3)
  {
  cout<<"  R: "<<pixmap[i];
  cout<<"  G: "<<pixmap[i+1];
  cout<<"  B: "<<pixmap[i+2]<<endl;
  }


// Dodatkowo mam problem bo nie da sie odczytac PNG tylko JPG dziala poprawnie ale to na pozniej zostawie narazie nardziej interesuje mnie poprawne odczytanie.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Marzec 04, 2009, 16:01:12
void LoadPixels(char* Name, ILubyte* TempTexels, int WIDTH int HEIGHT)
{

                ILboolean result;

      ILuint id;

      ilInit();

      ilGenImages(1, &id);
      ilBindImage(id);
            
      result = ilLoadImage(Name);

      if(result)
      {       // TempTexels = new ILubyte[image_width*image_height*pixels];
         //TempTexels = ilGetData(); // tak sie nie robi ;p
         ilCopyPixels (0, 0, 0, HEIGHT, WIDTH, 1, IL_RGB, IL_UNSIGNED_BYTE, TempTexels);
         cout<<"Done.\n";
      }
      else
      {
         cout<<"No texture...[ERROR]\n";
      }

      ilDeleteImages(1, &id);
}

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 16:21:39
void LoadPixels(char* Name, ILubyte* TempTexels, int WIDTH int HEIGHT)
{

                ILboolean result;

      ILuint id;

      ilInit();

      ilGenImages(1, &id);
      ilBindImage(id);
            
      result = ilLoadImage(Name);

      if(result)
      {       // TempTexels = new ILubyte[image_width*image_height*pixels];
         //TempTexels = ilGetData(); // tak sie nie robi ;p
         ilCopyPixels (0, 0, 0, HEIGHT, WIDTH, 1, IL_RGB, IL_UNSIGNED_BYTE, TempTexels);
         cout<<"Done.\n";
      }
      else
      {
         cout<<"No texture...[ERROR]\n";
      }

      ilDeleteImages(1, &id);
}

Ten kod wczytuje obraz do pamieci ok :) Ale ja chce wypisac skladowe RGB kazdego z pikseli

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Marzec 04, 2009, 16:32:43
for (int i=0; i<width* height * 3; i=i+3)//<- nie i=i+3 tylko i*=3; a to daletego ze twoj pierwszy pixel ma zakres od 0-2 czyli i=0*3=0 a np pixel 2 juz zakres od 3-5 czyli I= 1 *3; Rozumisz?
{
    cout<<"  R: "<<pixmap[i]; //wtedy to zadziala :)
    cout<<"  G: "<<pixmap[i+1];
    cout<<"  B: "<<pixmap[i+2]<<endl;
}

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 16:38:34
for (int i=0; i<width* height * 3; i=i+3)//<- nie i=i+3 tylko i*=3; a to daletego ze twoj pierwszy pixel ma zakres od 0-2 czyli i=0*3=0 a np pixel 2 juz zakres od 3-5 czyli I= 1 *3; Rozumisz?
{
    cout<<"  R: "<<pixmap[i]; //wtedy to zadziala :)
    cout<<"  G: "<<pixmap[i+1];
    cout<<"  B: "<<pixmap[i+2]<<endl;
}

Jak tak zrobie to w ogole sie nie wykona ;P

// Tu chodzi tylko i wylacznie o konwersje. Jak z tablicy pikseli zapisanych wycignac RGB...
Nie wiem czmu jak char robie na int to mi wyskakuja wielkie liczby skoro char jest zapisany na 8 bitach :///

Biorac pod uwage Twoje rozumowanie to po obrocie petli zrobi cos takiego

i=0*3 potem zrobi znowu i=0*3 itd.... Tak dzila pentla for :)
« Ostatnia zmiana: Marzec 04, 2009, 16:42:14 wysłana przez siwy »

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Marzec 04, 2009, 17:05:43
no to inkrementuj sobie w petlo no... ;p
btw ;] nie uzywaj char* tylko unsigned short ;] dostaniesz od 0-255 czyli dokladnie to co chcesz
a jak juz ci zalezy tak bardzo na char
to wyjsnij couot przez zutowanie co ma ci pokazac

Offline siwy

  • Użytkownik

# Marzec 04, 2009, 17:43:19
no to inkrementuj sobie w petlo no... ;p
btw ;] nie uzywaj char* tylko unsigned short ;] dostaniesz od 0-255 czyli dokladnie to co chcesz
a jak juz ci zalezy tak bardzo na char
to wyjsnij couot przez zutowanie co ma ci pokazac


Tu chodzi o to ze obie tablice sa dynamiczne i rzutwanie zle dziala ;)

// Unsigned shor zajmuje 2 bajty w pamieci :) wiec mhh jakies 65K...
Problem generalnie rozwiazalem olalem sprawe i podaje mi wyniki nie w skali od 0-255 ale od 0-65K :).... Mi to zupelnie wystarcza...

Dalej nie wiem czemu jak staram sie wczytac obrazek w formacie PNG to go nie wczytuje a w formacie JPG wczytuje :))
« Ostatnia zmiana: Marzec 05, 2009, 00:10:32 wysłana przez siwy »

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Marzec 05, 2009, 08:00:22
a jakiego PNg uzywasz? 8 czy 24 bit a moze wczytujesz go z ALPHA? jezeli tak to nie 3bity per texel a 4
wiec sprawdz czy twoj PNG nie ma kolory "przezroczystego" jak ma to dawaj 4bity albo zapisz go jeszcze raz ale Jako RGB