QWidget Hindergrund Bild paintEvent, QRubberBand, Zoom
QWidget Hindergrund Bild paintEvent, QRubberBand, Zoom
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......
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....
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......
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
speack português italiano deutsch english castellà qt
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.
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.
Motz .... motz ....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.
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();
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
speack português italiano deutsch english castellà qt
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 ) ...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...
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
speack português italiano deutsch english castellà qt
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
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
Ich habe es nun selber gemacht, da ich heute sowas brauchte....lepsai hat geschrieben:ja, werde ich demnächst posten, hab jetzt viel um die ohren, ein bisschen Geduld bitte....
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
speack português italiano deutsch english castellà qt