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()); } } } }