Question

Y at-il un moyen de faire un effet FishEye (ou la transformation Barrel) sur une image avec PHP-GD? Je trouve cela avec un code, mais j'ai mal le portage à PHP.

Comment puis-je mettre en œuvre un effet de lentille fisheye (transformation du baril ) dans Matlab?

Était-ce utile?

La solution

- Il est possible avec GD et rapide !! par rapport à ImageMagick
Créer une nouvelle image avec la taille de (2 * SourceWidth) / PI .
À pied à travers chaque pixel de la nouvelle image et trouver la distance du centre. d Source = hypot (x-centerX, y-centerY)
Trouver la distance dans l'image source par d dest. = 2 * r * asin (d Source / r) / 2 correspondant
r est la demi-largeur de l'image de destination.
Voir les exemples avec la marque de banc: 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);
     }

Autres conseils

PHP avec GD ne peut pas faire une telle chose d'une manière acceptable, le traitement d'un pixel par pixel image sera vraiment lent ...

Imagick prend en charge une fonction qui vous permet d'écrire votre propre expression ( fxImage ), après que tout sera traitée en interne au sein Imagick.

J'ai trouver un moyen de faire ce que vous avez demandé à Imagick, j'ai taked l'expression "Scott Software construit" blog - effet fisheye imagick. Vous pouvez lire l'explication complète de l'expression dans son blog. D'autres documents de cette fonction est disponible à l'officiel ImageMagick site, vous pouvez apprendre comment vous y peut construire vos propres expressions.

S'il vous plaît noter que la documentation PHP sur la valeur de retour est incorrect, je l'ai aussi il commenté. La fonction retourne l'objet Imagick réelle.

Voici donc votre 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;
?>

Quoi qu'il en soit, gardez à l'esprit que c'est encore lent, soyez prudent avec ce que vous faites avec ça ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top