古いですが下記のようなバグレポートがありました。
https://bugs.php.net/bug.php?id=59643
PNGでのファイル読み込みは、ただ画像を読んでるだけですが、フルパスでパス指定しないと不規則にエラーがでるようです。
php
1$image = new Imagick(realpath('image.png'));
2//OR
3//$image = new Imagick('/path/to/image.png'); //フルパス
4
5$image->setImageFormat('png');
6$image->thumbnailImage(100, 0);
7
8header('Content-type: image/png');
9echo $image;
= 追記 =
コメントでPHP-5.2、セーフモードという情報をいただいたので、回答に追記しておきます。
file_get_contents()、**file_put_contents()**は、php-5.2
でも動くのでセーフモードの可能性が高いです。ただし、ファイル書き込みを権限(Webサーバーと同じオーナー)のあるディレクトリに置けば、解決できる可能性があります。そのようなディレクトリがない場合はコマンドなどで作成します。
セーフモードでは、通常Webサーバーのオーナーをチェックします。設定によって動きが異なるので、phpinfo()
などでチェックしてください。
また、allow_url_fopen
のオプションも確認してみてください。下記サンプルコードはallow_url_fopen設定とセーフモードを配慮したコードです。
セーフモードでallow_url_fopen = 0ff
※注意
- allow_url_fopen = Offで、設定変更できない場合は極端に使える選択肢が狭まります。例えば下記のように
CURL
を使います。
- 下記セーフモード許可ディレクトリとは、Webサーバーのオーナー(所有者)と同じオーナーのディレクトリを指します。
php
1ini_set('display_errors', 1);
2error_reporting(E_ALL);
3
4$path = 'セーフモード許可ディレクトリ/image.png';
5
6$curl = curl_init('http://wabito.maru1244.jp/face_place/image.png');
7curl_setopt($curl, CURLOPT_HEADER, 0);
8curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
9curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
10
11//CURLで画像をダウンロード
12$raw = curl_exec($curl);
13
14if (false !== file_put_contents($path, $raw)) {
15 $image = new Imagick(realpath($path));
16 $image->setImageFormat('png');
17 $image->thumbnailImage(100, 0);
18
19 header('Content-type: image/png');
20 echo $image;
21}
22
23//CURLセッションクローズ
24curl_close($curl);
セーフモードでallow_url_fopen = On
※注意
- 下記どのサンプルでも
allow_url_fopen = On
になっている必要があります。php.ini
などの設定ファイルでしか変更できないので注意してください。
- 下記セーフモード許可ディレクトリとは、Webサーバーのオーナー(所有者)と同じオーナーのディレクトリを指します。
php
1ini_set('display_errors', 1);
2error_reporting(E_ALL);
3
4$path = 'セーフモード許可ディレクトリ/image.png';
5
6if (copy('http://wabito.maru1244.jp/face_place/image.png', $path)) {
7 $image = new Imagick(realpath($path));
8 $image->setImageFormat('png');
9 $image->thumbnailImage(100, 0);
10
11 header('Content-type: image/png');
12 echo $image;
13}
下記はfile_get_contents()
、file_put_contents()
を使うサンプルです。
php
1ini_set('display_errors', 1);
2error_reporting(E_ALL);
3
4$path = 'セーフモード許可ディレクトリ/image.png';
5$image = file_get_contents('http://wabito.maru1244.jp/face_place/image.png');
6
7if(false !== file_put_contents($path, $image)) {
8 $image = new Imagick(realpath($path));
9 $image->setImageFormat('png');
10 $image->thumbnailImage(100, 0);
11
12 header('Content-type: image/png');
13 echo $image;
14}