Frage

Gibt es eine Möglichkeit, eine FishEye (oder Barrel Transformation) Effekt auf einem Bild mit PHP-GD zu tun? Ich fand dies mit einigem Code, aber ich habe eine harte Zeit, es zu PHP zu portieren.

Wie kann ich einen Fisheye-Objektiv-Effekt (barrel Transformation implementieren in MATLAB)?

War es hilfreich?

Lösung

Aber - Es ist möglich, mit GD und schnell !! im Vergleich mit ImageMagick
image description treten Sie hier Erstellen Sie ein neues Bild mit der Größe von (2 * Sourcewidth) / PI .
Spaziergang durch jedes Pixel des neuen Bildes und finden Sie die Entfernung vom Zentrum entfernt. d source = hypot (x-centerX, y-centerY) Finden den entsprechenden Abstand in dem Quellenbild durch d dest. = 2 * R * asin (d source / r) / 2 r ist die halbe Breite des Zielbildes.
Siehe Beispiele mit bench mark: http://meindesign.net/picture2bubble/picture2bubble.php

function fisheye($infilename,$outfilename){
     $im=imagecreatefrompng($infilename);
     $ux=imagesx($im);//Source imgage width(x) 
     $uy=imagesy($im);//Source imgage height(y) 
     $umx=$ux/2;//Source middle
     $umy=$uy/2;
     if($ux>$uy)$ow=2*$uy/pi();//Width for the destionation image
     else $ow=2*$ux/pi();
     $out=imagecreatetruecolor($ow+1,$ow+1); 
     $trans=imagecolortransparent($out,ImageColorAllocate($out,0,0,0));
     imagefill($im,1,1,$trans); 
     for($c=0;$c<imagecolorstotal($im);$c++){//Copy palette
        $col=imagecolorsforindex($im,$c);
        imagecolorset($out,$c,$col[red],$col[green],$col[blue]);
        }
     $om=$ow/2;//destination middle
     for($x=0;$x<=$ow;++$x){//Loop X in destination image
        for($y=0;$y<=$ow;++$y){//Loop y in destination image
           $otx=$x-$om;//X in relation to the middle
           $oty=$y-$om;//Y in relation to the middle
           $oh=hypot($otx,$oty);//distance
           $arc=(2*$om*asin($oh/$om))/(2);
           $factor=$arc/$oh;
           if($oh<=$om){//if pixle inside radius
             $color=imagecolorat($im,round($otx*$factor+$umx),round($oty*$factor+$umy));
             $r = ($color >> 16) & 0xFF;
             $g = ($color >> 8) & 0xFF;
             $b = $color & 0xFF;
             $temp=imagecolorexact($out, $r, $g, $b);
             imagesetpixel($out,$x,$y,$temp);
             }
           }
        }
     imagepng($out,$outfilename);
     }

Andere Tipps

PHP mit GD kann so etwas in einer akzeptablen Art und Weise nicht, die Verarbeitung ein Bild Pixel-für-Pixel sein wird wirklich langsam ...

hat Imagick eine Funktion unterstützen, die es Ihnen ermöglichen, Ihre eigenen Ausdruck zu schreiben ( fximage ), danach wird alles intern innerhalb Imagick behandelt werden.

Also habe ich einen Weg finden, haben zu tun, was Sie in Imagick angefordert habe, habe ich den Ausdruck von "Scott baut Software" Blog - Fisheye-Effekt in imagick . Sie können die vollständige Erklärung des Ausdrucks in seinem Blog lesen. Weitere Dokumentation dieser Funktion bei der offiziellen verfügbar ImageMagick Website, können Sie lernen dort, wie Sie können Sie Ihre eigenen Ausdrücke bauen.

Bitte beachten Sie, dass die PHP-Dokumentation über den Rückgabewert falsch ist, habe ich auch dort kommentiert. Die Funktion liefert das aktuelle Imagick Objekt.

So, hier ist der Code:

<?php
/* Create new object */
$im = new Imagick();
/* Create new checkerboard pattern */
$im->newPseudoImage(100, 100, "pattern:checkerboard");
/* Set the image format to png */
$im->setImageFormat('png');
/* Fill background area with transparent */
$trans = Imagick::VIRTUALPIXELMETHOD_TRANSPARENT;
$im->setImageVirtualPixelMethod($trans);
/* Activate matte */
$im->setImageMatte(true);

/* This is the expression that define how to do the fisheye effect */
$distort_expression = 
'kk=w*0.5;
ll=h*0.5;
dx=(i-kk);
dy=(j-ll);
aa=atan2(dy,dx);
rr=hypot(dy,dx);
rs=rr*rr/hypot(kk,ll);
px=kk+rs*cos(aa);
py=ll+rs*sin(aa);
p{px,py}';

/* Perform the distortion */ 
$im = $im->fxImage($distort_expression);

/* Ouput the image */   
header("Content-Type: image/png");
echo $im;
?>

Wie auch immer, im Kopf behalten, dass dies immer noch langsam ist, seien Sie vorsichtig mit dem, was Sie tun mit diesem ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top