PHP с GD не может сделать это приемлемым способом, обработка изображения попиксельно будет очень медленной ...
Imagick поддерживает функцию, которая позволяет вам написать собственное выражение ( fximage ), после чего все будет обработано внутри Imagick.
Итак, я нашел способ сделать то, что вы просили в Imagick, я взял выражение из блога "Scott builds Software" - эффект "рыбий глаз" в imagick . Вы можете прочитать полное объяснение выражения в своем блоге. Дополнительная документация по этой функции доступна на официальном сайте ImageMagick , где вы можете узнать, как создавать собственные выражения.
Обратите внимание, что документация PHP о возвращаемом значении неверна, я тоже там прокомментировал. Функция возвращает фактический объект Imagick.
Так вот ваш код:
<?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;
?>
В любом случае, имейте в виду, что это все еще медленно, будьте осторожны с тем, что вы делаете с этим ...