Gracias por su respuesta . Usé su función y agregué otro bucle para cambiar el color del píxel externo de los cuadrados usando una función llamada imagelinethick en http://www.php.net/manual/en/function.imageline.php.Así se hizo:
<?php
$image = imagecreatefromjpeg('Penguins.jpg');
$imagex = imagesx($image);
$imagey = imagesy($image);
$pixelate_y=10;
$pixelate_x=10;
$height=$imagey;
$width=$imagex;
for($y = 0;$y < $height;$y += $pixelate_y+1)
{
for($x = 0;$x < $width;$x += $pixelate_x+1)
{
// get the color for current pixel
$rgb = imagecolorsforindex($image, imagecolorat($image, $x, $y));
// get the closest color from palette
$color = imagecolorclosest($image, $rgb['red'], $rgb['green'], $rgb['blue']);
imagefilledrectangle($image, $x, $y, $x+$pixelate_x, $y+$pixelate_y, $color);
}
}
for($y = 0;$y < $height;$y += $pixelate_y+1)
{
for($x = 0;$x < $width;$x += $pixelate_x+1)
{
//make a border line for each square
$rgb = imagecolorsforindex($image, imagecolorat($image, $x, $y));
$color = imagecolorclosest($image, 123, 123, 123);
imagelinethick($image, $x, $y, $x, $y+$pixelate_y, $color, 1);
imagelinethick($image, $x, $y, $x+$pixelate_x, $y, $color, 2);
}
}
function imagelinethick($image, $x1, $y1, $x2, $y2, $color, $thick = 1)
{
/* this way it works well only for orthogonal lines
imagesetthickness($image, $thick);
return imageline($image, $x1, $y1, $x2, $y2, $color);
*/
if ($thick == 1) {
return imageline($image, $x1, $y1, $x2, $y2, $color);
}
$t = $thick/2 - 0.5;
if ($x1 == $x2 || $y1 == $y2) {
return imagefilledrectangle($image, round(min($x1, $x2) - $t), round(min($y1, $y2) - $t), round(max($x1, $x2) + $t), round(max($y1, $y2) + $t), $color);
}
$k = ($y2 - $y1)/($x2 - $x1); //y = kx + q
$a = $t/sqrt(1 + pow($k, 2));
$points = array(
round($x1 - (1+$k)*$a), round($y1 + (1-$k)*$a),
round($x1 - (1-$k)*$a), round($y1 - (1+$k)*$a),
round($x2 + (1+$k)*$a), round($y2 - (1-$k)*$a),
round($x2 + (1-$k)*$a), round($y2 + (1+$k)*$a),
);
imagefilledpolygon($image, $points, 4, $color);
return imagepolygon($image, $points, 4, $color);
}
header("Content-Type: image/JPEG");
imageJPEG($image, "", 75);
?>
El resultado es la siguiente: http://www.flickr.com/photos/[email protected]/6759029339/
Pero creo que esto todavía necesita algunas mejoras para que sea más suave.
La imagen los enlaces parecen como si provinieran de un filtro de Photoshop. Probablemente no puedas replicar ese aspecto exacto sin una programación de manipulación de imágenes bastante hardcore. ¿Puedes crear un conjunto de imágenes de muestra, una "antes" y una "después" que demuestren el efecto exacto que estás buscando? – Charles
Para el efecto pixelado, creo que es como el filtro de mosaico en photoshop. ¿Cómo puedo hacer eso? – just2cya
http://www.flickr.com/photos/[email protected]/6729984045/ Creo esto usando una textura de filtro de mosaico de Photoshop, y para la imagen de abajo, uso el color de reemplazo. – just2cya