Habe hier ien kleines Problem mit der scanLine() Fkt.
Ich möchte gerne einen bestimmten Bereich eines Bildes pixelweise auslesen und den Kontrast für diesen Bereich ändern. Anfangs habe ich das ganze über pixel() und setPixel() gemacht, was mir aber zu lange gedauert hat. Deswegen möchte ich nun direkt auf den Speicher des Bildes zugreifen.
Ich komme einfach nicht darauf was ich in meinem Code falsch mache. Ich habe mir schon bei beiden Varianten (setPixel() , scanLine()) die Farbwerte ausgeben lassen. Diese waren immer identisch. Das heißt die Funktion scanLine () arbeitet richtig. Ich denke, dass ich beim setzen der neuen Pixel in den Speicher einen Fehler mache.
Code: Alles auswählen
void ImageWindow::EditImage(double contrast)
{
TempEditImage_.convertToFormat(QImage::Format_RGB32,Qt::AutoColor);
Contrast(contrast);
QGraphicsItem *oldbackground = itemAt(0,0);
removeItem(oldbackground);
delete oldbackground;
addPixmap(QPixmap::fromImage(TempEditImage_));
QGraphicsItem *background = itemAt(0,0);
background->setZValue(0);
View_->setScene(this);
}
Code: Alles auswählen
void ImageWindow::Contrast(double contrast)
{
contrast = (100.0 + contrast) / 100.0;
contrast *= contrast;
quint32 y=(Rect_.topLeft()).y();
quint32 x=(Rect_.topLeft()).x();
quint32 h=Rect_.height()+(Rect_.topLeft()).y();;
quint32 w=Rect_.width()+(Rect_.topLeft()).x();
for (;y<=h;y++)
{
QRgb *scanLine = (QRgb *)TempEditImage_.scanLine(y);
for(;x<=w;x++)
{
QRgb q = scanLine[x];
QColor qc ( q );
double r=(double)qc.red()/255.0;
r -= 0.5;
r *= contrast;
r += 0.5;
r *= 255.0;
if (r < 0) r = 0;
if (r > 255) r = 255;
double g=(double)qc.green()/255.0;
g -= 0.5;
g *= contrast;
g += 0.5;
g *= 255.0;
if (g < 0) g = 0;
if (g > 255) g = 255;
double b=(double)qc.blue()/255.0;
b -= 0.5;
b *= contrast;
b += 0.5;
b *= 255.0;
if (b < 0) b = 0;
if (b > 255) b = 255;
QRgb qnew = qRgb( r, g, b);
scanLine[x]=qnew;
}
}
}
grüße