2012-05-19 70 views
1

我使用ImageMagick獲取上傳圖片的3個版本。ImageMagick獲得網頁優化圖片

問題是,3張新圖片沒有針對網頁進行優化,如Save For Web &設備在Photoshop中。差別很大。 ImageMagick生成的文件比Photoshop優化的網頁大5倍。

你能幫我改進這個問題嗎?

這是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>