📄 initopengl.cpp
字号:
fclose(fp);
i = 0;
for(y=0; y<srcy; y++)
{
i = y*src_byte_x;
for(x=0; x<srcx; x++)
{
tmp_rgb = SImageData[i];
SImageData[i] = SImageData[i+2];
SImageData[i+2] = tmp_rgb;
i += 3;
}
}
// Texture size
*rslx = *rsly = 1;
while( ((*rslx)<<1) <= srcx ) (*rslx) <<= 1;
while( ((*rsly)<<1) <= srcy ) (*rsly) <<= 1;
ImageData = new unsigned char[(*rslx)*(*rsly)];
if(ImageData == NULL)
{
*rslx = *rsly = 0;
AfxMessageBox("Malloc Failure");
delete []SImageData;
return(NULL);
}
// Calc. daltar
daltarx = (float)srcx/(float)(*rslx);
daltary = (float)srcy/(float)(*rsly);
// map source picture to texture-image
///////////////////////////////////////////
//Here ImageData include RGBA 4D for alpha
///////////////////////////////////////////
rslp = srcp = 0;
for( y = 0; y < (*rsly); y++ )
{
srcp2 = src_byte_x * (int)( daltary*y );
for( x = 0; x < (*rslx); x ++ )
{
srcp = srcp2 + 3 * (int)(x*daltarx);
ImageData[rslp] = (ImageData[rslp] + ImageData[rslp+1] + ImageData[rslp+2])/3;
//ImageData[rslp] = 0;
rslp ++;
}
}
// free memory
delete []SImageData;
return( ImageData );
}
void SaveBufferToBMP(char *FileName)
{
int viewx,viewy;
int x,y,i,j;
int Xlen, Ylen;
GLint port[4];
unsigned char pcrgb;
unsigned short *rbuf = NULL;
unsigned short *gbuf = NULL;
unsigned short *bbuf = NULL;
unsigned char *pbuf = NULL;
glGetIntegerv(GL_VIEWPORT,port);
viewx = port[2]-port[0];
viewy = port[3]-port[1];
int mod = viewx%4;
viewx = viewx - mod;
Xlen = viewx;
Ylen = viewy;
pbuf = new unsigned char [viewx*viewy*3];
rbuf = new unsigned short [Xlen*sizeof(unsigned short)];
gbuf = new unsigned short [Xlen*sizeof(unsigned short)];
bbuf = new unsigned short [Xlen*sizeof(unsigned short)];
if ( (pbuf == NULL)||(rbuf == NULL)||(gbuf == NULL)||(bbuf == NULL) )
{
AfxMessageBox("Malloc buffer memory failure \n");
return;
}
//////Use the readpiexels here before the dialog display can avoid the wrong image
glReadPixels(0,0,viewx,viewy,GL_RGB,GL_UNSIGNED_BYTE,pbuf);
BITMAPFILEHEADER head;
BITMAPINFOHEADER info;
FILE *fp;
fp=fopen(FileName,"wb");
if(fp==NULL)
{
AfxMessageBox("Can't Create Image Result File\n");
return;
}
head.bfType =0x4d42;
head.bfSize =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+Xlen*Ylen*3;
head.bfReserved1=0;
head.bfReserved2=0;
head.bfOffBits =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
info.biSize =sizeof(BITMAPINFOHEADER);
info.biWidth =Xlen;
info.biHeight =Ylen;
info.biPlanes =1;
info.biBitCount =24;
info.biCompression =0;
info.biSizeImage =0;
info.biXPelsPerMeter=0;
info.biYPelsPerMeter=0;
info.biClrUsed =0;
info.biClrImportant =0;
fwrite(&head,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&info,sizeof(BITMAPINFOHEADER),1,fp);
i=0;
for( y=0; y<Ylen; y++)
{
for(x=0; x<Xlen; x++)
{
rbuf[x] = (short)(pbuf[(i+x)*3]);
gbuf[x] = (short)(pbuf[(i+x)*3+1]);
bbuf[x] = (short)(pbuf[(i+x)*3+2]);
}
i += Xlen;
for(j=0;j<Xlen;j++)
{
pcrgb=(unsigned char)bbuf[j];
fwrite(&pcrgb,1,1,fp);
pcrgb=(unsigned char)gbuf[j];
fwrite(&pcrgb,1,1,fp);
pcrgb=(unsigned char)rbuf[j];
fwrite(&pcrgb,1,1,fp);
}
}
fclose(fp);
delete[] pbuf;
delete[] rbuf;
delete[] gbuf;
delete[] bbuf;
}
void SaveOneComponentToBMP(char *FileName)
{
int viewx,viewy;
int x,y,i,j;
int Xlen, Ylen;
GLint port[4];
unsigned char pcrgb;
unsigned short *rbuf = NULL;
unsigned short *gbuf = NULL;
unsigned short *bbuf = NULL;
unsigned char *pbuf = NULL;
glGetIntegerv(GL_VIEWPORT,port);
viewx = port[2]-port[0];
viewy = port[3]-port[1];
int mod = viewx%4;
viewx = viewx - mod;
Xlen = viewx;
Ylen = viewy;
pbuf = new unsigned char [viewx*viewy];
rbuf = new unsigned short [Xlen*sizeof(unsigned short)];
gbuf = new unsigned short [Xlen*sizeof(unsigned short)];
bbuf = new unsigned short [Xlen*sizeof(unsigned short)];
if ( (pbuf == NULL)||(rbuf == NULL)||(gbuf == NULL)||(bbuf == NULL) )
{
AfxMessageBox("Malloc buffer memory failure \n");
return;
}
//////Use the readpiexels here before the dialog display can avoid the wrong image
glReadPixels(0,0,viewx,viewy,GL_RED,GL_UNSIGNED_BYTE,pbuf);
BITMAPFILEHEADER head;
BITMAPINFOHEADER info;
FILE *fp;
fp=fopen(FileName,"wb");
if(fp==NULL)
{
AfxMessageBox("Can't Create Image Result File\n");
return;
}
head.bfType =0x4d42;
head.bfSize =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+Xlen*Ylen*3;
head.bfReserved1=0;
head.bfReserved2=0;
head.bfOffBits =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
info.biSize =sizeof(BITMAPINFOHEADER);
info.biWidth =Xlen;
info.biHeight =Ylen;
info.biPlanes =1;
info.biBitCount =24;
info.biCompression =0;
info.biSizeImage =0;
info.biXPelsPerMeter=0;
info.biYPelsPerMeter=0;
info.biClrUsed =0;
info.biClrImportant =0;
fwrite(&head,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&info,sizeof(BITMAPINFOHEADER),1,fp);
i=0;
for( y=0; y<Ylen; y++)
{
for(x=0; x<Xlen; x++)
{
rbuf[x] = (short)(pbuf[i+x]);
gbuf[x] = (short)(pbuf[i+x]);
bbuf[x] = (short)(pbuf[i+x]);
}
i += Xlen;
for(j=0;j<Xlen;j++)
{
pcrgb=(unsigned char)bbuf[j];
fwrite(&pcrgb,1,1,fp);
pcrgb=(unsigned char)gbuf[j];
fwrite(&pcrgb,1,1,fp);
pcrgb=(unsigned char)rbuf[j];
fwrite(&pcrgb,1,1,fp);
}
}
fclose(fp);
delete[] pbuf;
delete[] rbuf;
delete[] gbuf;
delete[] bbuf;
}
/////////////////////////////////////////////////
/// Save the data in array into a bmp file
////////////////////////////////////////////////
void SaveDataToBMP(char *FileName,int Width,int Height,unsigned char *Data)
{
int x,y;
int mod = Width%4;
Width = Width - mod;
BITMAPFILEHEADER head;
BITMAPINFOHEADER info;
FILE *fp;
fp=fopen(FileName,"wb");
if(fp==NULL)
{
AfxMessageBox("Can't Create Image Result File\n");
return;
}
head.bfType =0x4d42;
head.bfSize =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+Width*Height*3;
head.bfReserved1=0;
head.bfReserved2=0;
head.bfOffBits =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
info.biSize =sizeof(BITMAPINFOHEADER);
info.biWidth =Width;
info.biHeight =Height;
info.biPlanes =1;
info.biBitCount =24;
info.biCompression =0;
info.biSizeImage =0;
info.biXPelsPerMeter=0;
info.biYPelsPerMeter=0;
info.biClrUsed =0;
info.biClrImportant =0;
fwrite(&head,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&info,sizeof(BITMAPINFOHEADER),1,fp);
for( y=0; y<Height; y++)
{
for(x=0; x<Width; x++)
{
fwrite(&Data[(y*Width+x)*3+2],1,1,fp);
fwrite(&Data[(y*Width+x)*3+1],1,1,fp);
fwrite(&Data[(y*Width+x)*3],1,1,fp);
}
}
fclose(fp);
}
unsigned char* ReadTexImage(char* ImageFile, int *rslx, int *rsly )
{
FILE *fp;
BITMAPFILEHEADER head;
BITMAPINFOHEADER info;
int srcx, srcy;
unsigned char *SImageData;
// load a image
fp=fopen(ImageFile, "rb");
if(fp == NULL)
{
*rslx = *rsly = 0;
AfxMessageBox("Error to open texture image in ReadTexImage!");
return(NULL);
}
fread(&head,sizeof(BITMAPFILEHEADER),1,fp);
fread(&info,sizeof(BITMAPINFOHEADER),1,fp);
if( (head.bfType != 19778) || // not a bitmap
info.biBitCount != 24 ) // not 24-bit ture color
{
*rslx = *rsly = 0;
AfxMessageBox("Error in ReadTexImage:\nBad texture image.\nNot a 24-bits bitmap.");
return(NULL);
}
*rslx = srcx = info.biWidth;
*rsly = srcy = info.biHeight;
int tempsrcx = (4-(srcx*3)%4)%4 + srcx*3;
SImageData = new unsigned char[tempsrcx*srcy];
if(SImageData == NULL)
{
*rslx = *rsly = 0;
AfxMessageBox("Malloc Failure in ReadTexImage");
return(NULL);
}
fread( SImageData, 1, tempsrcx*srcy, fp );
fclose(fp);
unsigned char* ImageData = new unsigned char[srcx*srcy*3];
int pos2, pos=0;
for(int i=0; i<srcy; i++)
{
for(int j=0; j<srcx; j++)
{
pos2 = i*tempsrcx+j*3;
ImageData[pos] = SImageData[pos2+2];
ImageData[pos+1] = SImageData[pos2+1];
ImageData[pos+2] = SImageData[pos2];
pos+=3;
}
}
delete []SImageData;
return( ImageData );
}
void SaveTexToBMPFile(int texID, int size, char *FileName)
{
glBindTexture(GL_TEXTURE_2D, texID);
unsigned char *TexData = new unsigned char[size*size*3];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, TexData);
SaveDataToBMP(FileName,size,size,TexData);
delete[] TexData;
}
/*
////Float
void SaveTexToTXTFile(int texID, int size, char *FileName)
{
glBindTexture(GL_TEXTURE_2D, texID);
float *TexData = new float[size*size*3];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, TexData);
FILE *fp = fopen(FileName,"w");
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
fprintf(fp,"(%4.3f,%4.3f,%4.3f) ",TexData[(i*size+j)*3],TexData[(i*size+j)*3+1],TexData[(i*size+j)*3+2]);
fprintf(fp,"\n");
}
fclose(fp);
delete[] TexData;
}
*/
////Unsigned char
void SaveTexToTXTFile(int texID, int size, char *FileName)
{
glBindTexture(GL_TEXTURE_2D, texID);
unsigned char *TexData = new unsigned char[size*size*3];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, TexData);
FILE *fp = fopen(FileName,"w");
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
fprintf(fp,"%3d ",TexData[(i*size+j)*3]);
fprintf(fp,"\n");
}
fclose(fp);
delete[] TexData;
TexData = NULL;
}
void SaveTexToTXTFile(int texID, int Size, FILE *fp)
{
glBindTexture(GL_TEXTURE_2D, texID);
if(Size>1)
{
unsigned char* TexData = NULL;
TexData = new unsigned char[Size*Size];
memset(TexData, 0, sizeof(unsigned char)*Size*Size);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_UNSIGNED_BYTE, TexData);
fprintf(fp,"-------------------------------------\n");
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size;j++)
fprintf(fp,"%3d ",TexData[i*Size+j]);
fprintf(fp,"\n");
}
delete[] TexData;
TexData = NULL;
}
else
{
unsigned char TexData;
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_UNSIGNED_BYTE, &TexData);
fprintf(fp,"-------------------------------------\n");
fprintf(fp,"%3d\n",TexData);
}
}
void SaveRectangleTexToTXTFile(int texID, int Width, int Height, FILE *fp)
{
glBindTexture(GL_TEXTURE_RECTANGLE_NV, texID);
float *TexData = new float[Width*Height];
memset(TexData, 0, sizeof(float)*Height*Width);
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RED, GL_FLOAT, TexData);
fprintf(fp,"-------------------------------------\n");
for(int i=0;i<Height;i++)
{
for(int j=0;j<Width;j++)
fprintf(fp,"%4.3f ",TexData[i*Width+j]);
fprintf(fp,"\n");
}
delete[] TexData;
TexData = NULL;
}
void SaveCurrentTexToTXTFile(int size, char *FileName)
{
float *TexData = new float[size*size];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, TexData);
FILE *fp = fopen(FileName,"w");
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
fprintf(fp,"%4.3f ",TexData[i*size+j]);
fprintf(fp,"\n");
}
fclose(fp);
delete[] TexData;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -