2012-01-24 17 views
16

ho questo script per Pixelize mie immagini lo script sta lavorando, ma voglio bordi più lisci:php gd pixelate troppo forte

$imgfile = 'batman.jpg'; 
$image = ImageCreateFromJPEG($imgfile); 
$imagex = imagesx($image); 
$imagey = imagesy($image); 
$pixelate_amount = 10; 
$tmpImage = ImageCreateTrueColor($imagex, $imagey); 
imagecopyresized($tmpImage, $image, 0, 0, 0, 0, round($imagex/$pixelate_amount), round($imagey/$pixelate_amount), $imagex, $imagey); 
$pixelated = ImageCreateTrueColor($imagex, $imagey); 
imagecopyresized($pixelated, $tmpImage, 0, 0, 0, 0, $imagex, $imagey, round($imagex/$pixelate_amount), round($imagey/$pixelate_amount)); 
header("Content-Type: image/jpeg"); 
imageJPEG($pixelated, "", 100); 

ho:

before

questi prodotti:

after

c'è ne mi manchi?

risposta

20

Ecco quello che vi serve (sceneggiatura ho attualmente in uso). Questo script è basato dallo script al http://www.talkphp.com/19670-post1.html:

function convertToPixel($im, $size) { 
    $size = (int)$size; 
    $sizeX = imagesx($im); 
    $sizeY = imagesy($im); 

    if($sizeX < 3 && $sizeX < 3) { // or you can choose any size you want 
    return; 
    } 
    for($i = 0;$i < $sizeX; $i += $size) { 
    for($j = 0;$j < $sizeY; $j += $size) { 
     $colors = Array('alpha' => 0, 'red' => 0, 'green' => 0, 'blue' => 0, 'total' => 0); 
     for($k = 0; $k < $size; ++$k) { 
     for($l = 0; $l < $size; ++$l) { 
      if($i + $k >= $sizeX || $j + $l >= $sizeY) { 
      continue; 
      } 
      $color = imagecolorat($im, $i + $k, $j + $l); 
      imagecolordeallocate($im, $color); 
      $colors['alpha'] += ($color >> 24) & 0xFF; 
      $colors['red'] += ($color >> 16) & 0xFF; 
      $colors['green'] += ($color >> 8) & 0xFF; 
      $colors['blue'] += $color & 0xFF; 
      ++$colors['total']; 
     } 
     } 
     $color = imagecolorallocatealpha($im, $colors['red']/$colors['total'], $colors['green']/$colors['total'], $colors['blue']/$colors['total'], $colors['alpha']/$colors['total']); 
     imagefilledrectangle($im, $i, $j, ($i + $size - 1), ($j + $size - 1), $color); 
    } 
    } 
} 
header('Content-type: image/jpg'); 
$im = imagecreatefromjpeg($imgfile); 
convertToPixel($im, 15); 
imagejpeg($im, '', 100); 

Questo produrrà:

smooth

È inoltre possibile modificare il valore passato in convertToPixel per modificare la dimensione dei pixel. )