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

source: OpenPNE/branches/work/ebihara/prj_renew_OpenPNE_Img/webapp/lib/OpenPNE/Img/Generator.php @ 6910

Last change on this file since 6910 was 6910, checked in by ebihara, 12 years ago

OpenPNE_Img_Generator::checkFormatString()のswitch文を置き換え

File size: 7.6 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7/**
8 * OpenPNEで画像処理をおこなうGeneratorのスーパークラス
9 *
10 * @package OpenPNE
11 * @author Kousuke Ebihara <ebihara@tejimaya.net>
12 */
13class OpenPNE_Img_Generator
14{
15    var $jpeg_quality = 75;
16
17    var $source_format;
18    var $output_format;
19
20    var $cache_dir;
21    var $cache_fullpath;
22
23    function OpenPNE_Img_Generator($options = array())
24    {
25        if (!empty($options['jpeg_quality'])) {
26            $this->jpeg_quality = $options['jpeg_quality'];
27        }
28
29        if (!empty($options['cache_dir'])) {
30            $this->cache_dir = $options['cache_dir'];
31        }
32    }
33
34    function createImage($raw_img, $w, $h, $format)
35    {
36        // サイズ指定がなく、かつ、形式変換しない場合(GDに変換する必要なし)
37        if (!$w && !$h && ($this->getSourceFormat() == $this->getOutputFormat())) {
38            $this->createCacheFromRawImage($this->cache_fullpath, $this->cache_dir, $raw_img);
39            return true;
40        }
41
42        // create a GD image from raw_img
43        if (!$source_gdimg  = imagecreatefromstring($raw_img)) {
44            return false;
45        }
46
47        if ($format == 'jpg') {
48            // JPEGの場合、携帯対応
49            imageinterlace($source_gdimg, 0);
50        }
51
52        // リサイズ
53        $output_img = $this->resizeImage($source_gdimg, $w, $h);
54
55        // キャッシュを生成
56        if ($output_img) {
57            $this->createCache($this->cache_fullpath, $this->cache_dir, $output_img);
58        } else {
59            $this->createCacheFromRawImage($this->cache_fullpath, $this->cache_dir, $raw_img);
60        }
61
62        return true;
63    }
64
65    /**
66     * GDイメージのリサイズ+形式変換
67     *
68     * @param resource $gdimg source GD image
69     * @param int $w width
70     * @param int $h height
71     * @return resource output GD image
72     */
73    function resizeImage($source_gdimg, $w, $h)
74    {
75        $s_width  = imagesx($source_gdimg);
76        $s_height = imagesy($source_gdimg);
77
78        if (!$w) $w = $s_width;
79        if (!$h) $h = $s_height;
80
81        // リサイズの必要がない場合
82        if ($s_width <= $w && $s_height <= $h) {
83            // 形式変換する場合はGDを通す
84            if ($this->source_format != $this->output_format) {
85                return $source_gdimg;
86            }
87            return false;
88        }
89
90        // 出力サイズ
91        $o_width  = $s_width;
92        $o_height = $s_height;
93
94        if ($w < $s_width) {
95            $o_width  = $w;
96            $o_height = $s_height * $w / $s_width;
97        }
98        if ($h < $o_height && $h < $s_height) {
99            $o_width  = $s_width * $h / $s_height;
100            $o_height = $h;
101        }
102
103        if ($o_height < 1.) {
104            $o_height = 1;
105        }
106        if ($o_width < 1.) {
107            $o_width = 1;
108        }
109
110        $output_gdimg = imagecreatetruecolor($o_width, $o_height);
111
112        if (($this->output_format == 'gif') || ($this->output_format == 'png')) {
113            $trnprt_idx_s = imagecolortransparent($source_gdimg);
114            if ($trnprt_idx_s >= 0) { // 透過色が設定されている
115                imagetruecolortopalette($output_gdimg, true, 256);
116
117                // 入力画像から透明色取得
118                $trnprt_color = imagecolorsforindex($source_gdimg, $trnprt_idx_s);
119
120                // 出力画像に透明色設定
121                imagecolorset($source_gdimg, 0, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
122                imagefill($output_gdimg, 0, 0, 0);
123                imagecolortransparent($output_gdimg, 0);
124            } elseif ($this->output_format == 'png') {  // PNG-24
125                // アルファチャンネル情報を保存するには、アルファブレンディングを解除する必要がある
126                imagealphablending($output_gdimg, false);
127                imagesavealpha($output_gdimg, true);
128
129                // 透過色設定
130                $color = imagecolorallocatealpha($output_gdimg, 0, 0, 0, 127);
131                imagefill($output_gdimg, 0, 0, $color);
132            }
133        }
134
135        imagecopyresampled($output_gdimg, $source_gdimg,
136                0, 0, 0, 0, $o_width, $o_height, $s_width, $s_height);
137        return $output_gdimg;
138    }
139
140    function createCacheFromRawImage($cache_fullpath, $cache_dir, $raw_img)
141    {
142        $this->createCacheSubdir($cache_fullpath, $cache_dir);
143
144        if ($this->getOutputFormat() == 'png') {
145            touch($cache_fullpath);
146            $output_gdimg = imagecreatefromstring($raw_img);
147            imagepng($output_gdimg, $cache_fullpath);
148        } else {
149            $handle = fopen($cache_fullpath, 'wb');
150            fwrite($handle, $raw_img);
151            fclose($handle);
152        }
153    }
154
155    function createCache($cache_fullpath, $cache_dir, $output_gdimg)
156    {
157        $this->createCacheSubdir($cache_fullpath, $cache_dir);
158
159        touch($cache_fullpath);
160        switch ($this->getOutputFormat()) {
161        case 'jpeg':
162        case 'jpg':
163        default:
164            imagejpeg($output_gdimg, $cache_fullpath, $this->jpeg_quality); break;
165        case 'gif':
166            imagegif($output_gdimg, $cache_fullpath);
167            break;
168        case 'png':
169            imagepng($output_gdimg, $cache_fullpath);
170            break;
171        }
172    }
173
174    function createCacheSubdir($cache_fullpath, $cache_dir)
175    {
176        $subdir = dirname($cache_fullpath);
177        if (!is_dir($subdir)) {
178            // mkdir recursive
179            $_dir = $cache_dir;
180            if (!is_dir($_dir) && !mkdir($_dir)) {
181                return false;
182            }
183            $relative_path = substr($subdir, strlen($cache_dir)+1);
184            $parts = explode('/', $relative_path);
185            foreach ($parts as $part) {
186                $_dir .=  '/' . $part;
187                if (!is_dir($_dir) && !mkdir($_dir)) {
188                    return false;
189                }
190            }
191        }
192    }
193
194    function checkFormatString($string)
195    {
196        $string = strtolower($string);
197
198        $format = 'jpg';
199        if ($string == 'gif' || $string == 'png') {
200            $format = $string;
201        }
202       
203        return $format;
204    }
205
206    function setCacheFileName($filename, $w, $h)
207    {
208        $pieces = explode('.', $filename);
209        $this->setSourceFormat($this->checkFormatString(array_pop($pieces)));
210
211        $f = $this->getOutputFormat();
212
213        $this->cache_fullpath =
214                 $this->cache_dir . '/' .
215                 $this->getCachePath($filename, $w, $h, $f);
216    }
217
218    function setOutputFormat($output_format = '')
219    {
220        if ($output_format) {
221            $this->output_format = $this->checkFormatString($output_format);
222        } else {
223            $this->output_format = $this->checkFormatString($this->getSourceFormat());
224        }
225    }
226
227    function setSourceFormat($source_format)
228    {
229        $this->source_format = $source_format;
230    }
231
232    function getOutputFormat()
233    {
234        return $this->output_format;
235    }
236
237    function getSourceFormat()
238    {
239        return $this->source_format;
240    }
241
242    function getCacheFullpath()
243    {
244        return $this->cache_fullpath;
245    }
246
247    function getCachePath($filename, $w, $h, $f)
248    {
249        $prefix = OPENPNE_IMG_CACHE_PREFIX;
250
251        if (!$w) $w = '';
252        if (!$h) $h = '';
253        $file = str_replace('.', '_', $filename) . '.' . $f;
254
255        $path = "{$f}/w{$w}_h{$h}/{$prefix}{$file}";
256        return $path;
257    }
258
259    function isCacheReadable()
260    {
261        return is_readable($this->cache_fullpath);
262    }
263}
264
265?>
Note: See TracBrowser for help on using the repository browser.