QWidget Hindergrund Bild paintEvent, QRubberBand, Zoom

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 11:48
Wohnort: DE Freiburg

QWidget Hindergrund Bild paintEvent, QRubberBand, Zoom

Beitrag von patrik08 » 17. März 2007 01:29

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....
.........................
speack português italiano deutsch english castellà qt

lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai » 23. März 2007 23:42

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.

patrik08
Beiträge: 746
Registriert: 27. Februar 2006 11:48
Wohnort: DE Freiburg

Beitrag von patrik08 » 24. März 2007 09:48

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



.........................
speack português italiano deutsch english castellà qt

lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai » 24. März 2007 10:20

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...

patrik08
Beiträge: 746
Registriert: 27. Februar 2006 11:48
Wohnort: DE Freiburg

Beitrag von patrik08 » 24. März 2007 11:02

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....
.........................
speack português italiano deutsch english castellà qt

lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai » 24. März 2007 12:49

ok, werde ich morgen posten, bin grade nicht zu Hause...

3DH
Beiträge: 10
Registriert: 20. Dezember 2006 14:49
Wohnort: Schwerin
Kontaktdaten:

Beitrag von 3DH » 13. April 2007 17:41

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

lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai » 13. April 2007 20:05

ja, werde ich demnächst posten, hab jetzt viel um die ohren, ein bisschen Geduld bitte....

patrik08
Beiträge: 746
Registriert: 27. Februar 2006 11:48
Wohnort: DE Freiburg

Beitrag von patrik08 » 26. Juni 2008 15:23

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

.........................
speack português italiano deutsch english castellà qt

Antworten