无法使用Glut或OpenGL显示PNG

时间:2016-01-21 23:32:35

标签: c++ opengl glut

代码在这里:

void readOIIOImage( const char* fname, float* img)
{
   int xres, yres;
   ImageInput *in = ImageInput::create (fname);
   if (! in) {return;}
   ImageSpec spec;
   in->open (fname, spec);
   xres = spec.width;
   yres = spec.height;
   iwidth = spec.width;
   iheight = spec.height;

   channels = spec.nchannels;
   cout << "\n";

   pixels = new float[xres*yres*channels];
   in->read_image (TypeDesc::FLOAT, pixels);
   long index = 0;
   for( int j=0;j<yres;j++)
   {
      for( int i=0;i<xres;i++ )
      {
         for( int c=0;c<channels;c++ )
         {
            img[ (i + xres*(yres - j - 1))*channels + c ] = pixels[index++];

         }
      }
   }
   in->close ();
   delete in;
}

目前,我的代码可以很好地生成JPG文件。它能够读取文件的信息,并显示正常。但是,当我尝试读取PNG文件时,它根本无法正确显示。通常,它会在显示屏上的三个单独列中显示相同的图像扭曲版本。这很奇怪。知道给定代码发生这种情况的原因吗?

此外,JPG文件都有3个频道。 PNG有2.

fname只是一个文件名,img是`new float [3 * size];

任何帮助都会很棒。 Thanks.`

1 个答案:

答案 0 :(得分:1)

  

通常,它会在显示屏上的三个单独列中显示相同的图像扭曲版本。这很奇怪。知道给定代码发生这种情况的原因吗?

这很像你从解码器得到的输出是行平面格式。平面意味着,您可以逐个为每个通道单独获取一行。 PNG中信道数量与信道表观数量之间的失真和差异可能是由于对齐不匹配造成的。现在你没有指定你正在使用的图像解码器库,所以我无法查询它如何传达像素缓冲区布局的信息。我想你可以从ImageSpec阅读必要的信息。

无论如何,您必须重新排列像素缓冲区重排循环索引,以便将连续的行平面交错到通道元组中。

当然,你也可以使用一个随时可用的imagefile-to-OpenGL阅读器库。 DevIL被抛出很多,但它的维护得不是很好。 SOIL这些天似乎是一个受欢迎的选择。