GD를 사용하여 업로드된 이미지의 크기를 조정하고 PNG로 변환하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/22259

  •  09-06-2019
  •  | 
  •  

문제

사용자가 아바타 형태의 이미지를 다양한 형식으로 업로드할 수 있도록 하고 싶습니다(GIF, JPEG, PNG 이상), 그러나 모두를 다른 이름으로 저장하려면 PNG 데이터베이스 BLOB.이미지의 크기가 픽셀 단위로 너무 큰 경우 DB 삽입 전에 크기를 조정하고 싶습니다.

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

편집하다:안타깝게도 오직 GD 내가 사용해야 하는 서버에서 사용할 수 있습니다. 아니요 이미지매직.

도움이 되었습니까?

해결책

<?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.');
}

다른 팁

프로세스 단계는 다음과 같아야 합니다.

  1. 확인하다 그만큼 파일 형식
  2. 지원되는 파일 형식인 경우 다음을 사용하여 이미지를 GD에 로드합니다. 이미지생성*
  3. 다음을 사용하여 크기 조정 이미지 복사크기 조정 또는 이미지카피리샘플링됨
  4. 다음을 사용하여 이미지를 저장합니다. imagepng($handle, 'filename.png', $quality, $filters)

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

@ceejayoz 새로운 GD를 기다리세요. MySQLi와 같은 OOP이고 실제로 나쁘지 않습니다 :)

gdlib를 사용하려면 gdlib 2 이상을 사용하세요.여기에는 크기를 조정하면서 픽셀을 보간하고 훨씬 더 보기 좋게 만드는 imagecopyresampled()라는 함수가 있습니다.

또한 나는 데이터베이스에 이미지를 저장하는 것이 나쁜 형식이라는 것을 항상 인터넷에서 들었습니다.

  • 디스크보다 액세스 속도가 느립니다.
  • 서버는 단순히 파일을 제공하는 대신 이미지를 얻으려면 스크립트를 실행해야합니다.
  • 이제 귀하의 스크립트는 웹 서버가 처리하는 데 사용한 많은 것들에 대한 책임이 있습니다.
    • 적절한 Content-Type 헤더 설정
    • 클라이언트가 이미지를 적절하게 캐시할 수 있도록 적절한 캐싱/시간 초과/E-태그 헤더를 설정합니다.이 작업을 제대로 수행하지 않으면 요청이 있을 때마다 이미지 제공 스크립트가 실행되어 서버 부하가 훨씬 더 늘어납니다.

제가 볼 수 있는 유일한 장점은 데이터베이스와 이미지 파일을 동기화된 상태로 유지할 필요가 없다는 것입니다.그래도 나는 여전히 반대하는 것이 좋습니다.

서버에 ImageMagick이 없는 것이 확실합니까?

나는 당신이 PHP를 사용하는 손님입니다 (질문은 PHP로 태그되었습니다).내가 사용하는 호스팅 회사에는 phpinfo()에 따라 ImageMagick 확장 기능이 활성화되어 있지 않습니다.

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

당신도 같은 선택을 하길 바랍니다.

그리고 나 강하게 동의합니다. 데이터베이스에 이미지를 저장하는 것은 좋은 생각이 아닙니다.

아마도 다음과 같습니다.


<?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 파일을 가정했습니다.파일 유형을 결정하기 위해 일종의 스위치 문이 필요할 수도 있습니다.

이 기사 원하시는 대로 맞을 것 같습니다.저장하는 imagejpeg() 함수를 imagepng()로 변경하고 파일을 페이지에 출력하는 대신 문자열로 저장하도록 해야 하지만 그 외에는 기존 코드에 복사/붙여넣기가 쉬워야 합니다.

GD는 꼭 필수인가요? 이미지매직 더 빠르고, 더 나은 이미지를 생성하고, 더 쉽게 구성할 수 있으며, 마지막으로 (IMO) 코딩하기가 훨씬 쉽습니다.

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

phpThumb 살펴볼 가치가 있는 높은 수준의 추상화입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top