Beispiel #1
0
void Z3DCanvasRenderer::renderInportToImage(const QString &filename, Z3DEye eye)
{
  const Z3DTexture* tex = getImageColorTexture(eye);
  if (!tex) {
    throw Exception("not ready to capture image");
  }
  GLenum dataFormat = GL_BGRA;
  GLenum dataType = GL_UNSIGNED_INT_8_8_8_8_REV;

  if (eye == CenterEye) {
    ZSharedPointer<uint8_t> colorBuffer(new uint8_t[tex->getBypePerPixel(dataFormat, dataType) * tex->getNumPixels()], array_deleter<uint8_t>());
    tex->downloadTextureToBuffer(dataFormat, dataType, colorBuffer.get());
    QImage upsideDownImage(colorBuffer.get(), tex->getWidth(), tex->getHeight(),
                           QImage::Format_ARGB32_Premultiplied);
    QImage image = upsideDownImage.mirrored(false, true);

    if (!ZImage::writeImage(image, filename)) {
      throw Exception("Image writing error");
    }
  } else if (eye == RightEye) {
    const Z3DTexture* leftTex = getImageColorTexture(LeftEye);
    if (!leftTex) {
      throw Exception("not ready to capture image");
    }
    ZSharedPointer<uint8_t> colorBuffer(new uint8_t[leftTex->getBypePerPixel(dataFormat, dataType) * leftTex->getNumPixels()], array_deleter<uint8_t>());
    leftTex->downloadTextureToBuffer(dataFormat, dataType, colorBuffer.get());
    QImage sideBySideImage(tex->getWidth() * 2, tex->getHeight(), QImage::Format_ARGB32_Premultiplied);
    QPainter painter(&sideBySideImage);
    painter.scale(1, -1);
    painter.translate(0, -tex->getHeight());
    QImage upsideDownImageLeft(colorBuffer.get(), tex->getWidth(), tex->getHeight(),
                               QImage::Format_ARGB32_Premultiplied);
    painter.drawImage(0, 0, upsideDownImageLeft);
    tex->downloadTextureToBuffer(dataFormat, dataType, colorBuffer.get());
    QImage upsideDownImageRight(colorBuffer.get(), tex->getWidth(), tex->getHeight(),
                                QImage::Format_ARGB32_Premultiplied);
    painter.drawImage(tex->getWidth(), 0, upsideDownImageRight);

    if (m_renderToImageType == HalfSideBySideStereoView) {
      QImage halfSideBySideImage = sideBySideImage.scaled(
            tex->getWidth(), tex->getHeight(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
      QImageWriter writer(filename);
      writer.setCompression(1);
      if(!writer.write(halfSideBySideImage)) {
        throw Exception(writer.errorString().toStdString());
      }
    } else {
      QImageWriter writer(filename);
      writer.setCompression(1);
      if(!writer.write(sideBySideImage)) {
        throw Exception(writer.errorString().toStdString());
      }
    }
  }
}
void Z3DCanvasRenderer::renderInportToImage(const QString &filename, Z3DEye eye)
{
  if (eye == CenterEye) {
    //if (m_inport.isReady()) {
    // get color buffer content
    glm::detail::tvec4<uint8_t,glm::highp>* colorBuffer = readBGRAColorBuffer<uint8_t>(eye);
    //if (colorBuffer) {
    glm::ivec2 size = m_inport.getSize();
    QImage upsideDownImage((const uchar*)colorBuffer, size.x, size.y,
                           QImage::Format_ARGB32_Premultiplied);
    QImage image = upsideDownImage.mirrored(false, true);
    QImageWriter writer(filename);
    writer.setCompression(1);
    if (!writer.write(image)) {
      writer.setCompression(0);
      if (!writer.write(image)) {
        if (ZFileType::fileType(filename.toStdString()) == ZFileType::TIFF_FILE) {
          Stack *stack = C_Stack::make(COLOR, image.width(), image.height(), 1);
          color_t *arrayc = (color_t*) stack->array;
          size_t index = 0;
          for (int y = 0; y < image.height(); ++y) {
            for (int x = 0; x < image.width(); ++x) {
              QRgb color = image.pixel(x, y);
              arrayc[index][0] = qRed(color);
              arrayc[index][1] = qGreen(color);
              arrayc[index][2] = qBlue(color);

              index++;
            }
          }
          C_Stack::write(filename.toStdString(), stack);
          C_Stack::kill(stack);
        } else {
          //LERROR() << writer.errorString();
          delete[] colorBuffer;
          throw Exception(writer.errorString().toStdString());
        }
      }
    }
    delete[] colorBuffer;
    //}
    //}
  } else if (eye == RightEye) {
    glm::detail::tvec4<uint8_t,glm::highp>* colorBuffer = readBGRAColorBuffer<uint8_t>(LeftEye);
    glm::ivec2 size = m_rightEyeInport.getSize();
    QImage sideBySideImage(size.x * 2, size.y, QImage::Format_ARGB32_Premultiplied);
    QPainter painter(&sideBySideImage);
    painter.scale(1, -1);
    painter.translate(0, -size.y);
    QImage upsideDownImageLeft((const uchar*)colorBuffer, size.x, size.y,
                               QImage::Format_ARGB32_Premultiplied);
    painter.drawImage(0, 0, upsideDownImageLeft);
    delete[] colorBuffer;
    colorBuffer = readBGRAColorBuffer<uint8_t>(RightEye);
    QImage upsideDownImageRight((const uchar*)colorBuffer, size.x, size.y,
                                QImage::Format_ARGB32_Premultiplied);
    painter.drawImage(size.x, 0, upsideDownImageRight);
    delete[] colorBuffer;

    if (m_renderToImageType == HalfSideBySideStereoView) {
      QImage halfSideBySideImage = sideBySideImage.scaled(
            size.x, size.y, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
      QImageWriter writer(filename);
      writer.setCompression(1);
      if(!writer.write(halfSideBySideImage)) {
        //LERROR() << writer.errorString();
        throw Exception(writer.errorString().toStdString());
      }
    } else {
      QImageWriter writer(filename);
      writer.setCompression(1);
      if(!writer.write(sideBySideImage)) {
        //LERROR() << writer.errorString();
        throw Exception(writer.errorString().toStdString());
      }
    }
  }
}