PHP에서 이미지 크기 조정


96

양식을 통해 업로드 된 이미지의 크기를 147x147px로 자동으로 조정하는 PHP 코드를 작성하고 싶지만 어떻게해야할지 모르겠습니다 (나는 상대적인 PHP 초보자입니다).

지금까지 이미지가 성공적으로 업로드되고 파일 형식이 인식되고 이름이 정리되었지만 크기 조정 기능을 코드에 추가하고 싶습니다. 예를 들어, 2.3MB 크기의 1331x1331 크기의 테스트 이미지가 있는데 코드 크기를 줄여서 이미지 파일 크기도 극적으로 압축 할 것이라고 생각합니다.

지금까지 다음이 있습니다.

if ($_FILES) {
                //Put file properties into variables
                $file_name = $_FILES['profile-image']['name'];
                $file_size = $_FILES['profile-image']['size'];
                $file_tmp_name = $_FILES['profile-image']['tmp_name'];

                //Determine filetype
                switch ($_FILES['profile-image']['type']) {
                    case 'image/jpeg': $ext = "jpg"; break;
                    case 'image/png': $ext = "png"; break;
                    default: $ext = ''; break;
                }

                if ($ext) {
                    //Check filesize
                    if ($file_size < 500000) {
                        //Process file - clean up filename and move to safe location
                        $n = "$file_name";
                        $n = ereg_replace("[^A-Za-z0-9.]", "", $n);
                        $n = strtolower($n);
                        $n = "avatars/$n";
                        move_uploaded_file($file_tmp_name, $n);
                    } else {
                        $bad_message = "Please ensure your chosen file is less than 5MB.";
                    }
                } else {
                    $bad_message = "Please ensure your image is of filetype .jpg or.png.";
                }
            }
$query = "INSERT INTO users (image) VALUES ('$n')";
mysql_query($query) or die("Insert failed. " . mysql_error() . "<br />" . $query);

stackoverflow.com/questions/10029838/image-resize-with-php 와 같은 샘플을 시도해 보셨습니까 ?
Coenie Richards 2013

변화하지 않고 upload_max_filesize의를 php.ini, 첫째가 가능보다 더 크기의 파일을 업로드하는 것입니다 upload_max_filesize?. 이상 크기의 이미지 크기를 조정할 기회가 upload_max_filesize있습니까? 변경하지 않고 upload_max_filesizephp.ini
RCH

답변:


143

이미지 작업 을하려면 PHP의 ImageMagick 또는 GD 함수 를 사용해야합니다 .

예를 들어 GD에서는 다음과 같이 간단합니다.

function resize_image($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}

이 함수를 다음과 같이 호출 할 수 있습니다.

$img = resize_image(‘/path/to/some/image.jpg’, 200, 200);

개인적인 경험으로 볼 때 GD의 이미지 리샘플링은 특히 원시 디지털 카메라 이미지를 리샘플링 할 때 파일 크기를 크게 줄입니다.


1
이미지를 BLOBs 로 저장하고 있습니까? 파일 시스템에 이미지를 저장하고 데이터베이스에 참조를 삽입하는 것이 좋습니다. 또한 사용할 수있는 다른 옵션을 확인하려면 전체 GD (또는 ImageMagick) 문서를 읽는 것이 좋습니다.
Ian Atkin

20
이 솔루션은 JPEG에서만 작동합니다. imagecreatefromjpeg를 imagecreatefromgd, imagecreatefromgif, imagecreatefrompng, imagecreatefromstring, imagecreatefromwbmp, imagecreatefromxbm, imagecreatefromxpm 중 하나로 대체하여 다양한 이미지 유형을 처리 할 수 ​​있습니다.
Chris Hanson

2
@GordonFreeman 훌륭한 코드 스 니펫에 감사드립니다. 그러나 거기에 하나의 결함이 있습니다 . 높이 부분에 abs(), like ceil($width-($width*abs($r-$w/$h)))및 same을 추가하십시오 . 어떤 경우에는 필요합니다.
Arman P.

1
기본 자르기 값을 true로 변경하고 이미지 크기 http://wallpapercave.com/wp/wc1701171.jpg를 400x128 (배너)로 조정하면 검은 색 이미지가 만들어졌습니다. 그래도 왜 그런지 알 수 없습니다.
FoxInFlame

5
크기가 조정 된 이미지를 파일 시스템에 저장하려면 줄 imagejpeg($dst, $file);뒤에 추가 하십시오 imagecopyresampled($dst,.... $file원본을 덮어 쓰지 않으려면 변경하십시오 .
wkille

23

이 리소스 (깨진 링크)도 고려할 가치가 있습니다. GD를 사용하는 매우 깔끔한 코드입니다. 그러나 최종 코드 스 니펫을 수정하여 OP 요구 사항을 충족하는이 함수를 만들었습니다.

function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {
    
    $target_dir = "your-uploaded-images-folder/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);
    
    $image = new SimpleImage();
    $image->load($_FILES[$html_element_name]['tmp_name']);
    $image->resize($new_img_width, $new_img_height);
    $image->save($target_file);
    return $target_file; //return name of saved file in case you want to store it in you database or show confirmation message to user
    
}

이 PHP 파일도 포함해야합니다.

<?php
 
/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*
*/
 
class SimpleImage {
 
   var $image;
   var $image_type;
 
   function load($filename) {
 
      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {
 
         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {
 
         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {
 
         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
 
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {
 
         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {
 
         imagepng($this->image,$filename);
      }
      if( $permissions != null) {
 
         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {
 
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {
 
         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {
 
         imagepng($this->image);
      }
   }
   function getWidth() {
 
      return imagesx($this->image);
   }
   function getHeight() {
 
      return imagesy($this->image);
   }
   function resizeToHeight($height) {
 
      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }
 
   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }
 
   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }
 
   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }      
 
}
?>

1
귀하의 샘플이 최고입니다. 코미디, 드라마, 머리카락을 당기지 않고 Zend 프레임 워크에서 직접 작동합니다. 엄지 손가락

필요한 모든 코드가 내 대답에 있어야한다고 생각하지만 gist.github.com/arrowmedia/7863973 도 도움이 될 수 있습니다 .
ban-geoengineering

20

Simple Use PHP 기능 ( imagescale ) :

통사론:

imagescale ( $image , $new_width , $new_height )

예:

단계 : 1 파일 읽기

$image_name =  'path_of_Image/Name_of_Image.jpg|png';      

2 단계 : 이미지 파일로드

 $image = imagecreatefromjpeg($image_name); // For JPEG
//or
 $image = imagecreatefrompng($image_name);   // For PNG

3 단계 : 우리의 생명의 은인은 '_'로 표시됩니다. | 이미지 크기 조정

   $imgResized = imagescale($image , 500, 400); // width=500 and height = 400
//  $imgResized is our final product

참고 : 이미지 스케일은 (PHP 5> = 5.5.0, PHP 7)에서 작동합니다.

출처 : 클릭하여 더 읽기


PHP 5.6.3을위한 최상의 솔루션>
Pattycake Jr 2011

12

가로 세로 비율에 신경 쓰지 않는다면 (즉, 이미지를 특정 차원으로 강제하려는 경우) 다음은 간단한 대답입니다.

// for jpg 
function resize_imagejpg($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromjpeg($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

 // for png
function resize_imagepng($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefrompng($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

// for gif
function resize_imagegif($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromgif($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

이제 업로드 부분을 처리하겠습니다. 첫 번째 단계는 원하는 디렉토리에 파일을 업로드하는 것입니다. 그런 다음 파일 유형 (jpg, png 또는 gif)에 따라 위의 함수 중 하나를 호출하고 아래와 같이 업로드 된 파일의 절대 경로를 전달합니다.

 // jpg  change the dimension 750, 450 to your desired values
 $img = resize_imagejpg('path/image.jpg', 750, 450);

반환 값 $img은 리소스 개체입니다. 다음과 같이 새 위치에 저장하거나 원본을 재정의 할 수 있습니다.

 // again for jpg
 imagejpeg($img, 'path/newimage.jpg');

이것이 누군가를 돕기를 바랍니다. Imagick :: resizeImageimagejpeg () 크기 조정에 대한 자세한 내용은이 링크를 확인하십시오.


변화하지 않고 upload_max_filesize의를 php.ini, 첫째로 당신은 이상 크기의 파일을 업로드 할 수 없습니다 upload_max_filesize. 이상 크기의 이미지 크기를 조정하는 기회가 있습니까 upload_max_filesize변경하지 않고 upload_max_filesizephp.ini
RCH

6

나는 당신을 위해 일하기를 바랍니다.

/**
         * Image re-size
         * @param int $width
         * @param int $height
         */
        function ImageResize($width, $height, $img_name)
        {
                /* Get original file size */
                list($w, $h) = getimagesize($_FILES['logo_image']['tmp_name']);


                /*$ratio = $w / $h;
                $size = $width;

                $width = $height = min($size, max($w, $h));

                if ($ratio < 1) {
                    $width = $height * $ratio;
                } else {
                    $height = $width / $ratio;
                }*/

                /* Calculate new image size */
                $ratio = max($width/$w, $height/$h);
                $h = ceil($height / $ratio);
                $x = ($w - $width / $ratio) / 2;
                $w = ceil($width / $ratio);
                /* set new file name */
                $path = $img_name;


                /* Save image */
                if($_FILES['logo_image']['type']=='image/jpeg')
                {
                    /* Get binary data from image */
                    $imgString = file_get_contents($_FILES['logo_image']['tmp_name']);
                    /* create image from string */
                    $image = imagecreatefromstring($imgString);
                    $tmp = imagecreatetruecolor($width, $height);
                    imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h);
                    imagejpeg($tmp, $path, 100);
                }
                else if($_FILES['logo_image']['type']=='image/png')
                {
                    $image = imagecreatefrompng($_FILES['logo_image']['tmp_name']);
                    $tmp = imagecreatetruecolor($width,$height);
                    imagealphablending($tmp, false);
                    imagesavealpha($tmp, true);
                    imagecopyresampled($tmp, $image,0,0,$x,0,$width,$height,$w, $h);
                    imagepng($tmp, $path, 0);
                }
                else if($_FILES['logo_image']['type']=='image/gif')
                {
                    $image = imagecreatefromgif($_FILES['logo_image']['tmp_name']);

                    $tmp = imagecreatetruecolor($width,$height);
                    $transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
                    imagefill($tmp, 0, 0, $transparent);
                    imagealphablending($tmp, true); 

                    imagecopyresampled($tmp, $image,0,0,0,0,$width,$height,$w, $h);
                    imagegif($tmp, $path);
                }
                else
                {
                    return false;
                }

                return true;
                imagedestroy($image);
                imagedestroy($tmp);
        }

6

이미지 크기 조정을 위해 사용하기 쉬운 라이브러리를 만들었습니다. 여기 Github 에서 찾을 수 있습니다 .

라이브러리 사용 방법의 예 :

// Include PHP Image Magician library
require_once('php_image_magician.php');

// Open JPG image
$magicianObj = new imageLib('racecar.jpg');

// Resize to best fit then crop (check out the other options)
$magicianObj -> resizeImage(100, 200, 'crop');

// Save resized image as a PNG (or jpg, bmp, etc)
$magicianObj -> saveImage('racecar_small.png');

필요한 경우 다른 기능은 다음과 같습니다.

  • 빠르고 쉬운 크기 조정-가로, 세로 또는 자동으로 크기 조정
  • 쉬운 자르기
  • 텍스트 추가
  • 품질 조정
  • 워터 마킹
  • 그림자와 반사
  • 투명성 지원
  • EXIF 메타 데이터 읽기
  • 테두리, 둥근 모서리, 회전
  • 필터 및 효과
  • 이미지 선명 화
  • 이미지 유형 변환
  • BMP 지원

1
이것은 내 하루를 구했습니다. 그러나 저와 같은 3 일 동안 검색 중이며 크기 조정 솔루션을 찾을 희망을 잃으려고하는 사람에게 작은 알림이 있습니다. 나중에 정의되지 않은 색인 알림이 표시되면 다음 링크를 참조하십시오. github.com/Oberto/php-image-magician/pull/16/commits 그리고 변경 사항을 파일에 적용하십시오. 문제없이 100 % 작동합니다.
Hema_Elmasry

2
안녕하세요, @Hema_Elmasry. 참고로, 그 변경 사항을 메인에 병합했습니다. :)
Jarrod

알겠습니다. 미안합니다. 하지만 질문이 있습니다. 품질을 변경하지 않고 더 작은 해상도로 크기를 조정하면 표시되는 이미지 품질이 훨씬 낮아집니다. 전에도 비슷한 일이 있었나요? 여전히 해결책을 찾지 못했기 때문입니다.
Hema_Elmasry

6

( 중요 : 애니메이션 (animated webp 또는 gif) 크기 조정의 경우 결과는 애니메이션이 아닌 첫 번째 프레임에서 크기가 조정 된 이미지입니다! (원본 애니메이션은 그대로 유지됩니다 ...)

나는 이것을 내 PHP 7.2 프로젝트 (예시 imagebmp sure (PHP 7> = 7.2.0) : php / manual / function.imagebmp ) about techfry.com/php-tutorial , with GD2 (그래서 타사 라이브러리 없음 )에 만들었습니다 . Nico Bistolfi의 답변과 매우 유사하지만 다섯 가지 기본 이미지 mimetype ( png, jpeg, webp, bmp 및 gif )을 모두 사용하여 원본 파일을 수정하지 않고 크기가 조정 된 새 파일을 만들고 하나의 기능에있는 모든 항목과 사용할 준비가되었습니다 (복사하여 프로젝트에 붙여 넣기). (5 번째 매개 변수를 사용하여 새 파일의 확장자를 설정하거나 원래 상태를 유지하려면 그대로 둘 수 있습니다.)

function createResizedImage(
    string $imagePath = '',
    string $newPath = '',
    int $newWidth = 0,
    int $newHeight = 0,
    string $outExt = 'DEFAULT'
) : ?string
{
    if (!$newPath or !file_exists ($imagePath)) {
        return null;
    }

    $types = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_BMP, IMAGETYPE_WEBP];
    $type = exif_imagetype ($imagePath);

    if (!in_array ($type, $types)) {
        return null;
    }

    list ($width, $height) = getimagesize ($imagePath);

    $outBool = in_array ($outExt, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']);

    switch ($type) {
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg ($imagePath);
            if (!$outBool) $outExt = 'jpg';
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng ($imagePath);
            if (!$outBool) $outExt = 'png';
            break;
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif ($imagePath);
            if (!$outBool) $outExt = 'gif';
            break;
        case IMAGETYPE_BMP:
            $image = imagecreatefrombmp ($imagePath);
            if (!$outBool) $outExt = 'bmp';
            break;
        case IMAGETYPE_WEBP:
            $image = imagecreatefromwebp ($imagePath);
            if (!$outBool) $outExt = 'webp';
    }

    $newImage = imagecreatetruecolor ($newWidth, $newHeight);

    //TRANSPARENT BACKGROUND
    $color = imagecolorallocatealpha ($newImage, 0, 0, 0, 127); //fill transparent back
    imagefill ($newImage, 0, 0, $color);
    imagesavealpha ($newImage, true);

    //ROUTINE
    imagecopyresampled ($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    // Rotate image on iOS
    if(function_exists('exif_read_data') && $exif = exif_read_data($imagePath, 'IFD0'))
    {
        if(isset($exif['Orientation']) && isset($exif['Make']) && !empty($exif['Orientation']) && preg_match('/(apple|ios|iphone)/i', $exif['Make'])) {
            switch($exif['Orientation']) {
                case 8:
                    if ($width > $height) $newImage = imagerotate($newImage,90,0);
                    break;
                case 3:
                    $newImage = imagerotate($newImage,180,0);
                    break;
                case 6:
                    $newImage = imagerotate($newImage,-90,0);
                    break;
            }
        }
    }

    switch (true) {
        case in_array ($outExt, ['jpg', 'jpeg']): $success = imagejpeg ($newImage, $newPath);
            break;
        case $outExt === 'png': $success = imagepng ($newImage, $newPath);
            break;
        case $outExt === 'gif': $success = imagegif ($newImage, $newPath);
            break;
        case  $outExt === 'bmp': $success = imagebmp ($newImage, $newPath);
            break;
        case  $outExt === 'webp': $success = imagewebp ($newImage, $newPath);
    }

    if (!$success) {
        return null;
    }

    return $newPath;
}

당신은 훌륭합니다! 이것은 간단하고 깨끗한 솔루션입니다. Imagick 모듈에 문제가 있었고이 간단한 클래스로 문제를 해결했습니다. 감사!
Ivijan Stefan Stipić

좋습니다. 원하는 경우 나중에 다른 업데이트를 추가 할 수 있습니다. 조금 개선하겠습니다.
Ivijan 스테판 Stipić

확실한! 나는 아직도 ... 부분의 크기를 조정 애니메이션을 만들 시간이 없어
danigore

@danigore, 원시 이미지의 크기를 조정하는 방법 ( .cr2, .dng, .nef및 기타)? GD2는 지원이없고 많은 노력 끝에 ImageMagick을 설정할 수있었습니다. 그러나 파일을 읽는 동안 연결 시간 초과 오류로 인해 실패합니다. 그리고, 오류 로그없는 중 ..
크리슈나 Chebrolu

1
@danigore Apple 문제를 해결하기 위해 자동 이미지 회전 기능에 추가합니다.
Ivijan Stefan Stipić 2010

2

@Ian Atkin '이 준 답변의 확장 버전이 있습니다. 나는 그것이 매우 잘 작동한다는 것을 알았습니다. 큰 이미지의 경우 :). 주의하지 않으면 실제로 작은 이미지를 더 크게 만들 수 있습니다. 변경 사항 :-jpg, jpeg, png, gif, bmp 파일 지원-.png 및 .gif의 투명도 유지-원본 크기가 이미 작지 않은지 다시 확인-직접 제공된 이미지 무시 (필요한 것)

여기 있습니다. 함수의 기본값은 "황금 규칙"입니다.

function resize_image($file, $w = 1200, $h = 741, $crop = false)
   {
       try {
           $ext = pathinfo(storage_path() . $file, PATHINFO_EXTENSION);
           list($width, $height) = getimagesize($file);
           // if the image is smaller we dont resize
           if ($w > $width && $h > $height) {
               return true;
           }
           $r = $width / $height;
           if ($crop) {
               if ($width > $height) {
                   $width = ceil($width - ($width * abs($r - $w / $h)));
               } else {
                   $height = ceil($height - ($height * abs($r - $w / $h)));
               }
               $newwidth = $w;
               $newheight = $h;
           } else {
               if ($w / $h > $r) {
                   $newwidth = $h * $r;
                   $newheight = $h;
               } else {
                   $newheight = $w / $r;
                   $newwidth = $w;
               }
           }
           $dst = imagecreatetruecolor($newwidth, $newheight);

           switch ($ext) {
               case 'jpg':
               case 'jpeg':
                   $src = imagecreatefromjpeg($file);
                   break;
               case 'png':
                   $src = imagecreatefrompng($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'gif':
                   $src = imagecreatefromgif($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'bmp':
                   $src = imagecreatefrombmp($file);
                   break;
               default:
                   throw new Exception('Unsupported image extension found: ' . $ext);
                   break;
           }
           $result = imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
           switch ($ext) {
               case 'bmp':
                   imagewbmp($dst, $file);
                   break;
               case 'gif':
                   imagegif($dst, $file);
                   break;
               case 'jpg':
               case 'jpeg':
                   imagejpeg($dst, $file);
                   break;
               case 'png':
                   imagepng($dst, $file);
                   break;
           }
           return true;
       } catch (Exception $err) {
           // LOG THE ERROR HERE 
           return false;
       }
   }

훌륭한 기능 @DanielDoinov-게시 해 주셔서 감사합니다-빠른 질문 : 너비 만 전달하고 기능이 원본 이미지를 기준으로 높이를 상대적으로 조정하도록하는 방법이 있습니까? 즉, 원본이 400x200이면 새 너비를 200으로하고 함수가 높이가 100이되어야한다고 인식하도록 할 수 있습니까?
marcnyc

조건식과 관련하여 크기 조정 기술을 실행하는 것이 타당하다고 생각하지 않습니다 $w === $width && $h === $height. 생각해보세요. >=>=비교 해야합니다 . @Daniel
mickmackusa

1

ZF 케이크 :

<?php

class FkuController extends Zend_Controller_Action {

  var $image;
  var $image_type;

  public function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {

    $target_dir = APPLICATION_PATH  . "/../public/1/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);

    //$image = new SimpleImage();
    $this->load($_FILES[$html_element_name]['tmp_name']);
    $this->resize($new_img_width, $new_img_height);
    $this->save($target_file);
    return $target_file; 
    //return name of saved file in case you want to store it in you database or show confirmation message to user



  public function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }
  public function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image,$filename);
      }
      if( $permissions != null) {

         chmod($filename,$permissions);
      }
   }
  public function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }
  public function getWidth() {

      return imagesx($this->image);
   }
  public function getHeight() {

      return imagesy($this->image);
   }
  public function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

  public function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

  public function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

  public function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }

  public function savepicAction() {
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    $this->_response->setHeader('Access-Control-Allow-Origin', '*');

    $this->db = Application_Model_Db::db_load();        
    $ouser = $_POST['ousername'];


      $fdata = 'empty';
      if (isset($_FILES['picture']) && $_FILES['picture']['size'] > 0) {
        $file_size = $_FILES['picture']['size'];
        $tmpName  = $_FILES['picture']['tmp_name'];  

        //Determine filetype
        switch ($_FILES['picture']['type']) {
            case 'image/jpeg': $ext = "jpg"; break;
            case 'image/png': $ext = "png"; break;
            case 'image/jpg': $ext = "jpg"; break;
            case 'image/bmp': $ext = "bmp"; break;
            case 'image/gif': $ext = "gif"; break;
            default: $ext = ''; break;
        }

        if($ext) {
          //if($file_size<400000) {  
            $img = $this->store_uploaded_image('picture', 90,82);
            //$fp      = fopen($tmpName, 'r');
            $fp = fopen($img, 'r');
            $fdata = fread($fp, filesize($tmpName));        
            $fdata = base64_encode($fdata);
            fclose($fp);

          //}
        }

      }

      if($fdata=='empty'){

      }
      else {
        $this->db->update('users', 
          array(
            'picture' => $fdata,             
          ), 
          array('username=?' => $ouser ));        
      }



  }  

1

이 작업을 수행하는 수학적 방법을 찾았습니다.

Github repo- https: //github.com/gayanSandamal/easy-php-image-resizer

라이브 예제-https: //plugins.nayague.com/easy-php-image-resizer/

<?php
//path for the image
$source_url = '2018-04-01-1522613288.PNG';

//separate the file name and the extention
$source_url_parts = pathinfo($source_url);
$filename = $source_url_parts['filename'];
$extension = $source_url_parts['extension'];

//define the quality from 1 to 100
$quality = 10;

//detect the width and the height of original image
list($width, $height) = getimagesize($source_url);
$width;
$height;

//define any width that you want as the output. mine is 200px.
$after_width = 200;

//resize only when the original image is larger than expected with.
//this helps you to avoid from unwanted resizing.
if ($width > $after_width) {

    //get the reduced width
    $reduced_width = ($width - $after_width);
    //now convert the reduced width to a percentage and round it to 2 decimal places
    $reduced_radio = round(($reduced_width / $width) * 100, 2);

    //ALL GOOD! let's reduce the same percentage from the height and round it to 2 decimal places
    $reduced_height = round(($height / 100) * $reduced_radio, 2);
    //reduce the calculated height from the original height
    $after_height = $height - $reduced_height;

    //Now detect the file extension
    //if the file extension is 'jpg', 'jpeg', 'JPG' or 'JPEG'
    if ($extension == 'jpg' || $extension == 'jpeg' || $extension == 'JPG' || $extension == 'JPEG') {
        //then return the image as a jpeg image for the next step
        $img = imagecreatefromjpeg($source_url);
    } elseif ($extension == 'png' || $extension == 'PNG') {
        //then return the image as a png image for the next step
        $img = imagecreatefrompng($source_url);
    } else {
        //show an error message if the file extension is not available
        echo 'image extension is not supporting';
    }

    //HERE YOU GO :)
    //Let's do the resize thing
    //imagescale([returned image], [width of the resized image], [height of the resized image], [quality of the resized image]);
    $imgResized = imagescale($img, $after_width, $after_height, $quality);

    //now save the resized image with a suffix called "-resized" and with its extension. 
    imagejpeg($imgResized, $filename . '-resized.'.$extension);

    //Finally frees any memory associated with image
    //**NOTE THAT THIS WONT DELETE THE IMAGE
    imagedestroy($img);
    imagedestroy($imgResized);
}
?>

0

TinyPNG PHP 라이브러리를 사용해 볼 수 있습니다. 이 라이브러리를 사용하면 크기 조정 과정에서 이미지가 자동으로 최적화됩니다. 라이브러리를 설치하고 https://tinypng.com/developers 에서 API 키를 얻는 데 필요한 모든 것 입니다. 라이브러리를 설치하려면 아래 명령을 실행하십시오.

composer require tinify/tinify

그 후 코드는 다음과 같습니다.

require_once("vendor/autoload.php");

\Tinify\setKey("YOUR_API_KEY");

$source = \Tinify\fromFile("large.jpg"); //image to be resize
$resized = $source->resize(array(
    "method" => "fit",
    "width" => 150,
    "height" => 100
));
$resized->toFile("thumbnail.jpg"); //resized image

동일한 주제에 대한 블로그를 작성했습니다. http://artisansweb.net/resize-image-php-using-tinypng


0

쉬운 방법을 제안합니다.

function resize($file, $width, $height) {
    switch(pathinfo($file)['extension']) {
        case "png": return imagepng(imagescale(imagecreatefrompng($file), $width, $height), $file);
        case "gif": return imagegif(imagescale(imagecreatefromgif($file), $width, $height), $file);
        default : return imagejpeg(imagescale(imagecreatefromjpeg($file), $width, $height), $file);
    }
}

0
private function getTempImage($url, $tempName){
  $tempPath = 'tempFilePath' . $tempName . '.png';
  $source_image = imagecreatefrompng($url); // check type depending on your necessities.
  $source_imagex = imagesx($source_image);
  $source_imagey = imagesy($source_image);
  $dest_imagex = 861; // My default value
  $dest_imagey = 96;  // My default value

  $dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

  imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

  imagejpeg($dest_image, $tempPath, 100);

  return $tempPath;

}

이것은 훌륭한 설명을 기반으로 한 조정 된 솔루션입니다 . 이 사람은 단계별 설명을했습니다. 모두가 그것을 즐기기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.