2014-11-17 6 views
1

나는 이것을 작동시키기 위해서 stackoverflow와 PHP/Imagick 문서를 수색 해왔다. 내 PNG 이미지를 내 서버에 저장 한 다음 내 iOS 앱에 반환합니다. 크기를 조정하고 자른 이미지로 반환해야하므로 Imagick을 사용하고 있습니다. setImageCompression를 들어PHP에서 Imagick PNG 압축

$image_name = $_POST['filepath']; 
if(!file_exists($image_name)){ return ""; } 
header("Content-Type: image/png"); 

$image = new Imagick($image_name); 
$image->resizeImage($_POST['width'], $_POST['height'], Imagick::FILTER_LANCZOS, 1); 
$image->roundCorners($_POST['width'], $_POST['height']); 
$image->setImageFormat("png"); 
$image->setImageCompression(\Imagick::COMPRESSION_UNDEFINED); 
$image->setImageCompressionQuality(0); 
$image->stripImage(); 
echo $image; 

, 나는 여기에 나열된 모든 단일 압축 일정 시도 : 따라서, 지금까지 내가 가진 PNG 파일에 대한 구체적인 일이 없기 때문에, http://php.net/manual/en/imagick.constants.php을하지만, 그들 중 누구도 파일 크기를 변경하려면 보이지 않는다. (PNG에 사용되는 특정 이미지가 있습니까?) setImagesCompressionQuality의 값도 변경되었지만 이러한 변경 사항 중 어느 것도 차이가없는 것으로 보입니다. 어떤 사람들은 Imagick을 일하게 할 수 없었고, 다른 사람들은 더 업데이트 된 대답을 원했습니다. 어떤 도움을 주셔서 감사합니다!

+0

이 도움이된다 http://www.imagemagick.org/discourse-server/viewtopic.php?t=24134 – Danack

+0

@Danack 이미 다양한 사용하여 시도 압축 품질 - 파일 크기가 전혀 변경되지 않는 것 같습니다 – user3781236

답변

1

PNG 이미지에 대해 수행되는 압축 수준을 설정하는 기능은 setImageCompressionQuality입니다. PNG는 무손실 이미지 형식이므로 JPEG 이미지처럼 실제 이미지 품질에 영향을주지 않고 라이브러리에 이미지를 압축 할 때 사용할 노력과 전략을 알려줍니다. 아래의 코드는 가능한 모든 옵션을 실행합니다.

또한 pngcrush -brute Original.png pngcrushBrute.png 명령 줄과 함께 pngcrush을 시도해 얼마나 많은 공간을 저장할 수 있는지 확인했습니다.

Original.png : 192,382 바이트 - 특정 압축 수준을 설정하지 않음. FullColor92.png : 181,832 바이트 - 모든 가능한 옵션 중에서 가장 좋은 출력입니다. pngcrushBrute.png : 178,129 바이트 - 더 나은 압축보다 추가 헤더를 제거 할 가능성이 더 큽니다.

$imagick->setImageFormat('jpg'); 
$imagick->setImageCompressionQuality(80); 

Original.jpg : 27,626 바이트 \ O/

은 요약하면 :

  • Imagick/ImageMagick이 이미 기본 설정으로 최적의 압축을 가까이 가져옵니다.
  • 최상의 압축률을 얻으려면 PngCrush를 사용하면 Imagick보다 약간 좋은 결과를 얻을 수 있습니다.
  • 이미지가 사진 인 경우 jpg로 제공하십시오. 그것은 다이어그램/PNG와 함께 제공되어야합니다, 당신은 좋은 '압축'을 줄 것이지만 사진에 적합하지 않은 색상 감소를 시도 할 수 있습니다.

사용되는 코드 :

//10's digit: 
// 
//  0 or omitted: Use Z_HUFFMAN_ONLY strategy with the 
//   zlib default compression level 
// 
//  1-9: the zlib compression level 
// 
//  1's digit: 
// 
//  0-4: the PNG filter method 
// 
//  5: libpng adaptive filtering if compression level > 5 
//    libpng filter type "none" if compression level <= 5 
//or if image is grayscale or palette 
// 
//  6: libpng adaptive filtering 
// 
//  7: "LOCO" filtering (intrapixel differing) if writing 
//a MNG, otherwise "none". Did not work in IM-6.7.0-9 
//and earlier because of a missing "else". 
// 
//8: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), adaptive 
//    filtering. Unused prior to IM-6.7.0-10, was same as 6 
// 
//  9: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), no PNG filters 
//    Unused prior to IM-6.7.0-10, was same as 6 

$imagick = new Imagick("./Biter_500.jpg"); 

$imagick->setImageFormat('png'); 

$imagick->writeimage("./output/original.png"); 
compressAllTypes($imagick, "./output/FullColor"); 


function compressAllTypes(Imagick $imagick, $filename) { 
    for ($compression = 0; $compression <= 9; $compression++) { 
     echo "Compression $compression \n"; 
     for ($filter = 0; $filter <= 9; $filter++) { 
      echo "Filter $filter"; 
      $output = clone $imagick; 
      $output->setImageFormat('png'); 
      //$output->setOption('png:format', 'png8'); 
      $compressionType = intval($compression . $filter); 
      $output->setImageCompressionQuality($compressionType); 
      $outputName = $filename."$compression$filter.png"; 
      $output->writeImage($outputName); 
     } 
     echo "\n"; 
    } 
} 
+1

$ output-> stripImage(); – Jabari

+1

웬일인지이 파일은 똑같은 파일 101 개를 주었고 실제로 압축 된 것 같지 않습니다. / –

관련 문제