Seite 1 von 1

QWidget Hindergrund Bild paintEvent, QRubberBand, Zoom

Verfasst: 17. März 2007 00:29
von patrik08
Es gibt massenweise qt QPainter beispiele in wiki und foren....

Aber einen einfachen Widget dass mann gebrauchen kann um
bilder darstellen mit Zoom (die auf qt4 gehen) .... noch niee gesehen..... und dazu noch Crop Coordinaten angeben kann in pixel .... sowie beim Drag Line viereck zeichen live angeben wie viel man raus-schneidet......

Bild

Zuerst dachte ich die neue QRubberBand class zu gebrauchen http://doc.trolltech.com/4.2/qrubberband.html aber zusammen mit paint event geht einfach nichts..... mehr :-(

Um es kurz zu sagen .... ein ganze Samstag nachmittag um dieses resultat zu painten.....

selber probieren ...... mit dem code...
http://ppk.ciz.ch/qt_c++/image_crop/Ima ... e_crop.zip

Um dann zu croppen ....
http://ppk.ciz.ch/qt_c++/image_crop/crop.cpp
http://ppk.ciz.ch/qt_c++/image_crop/crop.h
die crop class aus http://albumshaper.sourceforge.net/ habe noch nicht probiert ... aber geht sicher.... einmal wo man die koordinaten hat....

Verfasst: 23. März 2007 22:42
von lepsai
hm...

ich hab mir das angeschaut, was ist das denn für Käse?!

Nicht objekt-orientiert, funktioniert nur für RGB-Bilder, ineffizient implementiert, da das Kopieren sehr primitiv gemacht ist, es gibt memcpy() für sowas...


Für wen ist denn das gedacht? Den Text, den Du dazu geschrieben hast, dauert es länger zu lesen, als diese Funktionalität zu implementieren.

Verfasst: 24. März 2007 08:48
von patrik08
lepsai hat geschrieben:hm...
Für wen ist denn das gedacht? Den Text, den Du dazu geschrieben hast, dauert es länger zu lesen, als diese Funktionalität zu implementieren.
Motz .... motz ....

dieses eine QWidget ist ja auch ein teil von einer applikation ... um ein viereck mit der maus zu zeichen && ziehen das crop selber geht ja einfach won statten....

Code: Alles auswählen

original = original2.copy(TagliaPoi);   /* QRect TagliaPoi;   QPixmap original2;  */
TmpSave(); 
Was ich seit laenger auch gesucht habe un niee gefunden ist der sepia effekt auf einen bild...


Code: Alles auswählen


void Interface::populateFilter(QComboBox *comboBox)
{
    QPixmap pix(22, 22);
    
    QStringList colorNames = QColor::colorNames();
    comboBox->addItem(tr("Select a filter.."));
    pix.fill(QColor("grey"));
    comboBox->addItem(pix,tr("GreyScale"));
    comboBox->addItem(tr("RGB Swapped"));
    comboBox->addItem(tr("InvertPixels color"));
    pix.fill(QColor(162,128,101));
    comboBox->addItem(pix,tr("Colorize")+QString(" color="sepia""));
    comboBox->addItem(tr("Colorize")+QString(" color="mycolor""));
    
    foreach (QString name, colorNames) {  
         
         pix.fill(QColor(name));
        comboBox->addItem(pix,tr("Colorize")+QString(" color="%1"").arg(name));
    }
}



void Interface::applyFilter( QString filtername )
{
      QImage income(origImageFilename); 
      QImage base = income.convertToFormat(QImage::Format_RGB32);
      int newlarge = (original.width()/cento)*ratio;   /* % darstellung im ziel widged */
      int largeful = base.width();
      QPixmap result;
      if (base.isNull()) {
      return;
      }
      if (filtername == tr("Select a filter..")) {
      //////qDebug() << "### return " << filtername;
      return;
      }
      QColor gtr;
      comboBox_2->setCurrentIndex(0);
    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));

      qDebug() << "### filtername " << filtername;
      
      /* start to pray filter */
      if (filtername.contains(tr("Colorize"))) {
          const QString colorn = BraketName(filtername);
          
           if (colorn == "sepia") {
           gtr = QColor(162,128,101);
           } else if (colorn == "mycolor") {
           QApplication::restoreOverrideCursor(); 
           QColor col = QColorDialog::getColor(QColor("red"), this);
            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
           gtr = col;
           } else {
           gtr = QColor(colorn);
           }
          ///////////qDebug() << "### colorn " << colorn;
          int sepiaH, sepiaS, sepiaL;
          ///////QColor(162,128,101).getHsv( &sepiaH, &sepiaS, &sepiaL );
          gtr.getHsv( &sepiaH, &sepiaS, &sepiaL );
          //iterate over each selected scanline 
          int x, y, pixelLuminance;
          QRgb* rgb;
          QColor sepiaColor;
          uchar* scanLine;
    
    
          for( y=0; y<base.height(); y++)  {   
            scanLine = base.scanLine(y);
            for( x=0; x<base.width(); x++)
            {
              rgb = ((QRgb*)scanLine+x);
              pixelLuminance = (int) (0.2125*qRed(*rgb) + 0.7154*qGreen(*rgb) + 0.0721*qBlue(*rgb));
              sepiaColor.setHsv( sepiaH, sepiaS, pixelLuminance );      
              *rgb = sepiaColor.rgb();
            }
          }
          qDebug() << "### base.isNull() 1111  must see false!  " << base.isNull();
          result = QPixmap::fromImage(base);   
                
      } else if (filtername == tr("GreyScale")) {
          
          
          
          result = QPixmap::fromImage(GreyScale(base));
          
          
      } else if (filtername == tr("RGB Swapped")) {
          
               base.rgbSwapped();
               result = QPixmap::fromImage(base);

      } else if (filtername == tr("InvertPixels color")) {
          
               base.invertPixels();
               result = QPixmap::fromImage(base);
          
      } else {
          
          
       return;
      }
      
      original = result;
      
      qDebug() << "### base.isNull() 333  must see false!  " << result.isNull();
      
      
      display = result.scaledToWidth(newlarge,Qt::FastTransformation);
      wrapper->paint(display);
      UpdateNow();
    
    QApplication::restoreOverrideCursor();
      

 
                
}


extern inline  QImage GreyScale( QImage income )
{
    
    QImage base =  income.convertToFormat(QImage::Format_RGB32);
    for (int y = 0; y < base.height(); ++y) {
             for (int x = 0; x < base.width(); ++x) {
                 int pixel = base.pixel(x, y);
                 int gray = qGray(pixel);
                 int alpha = qAlpha(pixel);
                 base.setPixel(x, y, qRgba(gray, gray, gray, alpha));
             }
         }
         
    return base;
}




Verfasst: 24. März 2007 09:20
von lepsai
Na gut, ein Viereck kannste mit Hilfe von QGraphicsItem zeichnen, dann packste dieses und noch weitere 4 Rect-items, die zum Ziehen der Region dienen, in eine QGraphicsGroup, implementierst entsprechende Logik und fertig ist die Anzeige von AOI. Zur besseren Darstellung kann man auf den selektierten Bildbereich auch Filter anwenden, aber ist nich zwingend, Programme wie Photoshop, benutzen stattdessen animierte Regiondarstellung, die ziemlich billig umgesetzt werden kann...

Verfasst: 24. März 2007 10:02
von patrik08
lepsai hat geschrieben:Na gut, ein Viereck kannste mit Hilfe von QGraphicsItem zeichnen, dann packste dieses und noch weitere 4 Rect-items, die zum Ziehen der Region dienen, in eine QGraphicsGroup, implementierst entsprechende Logik und fertig ist die Anzeige von AOI. Zur besseren Darstellung kann man auf den selektierten Bildbereich auch Filter anwenden, aber ist nich zwingend, Programme wie Photoshop, benutzen stattdessen animierte Regiondarstellung, die ziemlich billig umgesetzt werden kann...
Das sieht sehr einfach in der teorie aus ..... mache doch einene brauchbares beispiel mit dem QGraphicsItem Viereck zum zeichnen und verschieben... (CTRL + mouse schieben ) ...

Wie den html-editor http://ppk.ciz.ch/win_build/xhtml_edit/ ... taller.exe auf window.

bild screenshoot http://ppk.ciz.ch/win_build/xhtml_edit/image_3.JPG

oder auf linux:
svn co https://qt-webdav.svn.sourceforge.net/s ... ml_editor/ html_edit

cd html_edit && qmake && make
./edithtml

einfach ein bild reinziehn oder copy paste ... und doppelckick oder rechtsclik auf bild um dass bild zu editieren....
ein bild bekommt man auch mit openoffice 2 calc alles markieren kopieren && im html_edit reinkopieren... paste...


Ich habe gesehen wenn mann der QPainter offen hat und QRubberBand gebraucht sturtz alles ab... beide zusammen geht nicht....

Verfasst: 24. März 2007 11:49
von lepsai
ok, werde ich morgen posten, bin grade nicht zu Hause...

Verfasst: 13. April 2007 17:41
von 3DH
Hi,

also ich finds zumindest interessant - hatte damals für Qt 2 und 3 mal ein eigenes Widget für Bildanzeige mit RubberBand, Cropping, Rotation usw. geschrieben - doch für Qt 4 fehlt mir das völlig.

Portieren kann ich mein altes Widget nicht, da
a) die benötigten Bildverarb.Libs nicht mehr genutzt werden können/dürfen und
b) Qt 4 viele Sachen nicht mehr erlaubt (siehe probs / komplett anderes Verhalten von paintEvents etc.)

Also:
Wenn ihr wat habt, wär ich interessiert...

ciao,
3DH

Verfasst: 13. April 2007 20:05
von lepsai
ja, werde ich demnächst posten, hab jetzt viel um die ohren, ein bisschen Geduld bitte....

Verfasst: 26. Juni 2008 15:23
von patrik08
lepsai hat geschrieben:ja, werde ich demnächst posten, hab jetzt viel um die ohren, ein bisschen Geduld bitte....
Ich habe es nun selber gemacht, da ich heute sowas brauchte....

ist nicht anders als ein QWidget in einem QScrollArea

demo....

http://ppk.ciz.ch/qt_c++/qt_utils/QRubberBand.zip 55kb

es geht

Code: Alles auswählen


EditorPics::EditorPics( QWidget* parent )
	: QWidget( parent ),pic(QPixmap("a.png")),Xcut(false),NopermissionReselection(false),LastAngleRotate(0)
{
	Selection = QRect(0,0,0,0);
	OriginalCopypic = pic;
	QDateTime timer1( QDateTime::currentDateTime() );
  bakk = BruschChess(100.);
	populateFilter();
	hystory.insert(timer1.toTime_t(),OriginalCopypic);   /* small undo */
	rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
	rubberBand->hide();
  setMinimumSize(sizeHint());
	setMaximumSize(sizeHint());
}

void EditorPics::mousePressEvent ( QMouseEvent * e ) 
{
	NopermissionReselection = e->buttons() == Qt::LeftButton?  false : true;
	rubberBand->hide();
	if (!NopermissionReselection) {
		/* contex menu no left */
						origin = e->pos();
						Selection = QRect(0,0,0,0);
             if (rubberBand && pic.rect().contains(origin)) {
                 rubberBand->setGeometry(QRect(origin, QSize(0,0)));
                 rubberBand->show();
							   e->accept();
						 } 
	}
						 
QWidget::mousePressEvent(e);
}

void EditorPics::mouseMoveEvent(QMouseEvent *e)
{
	if (!NopermissionReselection) {
		rubberBand->setGeometry(QRect(origin, e->pos()).normalized());
	  e->accept();
	}
   QWidget::mouseMoveEvent(e);
}

void EditorPics::mouseReleaseEvent ( QMouseEvent * e )  
{
	if (!NopermissionReselection) {
		 Selection = QRect(origin,rubberBand->size());
	   e->accept();
	}
  QWidget::mouseReleaseEvent(e);
}

void EditorPics::keyPressEvent ( QKeyEvent * e )
{
	
	if (e == QKeySequence::Paste) {
	Xcut = false;
	PasteImg();
	rubberBand->hide();
	Selection = QRect(0,0,0,0);
	update();
	return;
	}
	if (e == QKeySequence::Cut) {
	Xcut = true;   /* display copy section on paint */
	CopyImg();   
	rubberBand->show();
	update();
	return;
	}
	if (e == QKeySequence::Copy) {
	CopyImg();   
	Xcut = true;  /* display copy section on paint */
	update();
	rubberBand->show();
	return;
	}
	if (e == QKeySequence::Undo  || 
		  e == QKeySequence::HelpContents || 
	    e == QKeySequence::New) {   /////ctrl Z
		UndoImg();   /* insert from last hystory*/
	}
	Xcut = false;
	rubberBand->hide();
	update();
	emit newSize();
}