2016-05-20 16 views
-4

Ich habe versucht, bg.png Datei zu öffnen, aber hat nicht funktioniert. Es gibt keinen Fehler, aber nichts erscheint. Hilf mir!öffnende Bilddatei auf C++, PNG, JPEG

int main() 
    { 
     initwindow(600,600,"GAME"); 
     ifstream image("bg.png"); 
     getimage(50, 50 , 450 , 450 , image); 
     putimage(50,50,image,COPY_PUT); 
     system("pause"); 
    } 
+3

'getimage' und' putimage' sind nicht Standard-C++, daher fehlt es an Informationen, um das Problem zu diagnostizieren. –

+0

Also was soll ich tun @BaummitAugen ?? –

+0

Ich vermute, dass etwas weder in 'getimage' noch in' putimage' (was auch immer sie sind) funktioniert, und ich bin mir sicher, dass sie einen Erfolgs-/Fehlerwert zurückgeben (den Sie nicht überprüfen möchten). In der Tat, Sie machen keine Erfolgs-/Fehlschlagsüberprüfungen bei irgendwelchen Funktionsaufrufen, so dass Sie nicht wissen können, welcher von ihnen fehlschlägt. Wie Ihnen bereits gesagt wurde, gibt es nicht genügend Informationen in Ihrer Frage, damit wir Ihnen helfen können. –

Antwort

-1

Sind Sie sicher, dass sich das bg.png im selben Ordner befindet, in dem Sie Ihr Programm ausführen? Wenn die Antwort ja ist, hast du es versucht?

int main() 
    { 
     int wHANDLE=initwindow(600,600,"GAME"); 
     setcurrentwindow(wHANDLE); 
     ifstream image("bg.png"); 
     getimage(50, 50 , 450 , 450 , image); 
     putimage(50,50,image,COPY_PUT); 
     system("pause"); 
    } 
+0

Wenn Sie in Ihrer Antwort um eine Klarstellung bitten müssen, hätte das wahrscheinlich keine Antwort sein sollen. Im Allgemeinen schreiben Sie nur Antworten auf Fragen, die in einem beantwortbaren Zustand sind. Gesprächsthesraten ergeben keine guten Antworten für dieses Format. –

+0

Gut zu wissen. Das ist ok. – mhyst

+0

Eigentlich lese ich gerade die Dokumente und meine Änderungen sind nutzlos mit nur einem Initfenster. Also meine Antwort ist auch nutzlos. Außer für die andere Empfehlung. Überprüfen Sie, ob die Image-Datei zugänglich ist und in Ihrem Arbeitsordner. – mhyst

0

Die graphics.h ist alte BGI lib von Borland ich diesen doc gefunden:

So vom Bildschirm bis zu einem gewissen Speicherpuffer kopiert Bild dieses gerade (Puffertechniken erlauben). Du rufst es mit ifstream das ist falsch. Sie überschreiben den Zeiger mit dem Speicherpuffer oder dem Bereich, auf den der Zeiger zeigt (abhängig vom Verhalten getimage). Wenn Sie wirklich BGI dafür verwenden möchten, dann decodieren Sie das Bild in den Speicher und verwenden Sie putimage, um es anzuzeigen. Aber ich fürchte, es ist nicht in RAW codiert und sicherer wäre das Bild direkt mit Pixel-Zugriff stattdessen zeichnen.

Wie ich zu Ihrer anderen Frage geschrieben habe, müssen Sie einige lib oder Code das Bild verwenden, das Ihr Selbst entschlüsselt. iostream ist kein guter Weg dafür.

Für MS-DOS Verwendung OS api (int 21h, wenn Sie es nicht funktioniert haben Abdeckung richtig) ... für Windows- und Borland Umgebung FileOpen FileRead FileClose verwenden. Für nicht-Borland-Umgebung verwenden Sie WinAPI oder API von Ziel OS (wenn nicht Windows). Um das Bild zu entschlüsseln, müssen Sie zuerst das zu dekodierende Dateiformat wählen. Ich empfehle, mit PCX, BMP (beschränkt auf einzelnes Pixelformat) oder TGA zu beginnen. Dateiformate wie JPG, PNG, GIF sind wirklich zu viel für einen Anfänger-Programmierer zu beginnen. Zum Beispiel mein GIF Decoder/Encoder in C++ ist über 36 KByte von Quellcode + another 15 KBytes für Datei CACHE Pufferung und Multi-Threaded-RT Codierung Scheduler. Im Vergleich zu PCX mit etwa 1.5KByte von Code zu laden/zu decodieren.

Dieses kleine Beispiel dafür, wie ich Texturen in meine GL Motor in Borland/Embarcadero VCL C++ Windows- laden:

int picture_load(Graphics::TBitmap *bmp,AnsiString name,int *_alpha) 
    { 
    if (bmp==NULL)  { _errorlog+="picture_load bmp is NULL\n"; return 0; } 
    if (!FileExists(name)){ _errorlog+="picture_load file \""+name+"\" dont exist\n"; return 0; } 
    bmp->HandleType=bmDIB; 
    bmp->PixelFormat=pf32bit; 
    AnsiString ext=ExtractFileExt(name).LowerCase(); 
    for(;;) 
     { 
     if (ext==".bmp") 
      { 
      bmp->LoadFromFile(name); 
      break; 
      } 
     if (ext==".jpg") 
      { 
      TJPEGImage *jpg=new TJPEGImage; 
      #ifdef _mmap_h 
      if (jpg) mmap_new('GL',jpg,sizeof(TJPEGImage)); 
      #endif 
      if (jpg==NULL) { _errorlog+="picture_load not enough memory\n"; return 0; } 
      jpg->LoadFromFile(name); 
      bmp->Assign(jpg); 
      #ifdef _mmap_h 
      mmap_del('GL',jpg); 
      #endif 
      delete jpg; 
      break; 
      } 
     if (ext==".png") 
      { 
      TPNGObject *png=new TPNGObject; 
      #ifdef _mmap_h 
      if (png) mmap_new('GL',png,sizeof(TJPEGImage)); 
      #endif 
      if (png==NULL) { _errorlog+="picture_load not enough memory\n"; return 0; } 
      png->LoadFromFile(name); 
      bmp->Assign(png); 
      #ifdef _mmap_h 
      mmap_del('GL',png); 
      #endif 
      delete png; 
      break; 
      } 
     if ((ext==".sgi")||(ext==".rgb")) 
      { 
      sgi sss; 
      sss.load(name); 
      bmp->Width=sss.rgba->Width; 
      bmp->Height=sss.rgba->Height; 
      bmp->Canvas->Draw(0,0,sss.rgba); 
      break; 
      } 
     if (ext==".pcx") 
      { 
      unsigned int *p,c; 
      int  x,y,adr; 
      int hnd,siz,l,xs,ys; 
      unsigned int pal[256],r,g,b; 
      Byte *dat; 
      for(;;) 
       { 
       hnd=FileOpen(name,fmOpenRead); 
       if (hnd<0) { _errorlog+="picture_load file \""+name+"\" dont exist\n"; return 0; } 
       siz=FileSeek(hnd,0,2); 
       FileSeek(hnd,0,0); 
       dat=new Byte[siz]; 
       #ifdef _mmap_h 
       if (dat) mmap_new('GL',dat,siz*sizeof(BYTE)); 
       #endif 
       if (dat==NULL) { FileClose(hnd); _errorlog+="picture_load not enough memory\n"; return 0; } 
       FileRead(hnd,dat,siz); 
       FileClose(hnd); 
       adr=siz-3*256; 
       for (l=0;l<256;l++) 
        { 
        r=dat[adr]; adr++; r&=255; 
        g=dat[adr]; adr++; g&=255; 
        b=dat[adr]; adr++; b&=255; 
        c=(r<<16)|(g<<8)|(b); 
        c&=0x00FFFFFF; 
        pal[l]=c; 
        } 
       xs=int(dat[ 8])-int(dat[4])+((int(dat[ 9])-int(dat[5]))<<8)+1; 
       ys=int(dat[10])-int(dat[6])+((int(dat[11])-int(dat[7]))<<8)+1; 

       bmp->HandleType=bmDIB; 
       bmp->PixelFormat=pf32bit; 
       bmp->Width=xs; 
       bmp->Height=ys; 
       xs=bmp->Width; 
       ys=bmp->Height; 

       adr=128; 
       for (y=0;y<ys;y++) 
        { 
        p=(unsigned int*)bmp->ScanLine[y]; 
        for (x=0;x<xs;) 
         { 
         c=dat[adr]; 
         if (c<192) l=1; 
         else{ 
          l=c&63; 
          adr++; 
          c=dat[adr]; 
          } 
         adr++; 
         for (;l>0;l--) 
          { 
          if (x>=xs) break; 
          p[x]=pal[c]; 
          x++; 
          } 
         } 
        } 
       #ifdef _mmap_h 
       mmap_del('GL',dat); 
       #endif 
       delete[] dat; 
       break; 
       } 
      break; 
      } 
     if (ext==".dds") 
      { 
      DDS::load(bmp,name); 
      _errorlog+=DDS::_errorlog; 
      DDS::_errorlog=""; 
      break; 
      } 
     _errorlog+="picture_load unsuported file extension \""+ext+"\"\n"; 
     return 0; 
     } 
    bmp->HandleType=bmDIB; 
    if (_alpha) _alpha[0]=(bmp->PixelFormat==pf32bit); 
    bmp->PixelFormat=pf32bit; 
    return 1; 
    } 

Als Ihr Code sieht aus wie Sie in MS-DOS sind dies nicht Arbeit. aber Sie können den PCX Teil extrahieren, der keine lib verwendet.Nur Port der Code (ersetzen AnsiString und Dateizugriff mit Funktionen, die Sie zur Verfügung haben)

Die Graphics::TBitmap ist VCL/GDI Bitmap seine Verwendung finden, zu verstehen:

So können Sie dies zu Ihrem BGI portieren. Sie können auch alle #ifdef _mmap_h Sachen ignorieren sie gerade von Speicherverlust Tracking/Debug-left over wird im Zusammenhang mit dieser:

Und hier PCX file-format specification

1

dieses:

ifstream image("bg.png"); 

& hellip; öffnet die Datei in Textmodus, wo in Windows und auf alten Macs, bestimmte Byte-Sequenzen, die End-of-Line und Ende des Textes, bei der Eingabe und Ausgabe geändert werden.

Das wollen Sie nicht.

Specify binary mode.


Das heißt, in der Nähe Sie “ Standard ” Bild erhalten in C++ Handhabung ist die Boost Image library.

+0

+1 ... btw Ich schrieb ihm das gleiche in der [vorherigen Frage] (http://stackoverflow.com/q/37325141/2521214) – Spektre

Verwandte Themen