PHP con GD no puede hacer tal cosa en una forma aceptable, procesando un píxel por píxel de la imagen va a ser muy lento ...
Imagick es compatible con una función que permite usted debe escribir su propia expresión (fximage), después de eso todo será manejado internamente dentro de Imagick.
Así que he encontrado una manera de hacer lo que ha solicitado en Imagick, he tomado la expresión de "Scott builds Software" blog - fisheye effect in imagick. Puedes leer la explicación completa de la expresión en su blog. Puede obtener más documentación sobre esta función en el sitio oficial ImageMagick, donde puede aprender cómo puede crear sus propias expresiones.
Tenga en cuenta que la documentación de PHP sobre el valor de retorno es incorrecta, también he comentado allí. La función devuelve el objeto Imagick real.
Así que aquí es su código:
<?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;
?>
De todos modos, tenga en cuenta que esto sigue siendo lento, tener cuidado con lo que haces con ese ...
ya sea que usted tiene que poner en práctica el ojo de pez algo en sí directamente, lo que va a ser SLOOOWWWW. O busca otra forma de hacerlo. Como macro'n en photoshop con exec() o similar ... No conozco a nadie que haya hecho esto ... – DampeS8N
Si tiene conocimientos de programación C, puede descargar el código fuente * gd * e implementarlo una nueva característica, ¡y publícala! Ese código es tan viejo ... De todos modos, si encuentras una solución, ¡por favor publícala! También tengo curiosidad por saber ... ¿Cuál es tu sistema operativo? –
Es factible, pero implica más que el código MATLAB. PHP no es muy adecuado para la aritmética de bytes y es probable que necesite una matriz de 3 capas (R, G, B). Así que también sugiero recurrir a 'exec (imagemagick)'. – mario