2010-03-12 73 views
4

我已经开始使用OpenEXR加载EXR图像。我必须使用浮点类型来获取RGB像素。OpenEXR图像加载

对于RGB图像,没有就装没问题,使用此代码:

ImfInputFile *iFile = ImfOpenInputFile(filename); 
     FrameBuffer fb; 
     const Header &iHeader = iFile.header(); 
     bool hasRed = false, hasGreen = false, hasBlue = false; 
     bool hasY = false; 
     Box2i dw = iHeader.dataWindow(); 
     int width = dw.max.x-dw.min.x+1; 
     int height = dw.max.y-dw.min.y+1; 

     for (ChannelList::ConstIterator it = iHeader.channels().begin(), ite = iHeader.channels().end(); it != ite; it++) { 
      if ((strcmp(it.name(), "R") == 0)) { hasRed = true; } 
      if ((strcmp(it.name(), "G") == 0)) { hasGreen = true; } 
      if ((strcmp(it.name(), "B") == 0)) { hasBlue = true; } 
      if (it.channel().type != HALF) { 
       HDR_LOG("Unable to open EXR file \"%s\" (unsupported data type %s)", filename, it.channel().type); 
       return (IEFileCantOpen); 
      } 
     } 

     if ((hasRed == true) || (hasGreen == true) || (hasBlue == true)) { 
      fb.insert("R", Slice(
       Imf::FLOAT, (char*)((char*)image->data + (sizeof(float) * 0)), 
       sizeof(float) * 3, 
       sizeof(float) * width * 3, 
       1, 1, 
       0.0 
       ) 
      ); 
      fb.insert("G", Slice(
       Imf::FLOAT, (char*)((char*)image->data + (sizeof(float) * 1)), 
       sizeof(float) * 3, 
       sizeof(float) * width * 3, 
       1, 1, 
       0.0 
       ) 
      ); 

      fb.insert("B", Slice(
       Imf::FLOAT, (char*)((char*)image->data + (sizeof(float) * 2)), 
       sizeof(float) * 3, 
       sizeof(float) * width * 3, 
       1, 1, 
       0.0 
       ) 
      ); 

      iFile.setFrameBuffer(fb); 

      if (ReadImage(filename, iFile, dw.min.y, dw.max.y) == IEFileReadError) { 
       HDR_LOG("There was a generic error on loading the EXR image \"%s\". Image could be corrupted.", filename); 
       return (IEFileReadError); 
      } 

      image->unproc = 1; 

      return (IENoError); 
     } else { 
      char sChannels[2048] = { '\0' }; 

      for (ChannelList::ConstIterator it = iHeader.channels().begin(), ite = iHeader.channels().end(); it != ite; it++) { 
       strcat(sChannels, it.name()); 
       strcat(sChannels, " "); 
      } 

      HDR_LOG("Unable to open EXR file (unknown channels set: %s)", sChannels); 
      return (IEFileReadError); 
     } 
    } 

但我不知道这个库可以如何解码/转换的Y RY-GY图像(亮度+色度信道),并得到浮点RGB像素数据。

回答

0

看看Technical Introduction。有关于亮度/色度图像的部分。看起来存在三个通道:Y(亮度,单独用于灰度图像,或与RY和BY组合用于彩色图像),RY,BY(用于亮度/色度的色度)。

喜欢的东西

fb.insert("Y" /* <- channel name */, Slice(...) 

应该工作了。