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
'getimage' und' putimage' sind nicht Standard-C++, daher fehlt es an Informationen, um das Problem zu diagnostizieren. –
Also was soll ich tun @BaummitAugen ?? –
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. –