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 permet vous écrivez votre propre expression (fximage), après quoi tout sera géré en interne au sein d'Imagick.
Donc, j'ai trouvé un moyen de faire ce que vous avez demandé dans Imagick, j'ai pris l'expression de "Scott builds Software" blog - fisheye effect in imagick. Vous pouvez lire l'explication complète de l'expression dans son blog. Une documentation supplémentaire de cette fonction est disponible sur le site officiel ImageMagick, vous pouvez y apprendre comment vous pouvez créer vos propres expressions.
S'il vous plaît noter que la documentation PHP sur la valeur de retour est incorrecte, j'ai également commenté là-bas. La fonction renvoie l'objet Imagick réel.
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 ...
Vous devez soit mettre en œuvre le fisheye algo lui-même directement, ce qui va être SLOOOWWWW. Ou trouver un autre moyen de le faire. Comme macro'n dans photoshop avec exec() ou similaire ... Je ne connais personne qui a fait cela ... – DampeS8N
Si vous avez des connaissances en programmation C, vous pouvez télécharger le code source * gd * et mettre en œuvre une nouvelle fonctionnalité - et publiez-le! Ce code est si vieux ... Quoi qu'il en soit, si vous trouvez une solution, postez-la! Je suis également curieux de savoir ... Btw quel est votre système d'exploitation? –
C'est faisable, mais c'est plus impliquant que le code MATLAB. PHP n'est pas bien adapté pour l'arithmétique des octets et vous aurez probablement besoin d'un tableau à 3 couches (R, G, B). Donc, je suggère également de recourir à 'exec (imagemagick)'. – mario