본문 바로가기

개발이야기/PHP

php 이미지 리사이징(image resizing)

728x90

php 이미지 리사이징(image resizing)





개발작업을 하다보면, 게시판에 썸네일이나 서버의 용량제한 및 관리, 이미지 크기 규격화 등 여러가지의 이유로 사용자가 업로드한 이미지를 리사이징 해야 하는 경우가 발생합니다. 오늘은 PHP로 이미지 정보를 리사이징 하는 예제를 보여드리겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?
class Image {
    
    var $file;
    var $image_width;
    var $image_height;
    var $width;
    var $height;
    var $ext;
    var $types = array('','gif','jpeg','png','swf');
    var $quality = 80;
    var $top = 0;
    var $left = 0;
    var $crop = false;
    var $type;
    
    function Image($name='') {
        $this->file = $name;
        $info = getimagesize($name);
        $this->image_width = $info[0];
        $this->image_height = $info[1];
        $this->type = $this->types[$info[2]];
        $info = pathinfo($name);
        $this->dir = $info['dirname'];
        $this->name = str_replace('.'.$info['extension'], ''$info['basename']);
        $this->ext = $info['extension'];
    }
    
    function dir($dir='') {
        if(!$dirreturn $this->dir;
        $this->dir = $dir;
    }
    
    function name($name='') {
        if(!$namereturn $this->name;
        $this->name = $name;
    }
    
    function width($width='') {
        $this->width = $width;
    }
    
    function height($height='') {
        $this->height = $height;
    }
    
    function resize($percentage=50) {
        if($this->crop) {
            $this->crop = false;
            $this->width = round($this->width*($percentage/100));
            $this->height = round($this->height*($percentage/100));
            $this->image_width = round($this->width/($percentage/100));
            $this->image_height = round($this->height/($percentage/100));
        } else {
            $this->width = round($this->image_width*($percentage/100));
            $this->height = round($this->image_height*($percentage/100));
        }
        
    }
    
    function crop($top=0$left=0) {
        $this->crop = true;
        $this->top = $top;
        $this->left = $left;
    }
    
    function quality($quality=80) {
        $this->quality = $quality;
    }
    
    function show() {
        $this->save(true);
    }
    
    function save($show=false) {
 
        if($show) @header('Content-Type: image/'.$this->type);
        
        if(!$this->width && !$this->height) {
            $this->width = $this->image_width;
            $this->height = $this->image_height;
        } elseif (is_numeric($this->width) && empty($this->height)) {
            $this->height = round($this->width/($this->image_width/$this->image_height));
        } elseif (is_numeric($this->height) && empty($this->width)) {
            $this->width = round($this->height/($this->image_height/$this->image_width));
        } else {
            if($this->width<=$this->height) {
                $height = round($this->width/($this->image_width/$this->image_height));
                if($height!=$this->height) {
                    $percentage = ($this->image_height*100)/$height;
                    $this->image_height = round($this->height*($percentage/100));
                }
            } else {
                $width = round($this->height/($this->image_height/$this->image_width));
                if($width!=$this->width) {
                    $percentage = ($this->image_width*100)/$width;
                    $this->image_width = round($this->width*($percentage/100));
                }
            }
        }
        
        if($this->crop) {
            $this->image_width = $this->width;
            $this->image_height = $this->height;
        }
 
        if($this->type=='jpeg'$image = imagecreatefromjpeg($this->file);
        if($this->type=='png'$image = imagecreatefrompng($this->file);
        if($this->type=='gif'$image = imagecreatefromgif($this->file);
        
        $new_image = imagecreatetruecolor($this->width, $this->height);
        imagecopyresampled($new_image$image00$this->top, $this->left, $this->width, $this->height, $this->image_width, $this->image_height);
        
        $name = $show ? null$this->dir.DIRECTORY_SEPARATOR.$this->name.'.'.$this->ext;
    
        if($this->type=='jpeg') imagejpeg($new_image$name$this->quality);
        if($this->type=='png') imagepng($new_image$name);
        if($this->type=='gif') imagegif($new_image$name);
 
        imagedestroy($image); 
        imagedestroy($new_image);
        
    }
    
}
  
 
/*  사용방법
$re_image = new Image(이미지 파일명);
$re_image -> width(200);
$re_image -> height(300);
$re_image -> save();
*/
?>
cs


상세한 소스 설명은 따로 하지 않겠습니다. 댓글남겨 주시면 답변으로 드리겠습니다.

위에 사용방법에 나와있는 width, height, save 외에도 안에 여러 함수들이 있습니다.

품질을 정하는 quality도 있고, 리사이징 된 이미지를 바로 보여주는 show도 있습니다.


먼저 클래스 선언 시 리사이징 할 이미지의 파일이름을 넣어 주시고, 리사이징할 가로값 세로값을 입력하고 마지막에 save를 합니다.

save시 같은 경로에 저장이 되니 꼭 확인 해야 합니다.