E
Das Programm diente als Informatik-Projekt in der FH.
Zudem ist es doch eine gute Übung zum Programmieren und für die Bildbearbeitung.
Es muss ja nicht gleich immer ein Profi-Tool werden.
Das Herzstück des Programms.
ratio ist das Verhältnis zwischen Vorschaubild und Originalbild.
QImage Edit::droste_effect(QImage img, QImage img_droste, double ratio, complex<double>shift, complex<double>rotate, double zoom, int Spirals, int filterValue, int max_rekursion, QRect selection)
{
//Mittelpunkt der Auswahl
QPoint mitte = selection.center()*ratio;
double ym=mitte.y();
double xm=mitte.x();
//Berechnung des Größenverhältnisses von Bild zu Auswahlbereich
double xscale=(double)img.width()/((double)selection.width()*ratio);
double yscale=(double)img.height()/((double)selection.height()*ratio);
double m=(yscale*xscale)/2;
//Berechnung des Droste Fixpunktes
complex<double> Cl (img.width()/2,img.height()/2);
complex<double> Cs(xm,ym);
complex<double> Cf = Cl + ((Cl-Cs)/(1-m));
//Neuer Punkt um den gedrostet werden soll
xm=real(Cf);
ym=imag(Cf);
//Berechnung der Paramter für Droste Effect
double alpha = atan((log(m)/(2*pi))*Spirals);
double f = cos(alpha);
complex<double> c_alpha (0,alpha);
complex<double> beta = f*exp(c_alpha);
//Abstand Droste-Fixpunkt zu Auswahlbereich, Fixpunkt. a = Offsetzoom
double a=0.5*(double)min(selection.width(),selection.height());
a=a*ratio;
zoom=pow(zoom,Spirals);//damit wenn man sprialen erhöt, kein undefinierten Bereich sichtbar ist.
//Transformation der einzellnen Pixel
for(double x=0;x<img_droste.width();x++){
for(double y=0;y<img_droste.height();y++){
//Polarkoordinaten
complex<double> z(x-xm,y-ym);
z = z + shift*ratio; //Verschieben
z = a*pow(z,beta/(beta*beta)); //Transformieren
z = z*exp(-rotate); //rotieren
z = z/zoom; //zommen
//Rücktransformation
for(int i=0;i<max_rekursion;i++)
{
z=z*m;
double x_original = real(z)/((double)img_droste.width())+xm;
double y_original = imag(z)/((double)img_droste.height())+ym;
if((x_original<img.width() && x_original >= 0 && y_original >=0 && y_original <img.height())){
QRgb Farbe = img.pixel(x_original,y_original);
img_droste.setPixel(x,y,Farbe);
}
}
}
}
return img_droste;
}