Cảm ơn bạn đã trả lời của bạn . Tôi đã sử dụng hàm của bạn và thêm một vòng lặp khác để thay đổi màu của pixel ngoài của hình vuông bằng cách sử dụng hàm có tên imagelinethick trong http://www.php.net/manual/en/function.imageline.php.Vì vậy, nó đã trở thành:
<?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);
?>
Kết quả là như thế này: http://www.flickr.com/photos/[email protected]/6759029339/
Nhưng tôi nghĩ rằng điều này vẫn cần một số cải tiến để làm cho nó mượt mà hơn.
Hình ảnh bạn liên kết trông giống như nó đến từ một bộ lọc Photoshop. Bạn có lẽ sẽ không thể tái tạo lại cái nhìn chính xác mà không có một số chương trình thao tác hình ảnh đẹp mắt. Bạn có thể tạo một tập các hình ảnh mẫu, một "trước" và một "sau" thể hiện hiệu ứng chính xác mà bạn đang tìm kiếm không? – Charles
Đối với hiệu ứng pixelate, tôi nghĩ nó giống như bộ lọc chắp vá trong photoshop. Làm thế nào tôi có thể làm điều đó? – just2cya
http://www.flickr.com/photos/[email protected]/6729984045/ Tôi tạo điều này bằng cách sử dụng kết cấu bộ lọc chắp vá Photoshop, và đối với hình ảnh dưới cùng, tôi sử dụng màu thay thế. – just2cya