QImage pixelmanipulation

Alles rund um die Programmierung mit Qt
Antworten
PeterPan200
Beiträge: 18
Registriert: 19. März 2007 22:20

QImage pixelmanipulation

Beitrag von PeterPan200 »

Guten Morgen!

Erstmal Vielen Dank an Alle, die mir bei den vorherigen Problemen geholfen haben.
Jetzt habe ich folgendes auf dem Herzen: Ich lese mein Image ein und gib diverse Informationen zurück, wie z.b. Länge, Breite, Farbtiefe, Spaltenanzehl usw.!!

Code: Alles auswählen

	for ( int y=0; y<DpScreen.height(); y++ ) 
	{ 	   
		for (int x=0; x<DpScreen.width(); x++ )
			{
				int pixel = DpScreen.pixel(x, y);
//				cout <<"Pixel des Bildes:" "Position Y:"<<y<<"PostionX:"<<x<<pixel <<endl;
				int red = qRed(pixel);
				int green = qGreen(pixel);
				int blue = qBlue(pixel);
Mein Frage: Wie kann ich in meinem Image alle grünen Pixel durch (z.b) rote ersetzen??
Ich habe es folgendermaßen versucht:

Code: Alles auswählen

	if(green > 2)
					{
						green = 1;
//						
						DpScreen.setPixel(x, y, qRgb(red, green, blue)); 		
					}
Ich möchte dass alles genau so bleibt,es sollen nur die grünen Pixel durch eine andere Farbe ersetzt werden!! Bei meinem Code bekomm ich ein schwarzes Bild zurück!!
:cry:

Vielen Dank für die Hilfe!
LG
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: QImage pixelmanipulation

Beitrag von patrik08 »

PeterPan200 hat geschrieben:Guten Morgen!

Erstmal Vielen Dank an Alle, die mir bei den vorherigen Problemen geholfen haben.
Ich möchte dass alles genau so bleibt,es sollen nur die grünen Pixel durch eine andere Farbe ersetzt werden!! Bei meinem Code bekomm ich ein schwarzes Bild zurück!!
:cry:
Vielen Dank für die Hilfe!
LG
Das geht nicht ... du kannst die farben invertieren ... oder zu grau stufen machen .... oder dass bild faerben zu rot gruen ... oder tausende von andere..... der alpha kanal mit der bild informationen ... bleibt jedoch fast erhalten.... sonst ist ja dass bild zerstoert....

ein combobox mit den farben fuellen....

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

und die methoden....

Code: Alles auswählen


void Interface::applyFilter( QString filtername )
{
      QImage income(origImageFilename); 
      QImage base = income.convertToFormat(QImage::Format_RGB32);
      int newlarge = (original.width()/cento)*ratio;
      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;
}

/* die color name wieder raus holen ... kann man ja auch in qvariant den color setzen ....*/
extern inline QString BraketName( QString braket )
{
    QString name = braket;
    QRegExp expression( "color=["\'](.*)["\']", Qt::CaseInsensitive );
    
    int iPosition = 0;
    while( (iPosition = expression.indexIn( braket , iPosition )) != -1 ) {
        name = expression.cap( 1 );
        iPosition += expression.matchedLength();
    }
return name;
}

.........................
speack português italiano deutsch english castellà qt
PeterPan200
Beiträge: 18
Registriert: 19. März 2007 22:20

Beitrag von PeterPan200 »

Ich habe's!!!! :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

p.s. (Einfach Klasse, wenn sich einer sooooo gut mit Bildbearbeitung + Qt auskennt)!!

Vielen Dank patrik08!!!
Antworten