将256色位图转换为RGBA位图 我在C++中写了一个渲染器。我看到一个类似的问题得到了回答,我只是想了解更多的信息。我有一个256色位图,我把它加载到内存中,然后加载到OpenGL中。我无法在手之前转换文件,需要在内存中进行转换。我希望能够将其转换为RGBA位图,以利用alpha通道。有人对库有什么代码或建议可以帮助我吗?

将256色位图转换为RGBA位图 我在C++中写了一个渲染器。我看到一个类似的问题得到了回答,我只是想了解更多的信息。我有一个256色位图,我把它加载到内存中,然后加载到OpenGL中。我无法在手之前转换文件,需要在内存中进行转换。我希望能够将其转换为RGBA位图,以利用alpha通道。有人对库有什么代码或建议可以帮助我吗?,c++,image,opengl,rgb,C++,Image,Opengl,Rgb,我在某个地方有一些代码,但只有20行或更少。BMP格式非常简单,只需读取标题,然后读取每种颜色,作为调色板数组中的索引。请记住,BMP是颠倒的: //load a bmp texture, with the specified global alpha GLuint load_bmp8_fixed_alpha(char * FileName, Uint8 a) { int x,y,x_padding,x_size,y_size,colors_no,r,g,b,current_pallete

我在某个地方有一些代码,但只有20行或更少。BMP格式非常简单,只需读取标题,然后读取每种颜色,作为调色板数组中的索引。请记住,BMP是颠倒的:

//load a bmp texture, with the specified global alpha
GLuint load_bmp8_fixed_alpha(char * FileName, Uint8 a)
{
   int x,y,x_padding,x_size,y_size,colors_no,r,g,b,current_pallete_entry; //i unused?
   Uint8 * file_mem;
   Uint8 * file_mem_start;
   Uint8 * texture_mem;
   Uint8 * read_buffer;
   Uint8 * color_pallete;
   FILE *f = NULL;
   GLuint texture;

     f = fopen (FileName, "rb");
     if (!f) return 0;
     file_mem = (Uint8 *) calloc ( 20000, sizeof(Uint8));
     file_mem_start=file_mem;
     fread (file_mem, 1, 50, f);//header only
     //now, check to see if our bmp file is indeed a bmp file, and if it is 8 bits, uncompressed
     if(*((short *) file_mem)!=19778)//BM (the identifier)
       {
           free(file_mem_start);
           fclose (f);
           return 0;
       }
   file_mem+=18;
   x_size=*((int *) file_mem);
   file_mem+=4;
   y_size=*((int *) file_mem);
   file_mem+=6;
   if(*((short *)file_mem)!=8)//8 bit/pixel?
       {
           free(file_mem_start);
           fclose (f);
           return 0;
       }

   file_mem+=2;
   if(*((int *)file_mem)!=0)//any compression?
       {
           free(file_mem_start);
           fclose (f);
           return 0;
       }
   file_mem+=16;

   colors_no=*((int *)file_mem);
   if(!colors_no)colors_no=256;
   file_mem+=8;//here comes the pallete

   color_pallete=file_mem+4;
   fread (file_mem, 1, colors_no*4+4, f);//header only
   file_mem+=colors_no*4;

   x_padding=x_size%4;
   if(x_padding)x_padding=4-x_padding;

   //now, allocate the memory for the file
   texture_mem = (Uint8 *) calloc ( x_size*y_size*4, sizeof(Uint8));
   read_buffer = (Uint8 *) calloc ( 2000, sizeof(Uint8));


   for(y=0;y<y_size;y++)
       {
           //fread (texture_mem+y*x_size, 1, x_size-x_padding, f);
           fread (read_buffer, 1, x_size-x_padding, f);

           for(x=0;x<x_size;x++)
               {
                   current_pallete_entry=*(read_buffer+x);
                   b=*(color_pallete+current_pallete_entry*4);
                   g=*(color_pallete+current_pallete_entry*4+1);
                   r=*(color_pallete+current_pallete_entry*4+2);
                   *(texture_mem+(y*x_size+x)*4)=r;
                   *(texture_mem+(y*x_size+x)*4+1)=g;
                   *(texture_mem+(y*x_size+x)*4+2)=b;
                   *(texture_mem+(y*x_size+x)*4+3)=a;
               }

       }

   free(file_mem_start);
   free(read_buffer);
   fclose (f);
   //ok, now, hopefully, the file is loaded and converted...
   //so, assign the texture, and such

   glGenTextures(1, &texture);
   glBindTexture(GL_TEXTURE_2D, texture);    //failsafe
   bind_texture_id(texture);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

   if(poor_man)
       {
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
       }
   else if(use_mipmaps)
       {
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
           glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
       }
   else
       {
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       }

   if(have_arb_compression)
       {
           if(have_s3_compression)
           glTexImage2D(GL_TEXTURE_2D,0,COMPRESSED_RGBA_S3TC_DXT5_EXT,x_size, y_size,0,GL_RGBA,GL_UNSIGNED_BYTE,texture_mem);
           else
           glTexImage2D(GL_TEXTURE_2D,0,COMPRESSED_RGBA_ARB,x_size, y_size,0,GL_RGBA,GL_UNSIGNED_BYTE,texture_mem);

       }
   else
   glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,x_size, y_size,0,GL_RGBA,GL_UNSIGNED_BYTE,texture_mem);

   check_gl_errors();
   free(texture_mem);
   return texture;
}
//加载具有指定全局alpha的bmp纹理
GLuint load\u bmp8\u fixed\u alpha(字符*文件名,Uint8 a)
{
int x,y,x_padding,x_size,y_size,colors_no,r,g,b,current_pallete_entry;//我未使用?
Uint8*文件存储;
Uint8*文件存储启动;
Uint8*纹理元素;
Uint8*读取缓冲区;
Uint8*彩色托盘;
文件*f=NULL;
胶合结构;
f=fopen(文件名,“rb”);
如果(!f)返回0;
file_mem=(Uint8*)calloc(20000,sizeof(Uint8));
file_mem_start=file_mem;
fread(文件_mem,1,50,f);//仅头文件
//现在,检查我们的bmp文件是否确实是bmp文件,是否为8位,未压缩
if(*(short*)file_mem)!=19778)//BM(标识符)
{
免费(文件存储启动);
fclose(f);
返回0;
}
文件_mem+=18;
x_size=*((int*)文件_mem);
文件_mem+=4;
y_size=*((int*)文件_mem);
文件_mem+=6;
如果(*(short*)file_mem)!=8)//8位/像素?
{
免费(文件存储启动);
fclose(f);
返回0;
}
文件_mem+=2;
如果(*(int*)file_mem)!=0)//有任何压缩吗?
{
免费(文件存储启动);
fclose(f);
返回0;
}
文件_mem+=16;
颜色_no=*((int*)文件_mem);
如果(!colors_no)colors_no=256;
file_mem+=8;//托盘来了
颜色\托盘=文件\内存+4;
fread(文件_mem,1,颜色_no*4+4,f);//仅标题
文件_mem+=颜色_编号*4;
x_padding=x_大小%4;
如果(x_padding)x_padding=4-x_padding;
//现在,为文件分配内存
纹理元素=(Uint8*)calloc(x_大小*y_大小*4,sizeof(Uint8));
read_buffer=(Uint8*)calloc(2000,sizeof(Uint8));
对于(y=0;y您可以使用它(并且您可以使用任何数量的其他格式)。我建议使用非官方的OpenGL SDK。但是,我还是写了它,所以请接受它的价值;)

我希望能够将其转换为RGBA位图,以利用alpha通道


这将是相当困难的,因为BMP格式实际上没有alpha通道。我们谈论的是BMP格式的图像,是吗?

这20行现在非常有用。只是想知道如何做以及256色位图的区别。给我你的电子邮件,我会发送给你。我的电子邮件是redpixelengineer@gmail.comI给人的印象是可能有RGBA位图。如果没有,我想将其转换为任何具有红色、绿色、蓝色和alpha组件且与OpenGL兼容的格式。谢谢Nicol。你一直是这个网站上最优秀的beast程序员之一。8b BMP没有alpha通道。但根据你的需要,y您可以根据图像对比度设置alpha。或者您可以使用单独的BMP和alpha。尽管我建议尽可能使用DDS格式。@PladniusBrooks:如果您指的是BMP格式的图像,请停止将其称为“位图”。术语“位图”是光栅图像的通用术语;它并不总是指.bmp文件。此外,OpenGL不读取图像格式;由用户代码将其转换为“与OpenGL兼容”的格式;这就是我指出的库所做的。您的工作应该是生成具有所需颜色通道的图像,并且可以由其中一个库加载。TGA图像可以具有alpha通道,就像大多数其他格式一样。