Как создать эффект рыбьего глаза с помощью PHP GD

StackOverflow https://stackoverflow.com/questions/4399614

  •  10-10-2019
  •  | 
  •  

Вопрос

Есть ли способ создать эффект рыбьего глаза (или Бочкообразного преобразования) на изображении с помощью PHP-GD?Я нашел это с помощью некоторого кода, но мне трудно перенести его на PHP.

Как я могу реализовать эффект линзы "рыбий глаз" (бочкообразное преобразование) в MATLAB?

Это было полезно?

Решение

Но - Это возможно с GD и быстро !! По сравнению с ImageMagick
enter image description hereСоздать новое изображение с размером (2*ИСТОЧНИКА)/PI.
Прогуляйтесь в корыте каждый пиксель нового изображения и найдите расстояние от центра.дюймовыйисточник= гипот (x-centerx, y-centery)
Найти соответствующее расстояние в исходном изображении дюймовыйдат= 2*r*asin (Dисточник/r)/2
р это половина ширины изображения назначения.
Смотрите примеры с отметкой от стендов: 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);
     }

Другие советы

PHP с GD не может сделать это приемлемым способом, обработка изображения попиксельно будет очень медленной...

Imagick поддерживает функцию, которая позволяет вам написать свое собственное выражение (максимальное значение), после этого все будет обработано внутри Imagick.

Итак, я нашел способ сделать то, что вы запросили в Imagick, я взял выражение из Блог "Scott создает программное обеспечение" - эффект рыбьего глаза в 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;
?>

В любом случае, имейте в виду, что это все еще медленно, будьте осторожны со всем, что вы с этим делаете...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top