質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Q&A

解決済

2回答

1026閲覧

phpのimageMagickで透過png画像を扱いたい。

maru1244

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

0グッド

0クリップ

投稿2017/12/24 04:55

編集2017/12/24 13:06

PHPで顔のパーツをランダムに組み合わせて、運命の人的な顔を表示したいです。

HTTP 500 エラーになる

エラーメッセージ

HTTP 500 エラーは下記の通りです。
申し訳ありません。Web サイトはこのページを表示できません
このサイトではメンテナンス中であるか、プログラミング エラーが発生している可能性があります。

php言語です。

<?php header('Content-type: image/png'); $image = new Imagick('image.png'); // 幅あるいは高さに 0 を指定すると、 // 元の画像のアスペクト比を維持します $image->thumbnailImage(100, 0); echo $image; ?>

と書きました。

上記のソースでは画像の合成にはなりませんが、この一番シンプルなImageMagickのプログラムでも
500エラーになります。もちろん合成のソースでもエラーになります。
これをヘッダーをjpegにして、jpg画像で試すと、ちゃんとサムネイルが表示されます。
pngだとうまくいかないのです。

Visual studio codeを使って書いています。
Bomはついていないです。
言語はphpで現時点ではhtmlに埋め込んではいなくて、上記のソースだけをtest.phpに書いて
サーバーにアップロードしてブラウザーで読み込んでいます。
レンタルサーバーでステップサーバーというところです。
サーバーに問い合わせたところ、弊社で調べたところ、pngはちゃんと扱えていますとのこと。

シンプルなソースなのでなぜ500エラーになるかわかりません。
ちなみにpng画像を作ったのは、FireAlpacaというお絵かきソフトです。
透過pngで作りました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/12/24 09:43

質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
guest

回答2

0

HTTP 500 エラーとは「サーバーの中でなんかのエラーがあるよ」というくらいのざっくりとしたメッセージで、Apache(Webサーバー)が表示するものです。このメッセージから解決するには情報が不足しています。

解決するにはPHPが返すエラーを元にデバッグするしかありません。

PHPのエラーを躯体的に表示するには、

php

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4

この2行をPHPファイルの先頭に記述することでより具体的なエラーを表示することができます。
このエラーを元に解決のヒントを探ってください。

投稿2017/12/24 06:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maru1244

2017/12/24 13:17

回答ありがとうございます。 <b>Fatal error</b>: Uncaught exception 'ImagickException' with message 'corrupt image `/var/tmp/magick-nJk16rE4' @ error/png.c/ReadPNGImage/3067' イメージが破損していると出ました。 画像についてはあまり詳しくはないのですが、pngで保存出来て 開くことができるファイルでも、壊れている場合があるのですね。 フォトショップとか有名なものを使えばいいのでしょうか?
退会済みユーザー

退会済みユーザー

2017/12/24 13:19

> フォトショップとか有名なものを使えばいいのでしょうか? フォトショップとはいわないけど、他のソフトで作ったのものを試してみるとかしたらどうですか?
maru1244

2017/12/27 18:47

回答ありがとうございます。 画像検索でpng画像をいくつか保存して使ってみたのですが、 どれも表示されませんでした。
退会済みユーザー

退会済みユーザー

2017/12/28 06:58

エラーメッセージを記述してくれないと、回答できません。 「どれも表示されませんでした。」では何の解決にもつながりません。情報がないに等しい。
guest

0

ベストアンサー

古いですが下記のようなバグレポートがありました。
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}

投稿2017/12/24 18:18

編集2017/12/30 06:40
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maru1244

2017/12/27 18:45

こんばんは。返信ありがとうございます。 一応エラーは出なくなりました。 が、画像がバツ印で表示されない状態です。 何かわかる点がありましたらお願いします。 <code> <?php //今のところ一応バッテン印が表示されるまではなったバージョン //エラーの原因を指摘してくれるコード ini_set('display_errors', 1); error_reporting(E_ALL); $image = new Imagick(realpath('http://wabito.maru1244.jp/face_place/image.png')); //OR //$image = new Imagick('/path/to/image.png'); //フルパス header('Content-type: image/png'); echo $image; ?> </code>
Tomak

2017/12/28 04:40

realpath() はサーバーに保存されている画像の相対パスをフルパスにするためのものです。外部URLを開く場合は、php.ini で「allow_url_fopen = 1」に設定されていることを確認して、下記のようにします。 ---- //エラーの原因を指摘してくれるコード ini_set('display_errors', 1); error_reporting(E_ALL); //外部URLの画像を取得してカレントディレクトリにimage.pngとして保存 $image = file_get_contents('http://wabito.maru1244.jp/face_place/image.png'); file_put_contents('image.png', $image); $image = new Imagick(realpath('image.png')); //OR //$image = new Imagick('/path/to/image.png'); //フルパス header('Content-type: image/png'); echo $image;
maru1244

2017/12/29 20:07

回答ありがとうございます。 今使っているレンタルサーバーは、phpがセーフモードでver5.2なのですが、 もしかしてそれが原因という事も考えられるのでしょうか? ちなみに今使っているレンタルサーバーはステップサーバーというところです。
maru1244

2017/12/31 16:42

年末年始回答に付き合ってくださりありがとうございました。 レンタルサーバーをロリポップにしたら、 質問の書き込みのコードが動きました。 月額料金も一緒だし、サーバーの容量もとても増えたし、 PHPのバージョンも7.1(CGI版)だし言うことなしです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問