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

source: OpenPNE/trunk/webapp/lib/OpenPNE/Img/ImageMagick.php @ 2

Last change on this file since 2 was 2, checked in by ogawa, 16 years ago

OpenPNE 2.3.0

File size: 4.1 KB
Line 
1<?php
2/**
3 * @copyright 2005-2006 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7class OpenPNE_Img_ImageMagick extends OpenPNE_Img
8{
9    function OpenPNE_Img_ImageMagick($options = array())
10    {
11        parent::OpenPNE_Img($options);
12    }
13
14    function get_raw_img()
15    {
16        // 実画像キャッシュがあるかどうかチェック
17        if ($this->check_rawcache()) {
18            $filename = $this->get_rawcache_filename();
19
20            $fd = fopen($filename, 'r');
21            $data = fread($fd, filesize($filename));
22            fclose($fd);
23
24            return $data;
25        } else {
26            //DBから取得
27            if (!$data = $this->get_raw_img4db()) {
28                return false;
29            }
30
31            // 取得した画像を一旦ファイルに書き出し
32            $this->create_rawcache($data);
33
34            return $data;
35        }
36    }
37
38    function resize_img($source_gdimg, $w, $h)
39    {
40        $s_width  = imagesx($source_gdimg);
41        $s_height = imagesy($source_gdimg);
42
43        // リサイズも形式変換も必要ない場合
44        if ((!$w || $s_width <= $w) && (!$h || $s_height <= $h) &&
45            ($this->source_format == $this->output_format)) {
46
47            return false;
48        }
49
50        $convert_command = $this->get_imgmagick_convert_command($w, $h);
51        $output_img = $this->exec_imgmagick_convert($convert_command);
52
53        return $output_img;
54    }
55
56    /**
57     * 実画像キャッシュがあるか判定
58     */
59    function check_rawcache()
60    {
61        return is_readable($this->get_rawcache_filename());
62    }
63
64    /**
65     * サムネイルキャッシュを作成する
66     */
67    function create_cache($output_img)
68    {
69        $this->create_cache_subdir();
70
71        $file = fopen($this->cache_fullpath, "wb");
72        fwrite($file, $output_img);
73        fclose($file);
74    }
75
76    /**
77     * 実画像キャッシュを作成する
78     */
79    function create_rawcache($rawimage)
80    {
81        $raw_fullpath = $this->get_rawcache_filename();
82        $this->create_cache_rawdir();
83
84        if ($this->output_format == 'png') {
85            touch($raw_fullpath);
86            $output_gdimg = imagecreatefromstring($rawimage);
87            imagepng($output_gdimg, $raw_fullpath);
88        } else {
89            $handle = fopen($raw_fullpath, 'wb');
90            fwrite($handle, $rawimage);
91            fclose($handle);
92        }
93    }
94
95    /**
96     * 実画像キャッシュディレクトリを作成する
97     */
98    function create_cache_rawdir()
99    {
100        $subdir = dirname($this->get_rawcache_filename());
101        if (!is_dir($subdir)) {
102            mkdir($subdir);
103        }
104    }
105
106    /**
107     * ImageMagickのコマンドラインを作成して返す
108     */
109    function get_imgmagick_convert_command($w, $h)
110    {
111        $opt = (defined('IMGMAGICK_OPT') && IMGMAGICK_OPT) ? IMGMAGICK_OPT : "-resize";
112
113        // 念のため escape をかける
114        $w = intval($w);
115        $h = intval($h);
116        $f = escapeshellcmd($this->output_format);
117        $path = realpath($this->get_rawcache_filename());
118
119        return IMGMAGICK_APP." $opt {$w}x{$h} $path {$f}:-";
120    }
121
122    /**
123     * ImageMagickのconvertを起動する
124     */
125    function exec_imgmagick_convert($command)
126    {
127        while (@ob_end_clean());
128        ob_start();
129        passthru($command);
130        $output_img = ob_get_contents();
131        while (@ob_end_clean());
132
133        return $output_img;
134    }
135
136    /**
137     * 実サイズ画像用の保存ファイル名を返す
138     */
139    function get_rawcache_filename()
140    {
141        // ディレクトリ名
142        // キャッシュが削除されるためにはパターン「w*_h*」に適合する必要がある
143        $size = 'w_h_raw';
144
145        // ex.) img_cache_m_11_1115813647
146        $cache_filename = OPENPNE_IMG_CACHE_PREFIX .
147            str_replace('.', '_', $this->source_filename) .
148            '.' . $this->source_format;
149
150        // ex.) /var/img_cache/jpg/w180_h180/{filename}
151        return
152            $this->cache_dir . '/' .
153            $this->source_format . '/' .
154            $size . '/' .
155            $cache_filename;
156    }
157}
158
159?>
Note: See TracBrowser for help on using the repository browser.