Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/06/2014, 13:20
alvarogt91
 
Fecha de Ingreso: junio-2014
Ubicación: San Vicente del Raspeig
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Pregunta Marcos con croma Qt designer C++

Hola! tengo un problema a la hora de manejar un complemento de mi programa de croma.
El programa consiste en cargar una imagen de fondo, un marco con croma (zona en verde puro) y manejar una serie de sliders horizontales y verticales a modo de zoom para situar la imagen de fondo dentro del marco como nos interesa.

El caso es que a la hora de manejar el zoom puedo aumentar la escala de la imagen, pero no disminuirla.

ENUNCIADO:
En este ejercicio vamos a realizar un programa para componer imágenes usando el efecto croma. En concreto, el usuario podrá cargar en la aplicación dos imágenes, una foto y un marco, donde el marco vendrá preparado con la zona del croma en verde puro:Claro está, las imágenes no tienen la misma resolución y la zona de la cara no tiene por qué coincidir con la del croma en el marco. Por ello, la aplicación contendrá los controles para trasladar la imagen en horizontal y vertical o escalarla:
La imagen de trabajo de la aplicación será de 800x600 píxeles. La imagen de marco se debe escalar con esas proporciones, mientras que las proporciones de la foto vendrán ajustadas por el usuario. Como vemos, el programa debe ser capaz de componer las dos imágenes, colocando una sobre otra en función de la posición determinada por el usuario y sustituyendo los píxeles verdes del marco por los de la foto.
El menú principal contendrá un submenú fichero, con el que podremos cargar las imágenes (foto y marco), grabar en disco la composición actual o salir y un submenú About que mostrará el nombre de los autores de la práctica.
Como vemos, la posición y escala de la foto se maneja con sliders y un botón central para restaurar escala y posición a sus valores predeterminados.
Junto con el enunciado de la práctica se adjuntan distintos archivos con los recursos necesarios (iconos, marcos y fotos). Para crear tus propios marcos y fotos, se recomienda el formato bmp y una resolución no mayor de 800x600. En general, se debe usar un formato sin compresión para que el color del croma sea lo más puro posible.
Código
Código C++:
Ver original
  1. <mainwindow.ui>
  2. #ifndef MAINWINDOW_H
  3. #define MAINWINDOW_H
  4.  
  5. #include <QMainWindow>
  6. //para seleccionar origen de archivo a abrir
  7. #include <QFileDialog>
  8. //para cargar imagenes y proporciones
  9. #include <QPixmap>
  10. //para ver cantidades de color
  11. #include <QColor>
  12. //para transparencias de foto
  13. #include <QPainter>
  14.  
  15. #include <iostream>//libreria pruebas
  16. using namespace std;
  17.  
  18. namespace Ui {
  19. class MainWindow;
  20. }
  21.  
  22. class MainWindow : public QMainWindow
  23. {
  24.     Q_OBJECT
  25.  
  26. public:
  27.     explicit MainWindow(QWidget *parent = 0);
  28.     ~MainWindow();
  29.  
  30. private slots:
  31.     void on_horizontalSlider_valueChanged(int value);
  32.     void on_verticalSlider_valueChanged(int value);
  33.     void on_horizontalSlider_2_sliderMoved(int position);
  34.     void on_actionSalir_triggered();
  35.     void on_actionAcerca_de_triggered();
  36.     void croma();
  37.     void on_pushButton_clicked();
  38.     void on_actionCargar_triggered();
  39.     //void rellenarimagen();
  40.  
  41. private:
  42.     Ui::MainWindow *ui;
  43.     QFile file;
  44.  
  45.     QPixmap Img,nuevo,nuevo2,nuevo3,nuevo3copia,nuevocopia,nuevocopia2;
  46.     //Img auxiliar para las escalas
  47.     //nuevo,nuevo2 imagenes originales
  48.     //nuevo3 nuestra resultante
  49.     //nuevo3copia y nuevocopia cpoias con las que trabajar
  50.     QImage imagen1,imagen2,resul,resulzoom;
  51.     QRgb color;
  52.     QPainter painter;
  53.     int rojo,verde,azul;
  54.     float proporcion,a,b;
  55.  
  56. };
  57.  
  58. #endif // MAINWINDOW_H
  59. ---------------------------------------------------------------------------------------------
  60. <main.cpp>
  61. #include "mainwindow.h"
  62. #include <QApplication>
  63.  
  64. int main(int argc, char *argv[])
  65. {
  66.     QApplication a(argc, argv);
  67.     MainWindow w;
  68.     w.show();
  69.  
  70.     return a.exec();
  71. }
  72. ---------------------------------------------------------------------------------------------
  73. <mainwindow.cpp>
  74. #include "mainwindow.h"
  75. #include "ui_mainwindow.h"
  76. #include <QMessageBox>
  77.  
  78.  
  79. MainWindow::MainWindow(QWidget *parent) :
  80.     QMainWindow(parent),
  81.     ui(new Ui::MainWindow)
  82. {//constructor defecto
  83.     ui->setupUi(this);
  84. }
  85.  
  86. MainWindow::~MainWindow()
  87. {//destructor
  88.     delete ui;
  89. }
  90. //croma
  91. void MainWindow::croma(){
  92.     for(int i=0;i<nuevo2.width();i++){
  93.         for(int j=0;j<nuevo2.height();j++){
  94.             color=imagen1.pixel(i,j);
  95.             verde=qGreen(color);
  96.             rojo= qRed(color);
  97.             azul=qBlue(color);
  98.             //no me sale de otra manera menos patatera
  99.             if (verde==255&&azul<=30&&rojo<=30){
  100.             }else{
  101.                 resul.setPixel(i,j,color);
  102.             }
  103.         }
  104.     }
  105. }
  106.  
  107. //cargamos el marco y la foto
  108. void MainWindow::on_actionCargar_triggered()
  109. {
  110.         QMessageBox::information(NULL,"Cargando...","Imagen base","Aceptar");
  111.  
  112.         QString s = QFileDialog::getOpenFileName(this, "Cargar", NULL, "*.bmp");
  113.         if(!s.isEmpty()) {
  114.             Img.load(s);
  115.         }
  116.  
  117.         if(!Img.isNull()) {
  118.             nuevo = Img.scaled(451,341);//escalo la imagen
  119.             ui->label_3->setPixmap(nuevo);
  120.         }
  121.  
  122.         QMessageBox::information(NULL,"Cargando...","Marco","Aceptar");
  123.         s = QFileDialog::getOpenFileName(this, "Cargar", NULL, "*.bmp");
  124.         if(!s.isEmpty()) {
  125.             Img.load(s);
  126.         }
  127.         if(!nuevo.isNull()){
  128.             nuevo2 = Img.scaled(451,341);//escalo la imagen
  129.             imagen1= nuevo2.toImage();
  130.             //imagen copia a modificar
  131.             resul=nuevo.toImage();
  132.             croma();
  133.  
  134.         }
  135.         nuevo3= QPixmap::fromImage(resul);
  136.         ui->label_3->setPixmap(nuevo3);
  137. }
  138. //boton de reiniciar
  139. void MainWindow::on_pushButton_clicked()
  140. {
  141.     ui->label_3->clear();
  142.     ui->label_3->setPixmap(nuevo3);
  143. }
  144. //Acerca de
  145. void MainWindow::on_actionAcerca_de_triggered()
  146. {
  147.     QMessageBox::information(NULL,"Creado por"," Alvaro","Aceptar");
  148. }
  149. //Salir del programa
  150. void MainWindow::on_actionSalir_triggered()
  151. {
  152.     qApp->exit();
  153. }
  154. /*
  155. //rellenar el resto de la imagen
  156. void MainWindow::rellenarimagen(){
  157.     nuevocopia=nuevo.scaled(a,b);
  158.     imagen1=nuevocopia.toImage();
  159.     nuevocopia2=QPixmap(451,341);
  160.     nuevocopia2.fill(Qt::gray);
  161.     resulzoom=nuevocopia2.toImage();
  162.     for(int i=0;i<nuevocopia2.width();i++){
  163.         for(int j=0;j<nuevocopia2.height();j++){
  164.             color=imagen1.pixel(i,j);
  165.             resulzoom.setPixel(i,j,color);
  166.         }
  167.     }
  168. }*/
  169. //barra horizontal para cambiar el zoom
  170. void MainWindow::on_horizontalSlider_2_sliderMoved(int position)
  171. {
  172.     ui->label_3->clear();
  173.     a=position*451*0.2;
  174.     b=position*341*0.2;
  175.     nuevocopia=nuevo.scaled(a,b);
  176.  
  177.  
  178.     nuevocopia2=nuevocopia.copy(0,0,451,341);
  179.     resul=nuevocopia2.toImage();
  180.     for(int i=0;i<nuevo2.width();i++){
  181.         for(int j=0;j<nuevo2.height();j++){
  182.             color=imagen1.pixel(i,j);
  183.             verde=qGreen(color);
  184.             rojo= qRed(color);
  185.             azul=qBlue(color);
  186.             if (verde==255&&azul<=30&&rojo<=30){
  187.             }else{
  188.                 resul.setPixel(i,j,color);
  189.             }
  190.         }
  191.     }
  192.     nuevo3copia= QPixmap::fromImage(resul);
  193.     ui->label_3->setPixmap(nuevo3copia);
  194. }
  195.  
  196. //desplazamiento vertical
  197. void MainWindow::on_verticalSlider_valueChanged(int value)
  198. {
  199.  
  200. }
  201. //despalzamiento horizontal
  202. void MainWindow::on_horizontalSlider_valueChanged(int value)
  203. {
  204.     for(int i=0;i<nuevo2.width();i++){
  205.         for(int j=0;j<nuevo2.height();j++){
  206.             color=imagen1.pixel(i,j);
  207.             verde=qGreen(color);
  208.             rojo= qRed(color);
  209.             azul=qBlue(color);
  210.             //no me sale de otra manera menos patatera
  211.             if (verde==255&&azul<=30&&rojo<=30){
  212.             }else{
  213.                 resul.setPixel(i,j,color);
  214.             }
  215.         }
  216.     }
  217.     //nuevo3copia.transformed();
  218. }