2012-05-19 3 views
1

Я использую ImageMagick, чтобы получить 3 версии загруженного изображения.ImageMagick получить веб-оптимизированные фотографии

Проблема в том, что 3 новых изображения не оптимизированы для веб-сайтов, таких как Save For Web & Устройства в Photoshop. Разница большая. ImageMagick генерирует файлы, которые в 5 раз больше, чем веб-оптимизированная фотография из Photoshop.

Помогите мне улучшить эту проблему?

Это ImageMagick-часть:

exec($imageMagickPath." uploads/foto.jpg -resize 514x uploads/fl-foto.jpg"); 
exec($imageMagickPath." uploads/fl-foto.jpg -resize 320x320 uploads/hl-foto.jpg"); 
exec($imageMagickPath." uploads/fl-foto.jpg -resize x96 -gravity center -crop 96x96+0+0 +repage uploads/th-foto.jpg"); 

Конечно, я хочу, чтобы использовать эти 3 изображения на переднем конце, но они являются большими и замедлить всю страницу.

Любые предложения?

ответ

1

Imagemagick использует параметр -quality # для установки желаемого качества, с помощью которых можно уменьшить изображение-размер за счет увеличения сжатия. Вы можете узнать больше об этом на своем documentation. В разделе о формате JPEG говорит это:

Для форматов изображений JPEG и MPEG, качество 1 (низшая изображение качество и максимальное сжатие) до 100 (наилучшее качество, но не менее эффективное сжатие). По умолчанию используется оценочное качество вашего входного изображения, если оно может быть определено, в противном случае 92. Если качество больше 90, то каналы цветности не равны . Используйте параметр -sampling-factor, чтобы указать коэффициенты для снижения частоты дискретизации.

В вашем случае это станет:

exec($imageMagickPath." uploads/foto.jpg -resize 514x -quality 60 uploads/fl-foto.jpg"); 
+1

Thx. Я также разделил метаинформацию и профиль после преобразования в sRGB. ТЕПЕРЬ Я думаю, что это то же самое, что и Photoshop. Я добавил «-profile». $ Profilepath. «SRGB.icc -strip» –

+0

@John Doe Smith: Вы должны не только * «принять» * лучший, но и * 'upvote' * другие полезные ответы. И, безусловно, принятый ответ обычно также заслуживает и перемирия. Просто нажмите маленькую иконку '^' слева от ответа ... –

1

Не могли бы вы попробовать этот код.

$im = new Imagick('Penguins.jpg'); 
    $im->cropImage(300, 300, 0, 0);  
    header("Content-Type: image/png"); 
    echo $im; 

если не работает. ты не возражаешь, я дам твою phpinfo?

<?php phpinfo(); ?> 
0
<p> 
//Function for image re-size and cropping// 
if(isset($_POST)) 
{ 
    //Some Settings 
    $ThumbSquareSize  = 200; //Thumbnail will be 200x200 
    $BigImageMaxSize  = 500; //Image Maximum height or width 
    $ThumbPrefix   = "thumb_"; //Normal thumb Prefix 
    $DestinationDirectory = 'uploads/'; //Upload Directory ends with/(slash) 
    $Quality    = 90; 

    // check $_FILES['ImageFile'] array is not empty 
    // "is_uploaded_file" Tells whether the file was uploaded via HTTP POST 
    if(!isset($_FILES['ImageFile']) || !is_uploaded_file($_FILES['ImageFile']['tmp_name'])) 
    { 
      die('Something went wrong with Upload!'); // output error when above checks fail. 
    } 

    // Random number for both file, will be added after image name 
    $RandomNumber = rand(0, 9999999999); 

    // Elements (values) of $_FILES['ImageFile'] array 
    //let's access these values by using their index position 
    $ImageName  = str_replace(' ','-',strtolower($_FILES['ImageFile']['name'])); 
    $ImageSize  = $_FILES['ImageFile']['size']; // Obtain original image size 
    $TempSrc  = $_FILES['ImageFile']['tmp_name']; // Tmp name of image file stored in PHP tmp folder 
    $ImageType  = $_FILES['ImageFile']['type']; //Obtain file type, returns "image/png", image/jpeg, text/plain etc. 

    switch(strtolower($ImageType)) 
    { 
     case 'image/png': 
      $CreatedImage = imagecreatefrompng($_FILES['ImageFile']['tmp_name']); 
      break; 
     case 'image/gif': 
      $CreatedImage = imagecreatefromgif($_FILES['ImageFile']['tmp_name']); 
      break;   
     case 'image/jpeg': 
     case 'image/pjpeg': 
      $CreatedImage = imagecreatefromjpeg($_FILES['ImageFile']['tmp_name']); 
      break; 
     default: 
      die('Unsupported File!'); //output error and exit 
    } 

    //PHP getimagesize() function returns height-width from image file stored in PHP tmp folder. 
    //Let's get first two values from image, width and height. list assign values to $CurWidth,$CurHeight 
    list($CurWidth,$CurHeight)=getimagesize($TempSrc); 
    //Get file extension from Image name, this will be re-added after random name 
    $ImageExt = substr($ImageName, strrpos($ImageName, '.')); 
    $ImageExt = str_replace('.','',$ImageExt); 

    //remove extension from filename 
    $ImageName  = preg_replace("/\\.[^.\\s]{3,4}$/", "", $ImageName); 

    //Construct a new image name (with random number added) for our new image. 
    $NewImageName = $ImageName.'-'.$RandomNumber.'.'.$ImageExt; 
    //set the Destination Image 
    $thumb_DestRandImageName = $DestinationDirectory.$ThumbPrefix.$NewImageName; //Thumb name 
    $DestRandImageName   = $DestinationDirectory.$NewImageName; //Name for Big Image 

    //Resize image to our Specified Size by calling resizeImage function. 
    if(resizeImage($CurWidth,$CurHeight,$BigImageMaxSize,$DestRandImageName,$CreatedImage,$Quality,$ImageType)) 
    { 
     //Create a square Thumbnail right after, this time we are using cropImage() function 
     if(!cropImage($CurWidth,$CurHeight,$ThumbSquareSize,$thumb_DestRandImageName,$CreatedImage,$Quality,$ImageType)) 
      { 
       echo 'Error Creating thumbnail'; 
      } 
     /* 
     At this point we have succesfully resized and created thumbnail image 
     We can render image to user's browser or store information in the database 
     For demo, we are going to output results on browser. 
     */ 
     echo '<table width="100%" border="0" cellpadding="4" cellspacing="0">'; 
     echo '<tr>'; 
     echo '<td align="center"><img src="uploads/'.$ThumbPrefix.$NewImageName.'" alt="Thumbnail"></td>'; 
     echo '</tr><tr>'; 
     echo '<td align="center"><img src="uploads/'.$NewImageName.'" alt="Resized Image"></td>'; 
     echo '</tr>'; 
     echo '</table>'; 

     /* 
     // Insert info into database table! 
     mysql_query("INSERT INTO myImageTable (ImageName, ThumbName, ImgPath) 
     VALUES ($DestRandImageName, $thumb_DestRandImageName, 'uploads/')"); 
     */ 

    }else{ 
     die('Resize Error'); //output error 
    } 
} 


// This function will proportionally resize image 
function resizeImage($CurWidth,$CurHeight,$MaxSize,$DestFolder,$SrcImage,$Quality,$ImageType) 
{ 
    //Check Image size is not 0 
    if($CurWidth <= 0 || $CurHeight <= 0) 
    { 
     return false; 
    } 

    //Construct a proportional size of new image 
    $ImageScale   = min($MaxSize/$CurWidth, $MaxSize/$CurHeight); 
    $NewWidth   = ceil($ImageScale*$CurWidth); 
    $NewHeight   = ceil($ImageScale*$CurHeight); 
    $NewCanves   = imagecreatetruecolor($NewWidth, $NewHeight); 

    // Resize Image 
    if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $NewWidth, $NewHeight, $CurWidth, $CurHeight)) 
    { 
     switch(strtolower($ImageType)) 
     { 
      case 'image/png': 
       imagepng($NewCanves,$DestFolder); 
       break; 
      case 'image/gif': 
       imagegif($NewCanves,$DestFolder); 
       break;   
      case 'image/jpeg': 
      case 'image/pjpeg': 
       imagejpeg($NewCanves,$DestFolder,$Quality); 
       break; 
      default: 
       return false; 
     } 
    //Destroy image, frees memory 
    if(is_resource($NewCanves)) {imagedestroy($NewCanves);} 
    return true; 
    } 

} 

//This function corps image to create exact square images, no matter what its original size! 
function cropImage($CurWidth,$CurHeight,$iSize,$DestFolder,$SrcImage,$Quality,$ImageType) 
{  
    //Check Image size is not 0 
    if($CurWidth <= 0 || $CurHeight <= 0) 
    { 
     return false; 
    } 

    if($CurWidth>$CurHeight) 
    { 
     $y_offset = 0; 
     $x_offset = ($CurWidth - $CurHeight)/2; 
     $square_size = $CurWidth - ($x_offset * 2); 
    }else{ 
     $x_offset = 0; 
     $y_offset = ($CurHeight - $CurWidth)/2; 
     $square_size = $CurHeight - ($y_offset * 2); 
    } 

    $NewCanves = imagecreatetruecolor($iSize, $iSize); 
    if(imagecopyresampled($NewCanves, $SrcImage,0, 0, $x_offset, $y_offset, $iSize, $iSize, $square_size, $square_size)) 
    { 
     switch(strtolower($ImageType)) 
     { 
      case 'image/png': 
       imagepng($NewCanves,$DestFolder); 
       break; 
      case 'image/gif': 
       imagegif($NewCanves,$DestFolder); 
       break;   
      case 'image/jpeg': 
      case 'image/pjpeg': 
       imagejpeg($NewCanves,$DestFolder,$Quality); 
       break; 
      default: 
       return false; 
     } 
    //Destroy image, frees memory 
    if(is_resource($NewCanves)) {imagedestroy($NewCanves);} 
    return true; 

    } 

} 
</p> 
Смежные вопросы