bool Object::exportFrames( int frameStart, int frameEnd, Layer* currentLayer, QSize exportSize, QString filePath, const char* format, int quality, bool background, bool antialiasing, QProgressDialog* progress = NULL, int progressMax = 50 ) { QSettings settings( "Pencil", "Pencil" ); QString extension = ""; QString formatStr = format; if ( formatStr == "PNG" || formatStr == "png" ) { format = "PNG"; extension = ".png"; } if ( formatStr == "JPG" || formatStr == "jpg" || formatStr == "JPEG" || formatStr == "jpeg" ) { format = "JPG"; extension = ".jpg"; background = true; // JPG doesn't support transparency so we have to include the background } if ( filePath.endsWith( extension, Qt::CaseInsensitive ) ) { filePath.chop( extension.size() ); } //qDebug() << "format =" << format << "extension = " << extension; qDebug() << "Exporting frames from " << frameStart << "to" << frameEnd << "at size " << exportSize; for ( int currentFrame = frameStart; currentFrame <= frameEnd; currentFrame++ ) { if ( progress != NULL ) progress->setValue( ( currentFrame - frameStart )*progressMax / ( frameEnd - frameStart ) ); QImage tempImage( exportSize, QImage::Format_ARGB32_Premultiplied ); QPainter painter( &tempImage ); // Make sure that old frame is erased before exporting a new one tempImage.fill( 0x00000000 ); QRect viewRect = ( ( LayerCamera* )currentLayer )->getViewRect(); QTransform mapView = RectMapTransform( viewRect, QRectF( QPointF( 0, 0 ), exportSize ) ); mapView = ( ( LayerCamera* )currentLayer )->getViewAtFrame( currentFrame ) * mapView; painter.setWorldTransform( mapView ); paintImage( painter, currentFrame, background, antialiasing ); QString frameNumberString = QString::number( currentFrame ); while ( frameNumberString.length() < 4 ) { frameNumberString.prepend( "0" ); } tempImage.save( filePath + frameNumberString + extension, format, quality ); } return true; }
bool Editor::exportSeqCLI( QString filePath = "", QString format = "PNG" ) { int width = mScribbleArea->getViewRect().toRect().width(); int height = mScribbleArea->getViewRect().toRect().height(); QSize exportSize = QSize( width, height ); QByteArray exportFormat( format.toLatin1() ); QTransform view = RectMapTransform( mScribbleArea->getViewRect(), QRectF( QPointF( 0, 0 ), exportSize ) ); view = mScribbleArea->getView() * view; int projectLength = layers()->projectLength(); mObject->exportFrames( 1, projectLength, layers()->currentLayer(), exportSize, filePath, exportFormat, -1, false, true, NULL, 0 ); return true; }
bool Object::exportX( int frameStart, int frameEnd, QTransform view, QSize exportSize, QString filePath, bool antialiasing ) { QSettings settings( "Pencil", "Pencil" ); int page; page = 0; for ( int j = frameStart; j <= frameEnd; j = j + 15 ) { QImage xImg( QSize( 2300, 3400 ), QImage::Format_ARGB32_Premultiplied ); QPainter xPainter( &xImg ); xPainter.fillRect( 0, 0, 2300, 3400, Qt::white ); int y = j - 1; for ( int i = j; i < 15 + page * 15 && i <= frameEnd; i++ ) { QRect source = QRect( QPoint( 0, 0 ), exportSize ); QRect target = QRect( QPoint( ( y % 3 ) * 800 + 30, ( y / 3 ) * 680 + 50 - page * 3400 ), QSize( 640, 480 ) ); QTransform thumbView = view * RectMapTransform( source, target ); xPainter.setWorldTransform( thumbView ); xPainter.setClipRegion( thumbView.inverted().map( QRegion( target ) ) ); paintImage( xPainter, i, false, antialiasing ); xPainter.resetMatrix(); xPainter.setClipping( false ); xPainter.setPen( Qt::black ); xPainter.setFont( QFont( "helvetica", 50 ) ); xPainter.drawRect( target ); xPainter.drawText( QPoint( ( y % 3 ) * 800 + 35, ( y / 3 ) * 680 + 65 - page * 3400 ), QString::number( i ) ); y++; } if ( filePath.endsWith( ".jpg", Qt::CaseInsensitive ) ) { filePath.chop( 4 ); } if ( !xImg.save( filePath + QString::number( page ) + ".jpg", "JPG", 60 ) ) { return false; } page++; } return true; }
void MainWindow2::exportImage() { QSettings settings( PENCIL2D, PENCIL2D ); // Get the camera layer Layer *cameraLayer = mEditor->layers()->currentLayer(); if (cameraLayer->type() != Layer::CAMERA) { QMessageBox::warning( this, tr( "Error" ), tr( "You must select a Camera Layer to export an image." ), QMessageBox::Ok, QMessageBox::Ok ); return;// false; } // Options auto dialog = new ExportImageSeqDialog( this ); OnScopeExit( dialog->deleteLater() ); dialog->setExportSize( mScribbleArea->getViewRect().toRect().size() ); dialog->exec(); QSize exportSize = dialog->getExportSize(); QString exportFormat = dialog->getExportFormat(); bool useTranparency = dialog->getTransparency(); if ( dialog->result() == QDialog::Rejected ) { return; // false; } // Path QString initPath = settings.value( "lastExportPath", QDir::homePath() + "/untitled.png" ).toString(); QFileInfo info( initPath ); initPath = info.path() + "/" + info.baseName() + "." + exportFormat.toLower(); QString filePath = QFileDialog::getSaveFileName( this, tr( "Save Image" ), initPath); if ( filePath.isEmpty() ) { qDebug() << "empty file"; return;// false; } settings.setValue( "lastExportPath", QVariant( filePath ) ); // Export QTransform view = RectMapTransform( mScribbleArea->getViewRect(), QRectF( QPointF( 0, 0 ), exportSize ) ); // view = mScribbleArea->getView() * view; int projectLength = mEditor->layers()->projectLength(); if ( !mEditor->object()->exportIm( mEditor->currentFrame(), projectLength, view, exportSize, filePath, exportFormat, true, useTranparency ) ) { QMessageBox::warning( this, tr( "Warning" ), tr( "Unable to export image." ), QMessageBox::Ok, QMessageBox::Ok ); return;// false; } return; // true; }
bool Object::exportFrames1( ExportFrames1Parameters par ) { int frameStart = par.frameStart; int frameEnd = par.frameEnd; QTransform view = par.view; Layer* currentLayer = par.currentLayer; QSize exportSize = par.exportSize; QString filePath = par.filePath; const char* format = par.format; int quality = par.quality; bool background = par.background; bool antialiasing = par.antialiasing; QProgressDialog* progress = par.progress; int progressMax = par.progressMax; int fps = par.fps; int exportFps = par.exportFps; int frameRepeat; int frameReminder, frameReminder1; int framePutEvery, framePutEvery1; int frameSkipEvery, frameSkipEvery1; int frameNumber; int framePerSecond; QSettings settings( "Pencil", "Pencil" ); QString extension = ""; QString formatStr = format; if ( formatStr == "PNG" || formatStr == "png" ) { format = "PNG"; extension = ".png"; } if ( formatStr == "JPG" || formatStr == "jpg" || formatStr == "JPEG" ) { format = "JPG"; extension = ".jpg"; background = true; // JPG doesn't support transparency so we have to include the background } if ( filePath.endsWith( extension, Qt::CaseInsensitive ) ) { filePath.chop( extension.size() ); } //qDebug() << "format =" << format << "extension = " << extension; qDebug() << "Exporting frames from " << frameStart << "to" << frameEnd << "at size " << exportSize; convertNFrames( fps, exportFps, &frameRepeat, &frameReminder, &framePutEvery, &frameSkipEvery ); qDebug() << "fps " << fps << " exportFps " << exportFps << " frameRepeat " << frameRepeat << " frameReminder " << frameReminder << " framePutEvery " << framePutEvery << " frameSkipEvery " << frameSkipEvery; frameNumber = 0; framePerSecond = 0; frameReminder1 = frameReminder; framePutEvery1 = framePutEvery; frameSkipEvery1 = frameSkipEvery; for ( int currentFrame = frameStart; currentFrame <= frameEnd; currentFrame++ ) { if ( progress != NULL ) progress->setValue( ( currentFrame - frameStart )*progressMax / ( frameEnd - frameStart ) ); QImage tempImage( exportSize, QImage::Format_ARGB32_Premultiplied ); QPainter painter( &tempImage ); // Make sure that old frame is erased before exporting a new one tempImage.fill( 0x00000000 ); if ( currentLayer->type() == Layer::CAMERA ) { QRect viewRect = ( ( LayerCamera* )currentLayer )->getViewRect(); QTransform mapView = RectMapTransform( viewRect, QRectF( QPointF( 0, 0 ), exportSize ) ); mapView = ( ( LayerCamera* )currentLayer )->getViewAtFrame( currentFrame ) * mapView; painter.setWorldTransform( mapView ); } else { painter.setTransform( view ); } paintImage( painter, currentFrame, background, antialiasing ); frameNumber++; framePerSecond++; QString frameNumberString = QString::number( frameNumber ); while ( frameNumberString.length() < 4 ) frameNumberString.prepend( "0" ); tempImage.save( filePath + frameNumberString + extension, format, quality ); int delta = 0; if ( framePutEvery ) { framePutEvery1--; qDebug() << "-->framePutEvery1" << framePutEvery1; if ( framePutEvery1 ) { delta = 0; } else { delta = 1; framePutEvery1 = framePutEvery; } } if ( frameSkipEvery ) { frameSkipEvery1--; qDebug() << "-->frameSkipEvery1" << frameSkipEvery1; if ( frameSkipEvery1 ) { delta = 1; } else { delta = 0; frameSkipEvery1 = frameSkipEvery; } } if ( frameReminder1 ) { frameReminder1 -= delta; } else { delta = 0; } for ( int i = 0; ( i < frameRepeat - 1 + delta ) && ( framePerSecond < exportFps ); i++ ) { frameNumber++; framePerSecond++; QString frameNumberLink = QString::number( frameNumber ); while ( frameNumberLink.length() < 4 ) frameNumberLink.prepend( "0" ); tempImage.save( filePath + frameNumberLink + extension, format, quality ); } if ( framePerSecond == exportFps ) { framePerSecond = 0; frameReminder1 = frameReminder; framePutEvery1 = framePutEvery; frameSkipEvery1 = frameSkipEvery; } } // XXX no error handling yet return true; }