2008-08-22 7 views
9

사용자가 다양한 형식 (GIF, JPEG 및 PNG 이상 이상)의 아바타 형식 이미지를 업로드 할 수 있지만 모두 PNG 데이터베이스 BLOB으로 저장하도록 허용하려고합니다. 이미지가 픽셀 단위로 큰 경우 DB 삽입 전에 크기를 조정하고 싶습니다.GD를 사용하여 업로드 된 이미지의 크기를 변경하고 PNG로 변환하려면 어떻게해야합니까?

GD를 사용하여 크기 조정 및 PNG 변환을 수행하는 가장 좋은 방법은 무엇입니까?

편집 : 슬프게도 GD 만 사용할 서버에서 사용할 수 있습니다 (아니 ImageMagick).

+0

DB에서 이미지를 보내거나 저장하지 마십시오. – dlamblin

답변

23
<?php            
/* 
Resizes an image and converts it to PNG returning the PNG data as a string 
*/ 
function imageToPng($srcFile, $maxSize = 100) { 
    list($width_orig, $height_orig, $type) = getimagesize($srcFile);   

    // Get the aspect ratio 
    $ratio_orig = $width_orig/$height_orig; 

    $width = $maxSize; 
    $height = $maxSize; 

    // resize to height (orig is portrait) 
    if ($ratio_orig < 1) { 
     $width = $height * $ratio_orig; 
    } 
    // resize to width (orig is landscape) 
    else { 
     $height = $width/$ratio_orig; 
    } 

    // Temporarily increase the memory limit to allow for larger images 
    ini_set('memory_limit', '32M'); 

    switch ($type) 
    { 
     case IMAGETYPE_GIF: 
      $image = imagecreatefromgif($srcFile); 
      break; 
     case IMAGETYPE_JPEG: 
      $image = imagecreatefromjpeg($srcFile); 
      break; 
     case IMAGETYPE_PNG: 
      $image = imagecreatefrompng($srcFile); 
      break; 
     default: 
      throw new Exception('Unrecognized image type ' . $type); 
    } 

    // create a new blank image 
    $newImage = imagecreatetruecolor($width, $height); 

    // Copy the old image to the new image 
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 

    // Output to a temp file 
    $destFile = tempnam(); 
    imagepng($newImage, $destFile); 

    // Free memory       
    imagedestroy($newImage); 

    if (is_file($destFile)) { 
     $f = fopen($destFile, 'rb'); 
     $data = fread($f);  
     fclose($f); 

     // Remove the tempfile 
     unlink($destFile);  
     return $data; 
    } 

    throw new Exception('Image conversion failed.'); 
} 
+0

이 솔루션을 이용해 주셔서 감사합니다! :) 그것은 심지어 부분적으로 투명한 사진 (그것은 나의 원래의 문제였다)과 함께 작동한다! – bastiandoeen

0

This article 원하는대로 맞을 것으로 보입니다. imagejpng() 함수를 imagepng()으로 변경하고 파일을 페이지로 출력하지 않고 문자열에 저장해야하지만 기존 코드에 쉽게 복사/붙여 넣기가 가능해야합니다.

0

GD는 꼭 필요한가요? ImageMagick은 더 빠르며 더 나은 이미지를 생성하고 더 많은 구성이 가능하며 마지막으로 (IMO) 코드 작성이 훨씬 쉽습니다.

+0

간단한 광고 만 들리지만. 어떤 증거? – Green

+0

물론입니다. 자른 미리보기 이미지를 만들려면 :'$ image = new Imagick ($ image_path); $ image-> cropThumbnailImage (100,100);'두 줄의 코드로 GD에서 해보십시오. ImageMagick은 이미지 조작을 위해 특별히 고안된 툴킷이므로 일반적으로 PHP의 무작위 추출 부분보다 낫습니다. – ceejayoz

0

나는 this page이 좋은 출발점이라고 생각합니다. 그것은 imagecreatefrom (jpeg/gif/png)을 사용하고 이미지의 크기를 조정하고 변환 한 다음 브라우저로 출력합니다. 브라우저를 출력하는 대신 많은 minuttes의 코드 재 작성없이 DB의 BLOB에 출력 할 수 있습니다.

3

gdlib를 사용하려면 gdlib 2 이상을 사용하십시오. imagecopyresampled()라는 함수가 있는데, 크기를 조정하면서 픽셀을 보간하고 훨씬 더 멋지게 보입니다. 또한

, 나는 항상 데이터베이스에 이미지를 저장하는 나쁜 형태의 그물 주위에 언급 들었어요 :

  • 그것은 디스크에 비해 액세스 느리다
  • 귀하의 서버에 스크립트를 실행해야합니다 단순히 파일을 제공의 이미지에 대신 를 얻을
  • 스크립트가 지금 을 사용하는 웹 서버가 처리 할 수있는 물건을 많이 할 의무가 있습니다
    • 괜찮다 적절한 Content-Type 헤더를 지정하십시오.
    • 클라이언트가 이미지를 올바르게 캐시 할 수 있도록 적절한 캐싱/시간 초과/전자 태그 헤더를 설정하십시오. 이 작업을 제대로 수행하지 않으면 모든 요청에서 이미지 제공 스크립트가 실행되므로 서버의 부하가 더 커집니다. 내가 볼 수

유일한 장점은 동기화 데이터베이스 및 이미지 파일을 보관할 필요가없는 것입니다. 나는 여전히 그것을 반대하는 것이 좋습니다.다음과 같아야합니다

+0

고정 도메인이나 CDN의 자체 정적 서버에 오프로드하는 것과 비교하여 DB에서 이미지를 제공하는 것은 분명히 짜증납니다. – dlamblin

6

귀하의 공정 단계 :

  1. Verifyfiletype
  2. 로드 이미지가 imagecreatefrom*
  3. imagecopyresize 또는 imagecopyresampled
  4. 저장을 사용하여 크기 조정 사용하여 GD에 지원되는 파일 형식 인 경우 사용 이미지 imagepng($handle, 'filename.png', $quality, $filters)

ImageMagick은 더 빠르며 더 나은 이미지를 생성하고 더 구성 가능하며 마지막으로 (IMO) 코딩하기가 훨씬 쉽습니다.

@ceejayoz 그냥 새로운 GD 기다립니다 - 그것은 MySQLi처럼 OOP 그리고 실제로 나쁘지 않아 :)

3

당신이 서버에는 ImageMagick이 없다 확실합니까?

저는 (를) 사용하여 PHP를 작성하였습니다 (문제는 PHP 태그 포함). 필자가 사용하는 호스팅 회사에는 phpinfo()에 따라 ImageMagick 확장 기능이 켜져 있지 않습니다.

그러나 내가 물었을 때 그들은 여기에 PHP 코드에서 사용할 수있는 ImageMagick 프로그램 목록이 있다고 대답했습니다. 간단히 말해서 PHP에는 IM 인터페이스가 없지만 PHP에서 직접 IM 프로그램을 호출 할 수 있습니다.

동일한 옵션을 사용하시기 바랍니다.

그리고 I 강력하게 동의 - 데이터베이스에 이미지를 저장하는 것은 좋지 않습니다. 아마도 이런

3

뭔가 : 일부 구문 오류가있을 수 있습니다 있도록


<?php 
    //Input file 
    $file = "myImage.png"; 
    $img = ImageCreateFromPNG($file); 

    //Dimensions 
    $width = imagesx($img); 
    $height = imagesy($img); 
    $max_width = 300; 
    $max_height = 300; 
    $percentage = 1; 

    //Image scaling calculations 
    if ($width > $max_width) { 
     $percentage = ($height/($width/$max_width)) > $max_height ? 
      $height/$max_height : 
      $width/$max_width; 
    } 
    elseif ($height > $max_height) { 
     $percentage = ($width/($height/$max_height)) > $max_width ? 
      $width/$max_width : 
      $height/$max_height; 
    } 
    $new_width = $width/$percentage; 
    $new_height = $height/$percentage; 

    //scaled image 
    $out = imagecreatetruecolor($new_width, $new_height); 
    imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

    //output image 
    imagepng($out); 
?> 

는 그러나 나는 당신에게 그것을 할 수있는 방법에 대한 공정한 프레젠테이션을해야하는 코드를 테스트하지 않았습니다. 또한 PNG 파일을 사용합니다. 파일 유형을 판별하기 위해 일종의 switch 명령문이 필요할 수 있습니다.