Pregunta

¿Hay una manera de hacer un (transformación o barril) efecto ojo de pez en una imagen con PHP-GD? Me encontré con esto con algo de código, pero tengo dificultades para portarlo a PHP.

¿Cómo puedo aplicar un efecto de lente ojo de pez (transformación barril ) en MATLAB?

¿Fue útil?

Solución

Pero - Es posible con GD y rápido !! en comparación con ImageMagick
introducir descripción de la imagen aquí Crear una nueva imagen con el tamaño de (2 * SourceWidth) / PI .
Recorrerán cada píxel de la nueva imagen y encontrar la distancia desde el centro. d fuente = hypot (x-centerx, y-centery)
Encuentra la distancia correspondiente imagen de origen por d dest. = 2 * r * asin (d fuente / r) / 2
r es la anchura media de la imagen de destino.
Ver ejemplos con marca de banco: 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);
     }

Otros consejos

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 le permiten escribir su propia expresión ( fximage ), después de que todo va a ser manejado internamente dentro Imagick.

Así que he encontrar una manera de hacer lo que ha solicitado en Imagick, he sido cogido la expresión de "de Scott construye software blog" - efecto ojo de pez en imagick . Puede leer la explicación completa de la expresión en su blog. Más documentación de esta función está disponible en el sitio oficial ImageMagick sitio, usted puede aprender cómo hay pueden construir sus propias expresiones.

Tenga en cuenta que la documentación de PHP sobre el valor de retorno es incorrecta, ya he comentado también allí. La función de devolver el objeto Imagick real.

Así que aquí está el 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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top