ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/webapp/lib/util/image.php @ 1856

Last change on this file since 1856 was 1856, checked in by takanashi, 16 years ago

copyright表記修正

File size: 9.5 KB
Line 
1<?php
2/**
3 * @copyright 2005-2007 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7function image_cache_delete($image_filename)
8{
9    $cache_dir = OPENPNE_IMG_CACHE_DIR;
10    $cache_filename = OPENPNE_IMG_CACHE_PREFIX . str_replace('.', '_', $image_filename);
11
12    foreach ((array)glob($cache_dir.'/jpg/w*_h*', GLOB_ONLYDIR) as $dir) {
13        $path = $dir . '/' . $cache_filename . '.jpg';
14        if (file_exists($path)) unlink($path);
15    }
16    foreach ((array)glob($cache_dir.'/gif/w*_h*', GLOB_ONLYDIR) as $dir) {
17        $path = $dir . '/' . $cache_filename . '.gif';
18        if (file_exists($path)) unlink($path);
19    }
20    foreach ((array)glob($cache_dir.'/png/w*_h*', GLOB_ONLYDIR) as $dir) {
21        $path = $dir . '/' . $cache_filename . '.png';
22        if (file_exists($path)) unlink($path);
23    }
24}
25
26/**
27 * 画像フォーマット判定
28 */
29function t_check_image_format($file, $type = 0)
30{
31    if (!$type) {
32        list($width, $height, $type, $attr) = @getimagesize($file['tmp_name']);
33    }
34
35    $format = false;
36    switch ($type) {
37    case IMAGETYPE_GIF:
38        if (@imagecreatefromgif($file['tmp_name'])) $format = 'gif';
39        break;
40    case IMAGETYPE_JPEG:
41        if (@imagecreatefromjpeg($file['tmp_name'])) $format = 'jpg';
42        break;
43    case IMAGETYPE_PNG:
44        if (@imagecreatefrompng($file['tmp_name'])) $format = 'png';
45        break;
46    default:
47        break;
48    }
49
50    return $format;
51}
52
53/**
54 * アップロード画像の正当性チェック
55 *
56 * @param array $file ファイル情報($_FILE['xxx'])
57 * @return array ファイル情報 | 失敗時false
58 */
59function t_check_image($file)
60{
61    if (!$file || $file['error']) {
62        return false;
63    }
64    list($width, $height, $type, $attr) = @getimagesize($file['tmp_name']);
65
66    if (!($format = t_check_image_format($file, $type))) {
67        return false;
68    }
69
70    if ($file['size'] > IMAGE_MAX_FILESIZE * 1024) {
71        return false;
72    }
73
74    $need_resize = false;
75    $original_width = $width;
76    $original_height = $height;
77    //横のサイズが、指定されたサイズより大きい場合
78    if (IMAGE_MAX_WIDTH && ($width > IMAGE_MAX_WIDTH)) {
79        $need_resize = true;
80        $height = $height * (IMAGE_MAX_WIDTH / $width);
81        $width = IMAGE_MAX_WIDTH;
82    }
83    //縦サイズが、指定されたサイズより大きい場合
84    if (IMAGE_MAX_HEIGHT && ($height > IMAGE_MAX_HEIGHT)) {
85        $need_resize = true;
86        $width = $width * (IMAGE_MAX_HEIGHT / $height);
87        $height = IMAGE_MAX_HEIGHT;
88    }
89    if ($need_resize) {
90        resize_image($type, $file['tmp_name'], $file['tmp_name'], $original_width, $original_height,$width, $height );
91    }
92   
93    $image = array(
94        'format' => $format,
95        'size'   => $file['size'],
96        'width'  => $width,
97        'height' => $height,
98    );
99    return $image;
100}
101/**
102 *画像をリサイズし、出力する。
103 *@param $type 画像タイプ
104 *@param $src_filename 変換元画像ファイル名
105 *@param $dst_filename 変換先画像ファイル名
106 *@param $original_width 変換元画像の画像幅
107 *@param $original_height 変換元画像の画像高さ
108 *@param $new_width 変換先画像の画像幅
109 *@param $new_height 変換先画像の画像高さ
110 */
111function resize_image( $type, $src_filename, $dst_filename, $original_width, $original_height, $new_width, $new_height)
112{
113    $src_img = NULL;
114    $dst_img = NULL;
115   
116    switch ($type) {
117        case IMAGETYPE_GIF:
118            $src_img = imagecreatefromgif ( $src_filename );
119            $transparentIndex = imagecolortransparent($src_img);
120            //透過GIFの場合
121            if($transparentIndex >= 0){
122                $dst_img = imagecreate ( $new_width, $new_height );
123                $transparentColor=imagecolorsforindex($src_img, $transparentIndex); 
124                $transparent=imagecolorallocate($dst_img, $transparentColor['red'], $transparentColor['green'], $transparentColor['blue']); 
125                imagecolortransparent($dst_img, $transparent); 
126                imagecopyresized ($dst_img,$src_img,0,0,0,0,$new_width,$new_height,$original_width,$original_height);
127            }
128            //透過GIFで無い場合
129            else{
130                $dst_img = imagecreatetruecolor( $new_width, $new_height );
131                imagecopyresampled ($dst_img,$src_img,0,0,0,0,$new_width,$new_height,$original_width,$original_height);
132                imagetruecolortopalette($dst_img, true, 256); 
133            }
134            imagegif ( $dst_img, $dst_filename ); 
135            break;
136        case IMAGETYPE_JPEG:
137               $src_img = imagecreatefromjpeg ( $src_filename ); 
138            $dst_img = imagecreatetruecolor ( $new_width, $new_height );
139            imagecopyresampled ($dst_img,$src_img,0,0,0,0,$new_width,$new_height,$original_width,$original_height);
140            imagejpeg ( $dst_img, $dst_filename );
141            break;
142        case IMAGETYPE_PNG:
143            $src_img = imagecreatefrompng ( $src_filename );
144            //TrueColor PNGの場合
145            if(imageistruecolor($src_img)) { 
146                $dst_img = imagecreatetruecolor ( $new_width, $new_height );
147                imagealphablending($dst_img, false);
148                imagecopyresampled ($dst_img,$src_img,0,0,0,0,$new_width,$new_height,$original_width,$original_height);
149                imagesavealpha($dst_img, true);
150            }
151            //TrueColor PNGで無い場合
152            else{
153                //透過PNGの場合
154                if($transparentIndex >= 0){
155                    $dst_img = imagecreate ( $new_width, $new_height );
156                    $transparentColor=imagecolorsforindex($src_img, $transparentIndex); 
157                    $transparent=imagecolorallocate($dst_img, $transparentColor['red'], $transparentColor['green'], $transparentColor['blue']); 
158                    imagecolortransparent($dst_img, $transparent); 
159                    imagecopyresized ($dst_img,$src_img,0,0,0,0,$new_width,$new_height,$original_width,$original_height);
160                }
161                //透過PNGで無い場合
162                    else{
163                        $dst_img = imagecreatetruecolor( $new_width, $new_height );
164                    imagecopyresampled ($dst_img,$src_img,0,0,0,0,$new_width,$new_height,$original_width,$original_height);
165                    imagetruecolortopalette($dst_img, true, 256); 
166                }
167            }
168            imagepng ( $dst_img, $dst_filename );
169            break;
170        default:
171            break;
172
173    }
174    //リリースを解放
175    imagedestroy ( $dst_img );
176    imagedestroy ( $src_img );
177}
178
179/**
180 * 確認画面用に一時ファイルを保存して、そのファイル名を返す
181 *
182 * 保存先:     var/tmp/
183 * ファイル名: ($prefix)_($uid).[(jpe?g)|(gif)|(png)]
184 */
185function t_image_save2tmp($upfile, $uid, $prefix='', $ext='')
186{
187    if (!$ext) $ext = t_check_image_format($upfile);
188
189    // 一時ファイル保存ディレクトリ
190    $img_tmp_dir_path = OPENPNE_VAR_DIR . '/tmp/';
191
192    $filename = sprintf('%s_%s.%s', $prefix, $uid, $ext);
193    $filepath = $img_tmp_dir_path . $filename;
194
195    if (!file_exists($upfile['tmp_name'])) {
196        return false;
197    }
198
199    if (OPENPNE_TMP_IMAGE_DB) {
200        if (!image_insert_c_tmp_image($upfile, $filename)) {
201            return false;
202        }
203    } else {
204        move_uploaded_file($upfile['tmp_name'], $filepath);
205        chmod($filepath, 0644);
206        if (!is_file($filepath)) {
207            return false;
208        }
209    }
210
211    return $filename;
212}
213
214/**
215 * 確認画面用の一時ファイルをすべて削除
216 */
217function t_image_clear_tmp($uid)
218{
219    if (!OPENPNE_TMP_IMAGE_DB) {
220        $img_tmp_dir_path = OPENPNE_VAR_DIR . "/tmp/";
221        $files = glob($img_tmp_dir_path . '*_' . $uid . '.*');
222        if (is_array($files)) {
223            foreach ($files as $filename) {
224                unlink($filename);
225            }
226        }
227    } else {
228        t_image_clear_tmp_db($uid);
229    }
230}
231
232function image_insert_c_image4tmp($prefix, $tmpfile)
233{
234    if (!$tmpfile || preg_match('/[^\.\w]/', $tmpfile)) return false;
235
236    $path_parts = pathinfo($tmpfile);
237    $ext = $path_parts['extension'];
238    $ext = strtolower($ext);
239
240    $allowed_ext = array('jpg', 'jpeg', 'gif', 'png');
241    if (!in_array($ext, $allowed_ext)) {
242        return false;
243    }
244
245    $filename = sprintf('%s_%s.%s', $prefix, time(), $ext);
246
247    if (!OPENPNE_TMP_IMAGE_DB) {
248        $img_tmp_dir_path = OPENPNE_VAR_DIR . '/tmp/';
249        $filepath = $img_tmp_dir_path . basename($tmpfile);
250
251        if (_do_insert_c_image($filename, $filepath)) {
252            return $filename;
253        }
254    } else {
255        $c_tmp_image = c_tmp_image4filename($tmpfile);
256
257        $params = array(
258            'filename' => $filename,
259            'bin' => $c_tmp_image['bin'],
260            'r_datetime' => db_now(),
261        );
262        if (db_insert("c_image", $params)) {
263            return $filename;
264        }
265    }
266    return false;
267}
268
269function image_insert_c_image($upfile_obj, $filename)
270{
271    if (!$upfile_obj) return false;
272
273    $filepath = $upfile_obj['tmp_name'];
274
275    $path_parts = pathinfo($upfile_obj['name']);
276    $ext = $path_parts['extension'];
277    $ext = strtolower($ext);
278    $filename = $filename . '_' . time() . '.' . $ext;
279
280    if (!_do_insert_c_image($filename, $filepath)) {
281        return false;
282    }
283    return $filename;
284}
285
286function image_insert_c_tmp_image($upfile_obj, $filename)
287{
288    if (!$upfile_obj) {
289        return false;
290    }
291
292    $filepath = $upfile_obj['tmp_name'];
293
294    $result = _do_insert_c_tmp_image($filename, $filepath);
295    if (!$result) {
296        return false;
297    }
298    return $filename;
299}
300
301?>
Note: See TracBrowser for help on using the repository browser.