2011-08-30 34 views
14

Tôi muốn làm mờ một hình ảnh với thư viện GD, tiếc là hiệu ứng GAUSSIAN_BLUR mà GD đưa ra là không đủ và tôi muốn một cái gì đó đang được nhiều blurrishPHP/GD: Better Gaussian blur

<?php $im = imagecreatefrompng($_GET['image']); 
if($im && imagefilter($im, IMG_FILTER_GAUSSIAN_BLUR)) 
{ 
    header('Content-Type: image/png'); 
    imagepng($im); 
} 
else 
{ 
    echo 'fail'; 
} 

imagedestroy($im); 

Tôi muốn một cái gì đó như thế này hoặc ít nhất gần nó. image from //tutorial9.s3.amazonaws.com/uploads/2008/06/lens-blur.jpg

Trả lời

13

Bạn có thể thử chập:

$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0)); 
imageconvolution($image, $gaussian, 16, 0); 

$gaussian là một ma trận, vì vậy về mặt toán học đó là

[[1, 2, 1], 
[2, 4, 2], 
[1, 2, 1]] 

bạn có thể tìm thấy bộ lọc chập khác tại địa chỉ: http://aishack.in/tutorials/image-convolution-examples/

imageconvolution(<image element>, <convolution matrix>, <divisor (sum of convolution matrix)>, <color offset>); 

nên từ ngày mã e trên 1+2+1+2+4+2+1+2+1 = 16 tổng của ma trận. http://www.php.net/manual/en/function.imageconvolution.php#97921 là một thủ thuật gọn gàng để nhận số tiền của số chia.

hãy kiểm tra http://php.net/manual/en/function.imageconvolution.php để biết thêm thông tin về chức năng này.

tốt ol' thời trang mờ là (1,2,1), (2,1,2), (1,2,1)

EDIT: as stated below bạn có thể chạy bất kỳ bộ lọc hơn một lần vào đầu ra kết quả cũng tăng cường hiệu ứng.

+0

không gần với những gì tôi muốn nhưng nhờ, bất kỳ cách nào khác để làm mờ nó hơn ?? EDIT: xin lỗi đã không đọc chỉnh sửa của bạn, nhìn vào các ví dụ, cảm ơn! – SAFAD

+1

có vẻ như ma trận này: mảng (2.0, 3.0, 2.0), mảng (3.0, 6.0, 3.0), mảng (2.0, 3.0, 2.0) là ma trận lớn nhất mà hàm này có thể đọc, tôi đã đọc ma trận 5x5 có thể làm tốt hơn và mạnh hơn mờ, bất kỳ ý tưởng? – SAFAD

+0

sử dụng chức năng nhiều lần cho kết quả tôi muốn, nhưng nó không phải là giải pháp tốt nhất hiện có * chắc chắn * – SAFAD

1

Không chắc chắn các đối số của bộ lọc hình ảnh có giúp ích hay không.

Hoặc, chỉ cần áp dụng bộ lọc hình ảnh cho kết quả là một vài lần ???

20

Sau khi gặp vấn đề tương tự, tôi đã áp dụng cùng một bộ lọc một vài lần và mỗi lần đến tài nguyên kết quả của cuộc gọi "imagefilter" trước đó. Tôi nhận được hiệu ứng 'mờ hơn' mà bạn đang tìm kiếm.

ví dụ:

for ($x=1; $x<=15; $x++) 
    imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR); 
+1

đây phải là câu trả lời đúng – younes0

+1

Tôi đã sử dụng nó bản thân mình, vì vậy tôi có thể đảm bảo với bạn nó hoạt động như mong đợi. –

+8

Tôi đã sử dụng điều này, nhưng điều này là không thể chịu được chậm. –

1

thử điều này:

<?php 
// 
//fastblur function from image hosting and processing site http://hero-in.com 
// 

function blur($img, $radius=10) 
{ 

if ($radius>100) $radius=100; //max radius 
if ($radius<0) $radius=0; //nin radius 

$radius=$radius*4; 
$alphaStep=round(100/$radius)*1.7; 
$width=imagesx($img); 
$height=imagesy($img); 
$beginX=floor($radius/2); 
$beginY=floor($radius/2); 


//make clean imahe sample for multiply 
$cleanImageSample=imagecreatetruecolor($width, $height); 
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height); 


//make h blur 
for($i = 1; $i < $radius+1; $i++) 
{ 
$xPoint=($beginX*-1)+$i-1; 
imagecopymerge($img, $cleanImageSample, $xPoint, 0, 0, 0, $width, $height, $alphaStep); 
} 
//make v blur 
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height); 
for($i = 1; $i < $radius+1; $i++) 
{ 
$yPoint=($beginY*-1)+$i-1; 
imagecopymerge($img, $cleanImageSample, 0, $yPoint, 0, 0, $width, $height, $alphaStep); 
} 
//finish 
return $img; 
imagedestroy($cleanImageSample); 
} 

//example 
$im = ImageCreateFromJpeg('image.jpg'); 
$im = blur($im,10); 
imagejpeg($im) 
imagedestroy($im); 
?> 
0

Tôi có kết quả rất tốt với mã sau đây dựa trên this giải pháp:

for ($i = 0; $i < 25; $i++) { 
     if ($i % 10 == 0) {//each 10th time apply 'IMG_FILTER_SMOOTH' with 'level of smoothness' set to -7 
      imagefilter($tmp_dst_image, IMG_FILTER_SMOOTH, -7); 
     } 
     imagefilter($tmp_dst_image, IMG_FILTER_GAUSSIAN_BLUR); 
    } 

Khi bạn áp dụng mịn sau vài mờ nó mang lại hiệu ứng mờ rất tốt. Bạn có thể thử nghiệm với số sau trong mã: 25, 10, -7.

Xem thêm:How to measure the speed of code written in PHP

Các vấn đề liên quan