我需要用php制作这个效果。我知道PHP图像过滤器中有IMG_FILTER_PIXELATE。但我需要它更流畅和浮雕?就像在这张图片中一样:
此效果将使用户上传的任何图像变为像素化并且图片的边缘变为红色(我知道IMG_FILTER_EDGEDETECT但我不知道如何使用它来更改边缘颜色)。
我不知道该怎么做。
答案 0 :(得分:15)
由于最后的答案是理论上的,似乎还不够,我已经创造了一个实际的例子: 注意:这远非“理想”和完美的像素化效果函数,但它确实起作用。您可以根据自己的需要进行编辑。
<?php
/* Function to make pixelated images
* Supported input: .png .jpg .jpeg .gif
*
*
* Created on 24.01.2011 by Henrik Peinar
*/
/*
* image - the location of the image to pixelate
* pixelate_x - the size of "pixelate" effect on X axis (default 10)
* pixelate_y - the size of "pixelate" effect on Y axis (default 10)
* output - the name of the output file (extension will be added)
*/
function pixelate($image, $output, $pixelate_x = 20, $pixelate_y = 20)
{
// check if the input file exists
if(!file_exists($image))
echo 'File "'. $image .'" not found';
// get the input file extension and create a GD resource from it
$ext = pathinfo($image, PATHINFO_EXTENSION);
if($ext == "jpg" || $ext == "jpeg")
$img = imagecreatefromjpeg($image);
elseif($ext == "png")
$img = imagecreatefrompng($image);
elseif($ext == "gif")
$img = imagecreatefromgif($image);
else
echo 'Unsupported file extension';
// now we have the image loaded up and ready for the effect to be applied
// get the image size
$size = getimagesize($image);
$height = $size[1];
$width = $size[0];
// start from the top-left pixel and keep looping until we have the desired effect
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($img, imagecolorat($img, $x, $y));
// get the closest color from palette
$color = imagecolorclosest($img, $rgb['red'], $rgb['green'], $rgb['blue']);
imagefilledrectangle($img, $x, $y, $x+$pixelate_x, $y+$pixelate_y, $color);
}
}
// save the image
$output_name = $output .'_'. time() .'.jpg';
imagejpeg($img, $output_name);
imagedestroy($img);
}
pixelate("test.jpg", "testing");
?>
这是在图像上创建像素化效果的示例函数。
以下是使用此功能的示例结果:
原文:
像素化5px:
像素化10px:
像素化20px:
答案 1 :(得分:1)
理论上说: 你有一张图片:
RGBRGBRGBRGB
GBRGBRGBRGBR
GBRGBRGBRRGB
BGRGBGRGGRBG
获取第一个像素的颜色,并为下一个像素的正方形(向下和向右)设置相同的颜色。然后取第5个像素的颜色(在开始时4个像素已经是相同的颜色)。如果您已完成第一行,请向下移动+3行并重新开始。
所以你得到:
RRRRGGGBBBB
RRRRGGGBBBB
RRRRGGGBBBB
RRRRGGGBBBB
在PHP中,您可以使用以下功能来实现此目的:
http://php.net/manual/en/function.imagecolorat.php选择像素的颜色
http://php.net/manual/en/function.imagecolorset.php设置像素的颜色
http://php.net/manual/en/function.imagesx.php获取图片宽度
http://php.net/manual/en/function.imagesy.php获取图像高度
通过图像像素使用循环
答案 2 :(得分:0)
这是我对这个问题的尝试。
您可以更改像素块大小,并且可以应用模糊效果,从而柔化高对比度图像的效果。对于具有小像素块大小的大图像,可能会很慢。
脚本将相关像素的颜色存储在数组中。然后它会压印图像,根据需要改变对比度,使用imagefilter()函数对图像进行像素化,然后(如果设置了瓷砖增强)再次压印它(这会增加最终瓷砖的3D效果)。如果需要模糊,则脚本应用高斯模糊。然后,脚本使用颜色数组绘制实心方块,以在浮雕图块边框内创建彩色像素化效果。
function pixelatemboss($image,$blockwidth=10,$blur=5,$tileenhance="true",$contrast=0,$negate="true")
{
if($blockwidth>1)
{
imagefilter($image,IMG_FILTER_CONTRAST,$contrast);
for($x=1;$x<imagesx($image);$x=$x+$blockwidth)
{
for($y=1;$y<imagesy($image);$y=$y+$blockwidth)
{
$color[$x][$y]=imagecolorat($image,$x,$y);
}
}
imagefilter($image,IMG_FILTER_EMBOSS);
imagefilter($image,IMG_FILTER_CONTRAST,$contrast);
imagefilter($image,IMG_FILTER_PIXELATE,$blockwidth,false);
if($tileenhance=="true")
{
imagefilter($image,IMG_FILTER_EMBOSS);
}
for($b=0;$b<$blur;$b++)
{
imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR);
}
for($x=1;$x<imagesx($image);$x=$x+$blockwidth)
{
for($y=1;$y<imagesy($image);$y=$y+$blockwidth)
{
$rgb=$color[$x][$y];
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$col=imagecolorallocate($image,$r,$g,$b);
imagefilledrectangle($image,$x,$y,$x+($blockwidth-2),$y+($blockwidth-2),$col);
}
}
}
return $image;
}
答案 3 :(得分:0)
注意php 5.4及以上版本,您需要使用:
imageJPEG($image, NULL, 75);
您不能再使用双引号指定NULL(如此示例):
imageJPEG($image, "", 75);