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

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

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

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

ImageMagick

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

Q&A

解決済

2回答

3122閲覧

PHPで、ImageMagickを使って、ビットマップ画像をJPEG形式のサムネイルに変換したい

tfulcrum

総合スコア43

PHP

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

ImageMagick

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

0グッド

1クリップ

投稿2016/04/06 07:48

編集2016/04/06 12:19

###前提・実現したいこと
下記のコードで、ビットマップ画像を読みこんで、JPEGのサムネイルを出力したいと思います。
縦/横の大きさ(表示面積)を小さくしたいのです。

###発生している問題・エラーメッセージ
下記コードでは、大きさがそのままになってしまいます。
何が問題でしょうか?
エラーなどは発生していません。
ビットマップが無事JPEGに変換されて表示されます。
問題は、画像の大きさが変わっていない事です。

###該当のソースコード

PHP

1$width = 120; 2list($imagick_w, $imagick_h) = getimagesize($work_img); 3$proportion = $imagick_w / $imagick_h; 4$height = $width / $proportion; 5if($proportion < 1){ 6 $height = $width; 7 $width = $width * $proportion; 8} 9$imagick = new Imagick($work_img); 10$imagick->resizeImage($width, $height, Imagick::FILTER_POINT, 0); 11$imagick->writeImage('temp.jpg'); 12if('temp.jpg' !== FALSE){ 13 print "<img src=\"temp.jpg\">\n"; 14} 15$imagick->clear(); 16$imagick->destroy();

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

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

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

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

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

shi_ue

2016/04/06 08:14

マークダウンが惜しい!```PHP と ``` です。そうするときれいに見えます。
guest

回答2

0

最初にコードが足りなかったところも記載します。

PHP

1$work_dir = "work/"; 2$work_img= dirname(__FILE__)."/".$work_dir."temp.bmp" 3$temp_img= dirname(__FILE__)."/".$work_dir."temp.jpg"; 4$width = 300; 5list($imagick_w, $imagick_h) = getimagesize($work_img); 6$proportion = $imagick_w / $imagick_h; 7$height = $width / $proportion; 8if($proportion < 1){ 9 $height = $width; 10 $width = $width * $proportion; 11} 12$imagick = new Imagick(); 13$imagick->readImage($work_img); 14$imagick->setImageFormat('jpeg'); 15//$imagick->stripImage(); 16$imagick->resizeImage($width, $height, Imagick::FILTER_POINT, 0); 17$imagick->writeImage($temp_img); 18if($temp_img !== FALSE){ 19 print "<td><img src=\"work/temp.jpg\"></td>\n"; 20} 21$imagick->clear(); 22$imagick->destroy();

明示的に追記したのは下記です。
$temp_img= dirname(FILE)."/".$work_dir2."temp.jpg";

どうもWindowsの場合、
$imagick->writeImage('temp_img');
では(パーミッションの問題か)稼働せず、
$imagick->writeImage(ファイルのフルパス);
とする必要がある模様です。
ややこしいのは、
$imagick->writeImage(ファイルのフルパス);
<img src="work/temp.jpg">
でパスの表記が同じにはならない事、です。
Eclipse / ブラウザでWindowsローカル / リモートでLinux
を同じコードにしようと思うと、それなりに考える事があります。

投稿2016/04/11 10:12

編集2016/04/11 10:15
tfulcrum

総合スコア43

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

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

0

ベストアンサー

$widthか$heightがfloat(小数)になっていませんか?
整数値を渡さないと無言で処理がスキップされるみたいなので、もし

php

1$imagick->resizeImage((int)$width, (int)$height, Imagick::FILTER_POINT, 0);

として正常に機能するなら、そこが原因だと思います。

imagick_class.c

投稿2016/04/06 12:55

nnssn

総合スコア1221

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

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

tfulcrum

2016/04/07 01:24 編集

頂きました情報はじっくり調べるとしまして、取り急ぎintにしてみましたが、 状況は変わりませんでした。他にもintを追加しましたが、変わりません。 ```PHP $width = 120; list($imagick_w, $imagick_h) = getimagesize($work_img); $proportion = (int)$imagick_w / (int)$imagick_h; $height = (int)$width / (int)$proportion; if($proportion < 1){ $height = (int)$width; $width = (int)$width * $proportion; } $imagick = new Imagick($work_img); $imagick->resizeImage((int)$width, $height, (int)Imagick::FILTER_POINT, 0); $imagick->writeImage('temp.jpg'); if('temp.jpg' !== FALSE){ print "<img src=\"temp.jpg\">\n"; } $imagick->clear(); $imagick->destroy(); ```
nnssn

2016/04/07 05:19

引数の型を修飾子で指定している箇所を見て整数、実数で区別されていると 勘違いしてました。すみません、実際は実数でも問題ないようです。 確認のためImagickを使える環境に質問文のコードを設置し bmp画像の変換を行いましたが正常に動作しました。 resizeImage、writeImageの結果を確認したところ共にtrueでした。 $resize = $imagick->resizeImage($width, $height, Imagick::FILTER_POINT, 0); $write = $imagick->writeImage('temp.jpg'); var_dump($resize, $write); 実行環境は以下のとおりです。 imagick 3.2.0RC1 php5.6.18 CentOS 6.5
tfulcrum

2016/04/07 06:35 編集

まさかと思って試した所、 CentOS6.7 / PHP 5.3.3 / imagick 3.2.0b2で正常稼働しました。 Windows7 / PHP 5.4 / imagick3.2.0b2、こちらはFireFox / IE / Chromeでテスト の時は、成功したりしなかったり、 Eclipseで実行した時のみは100%失敗という謎の状態です。
tfulcrum

2016/04/09 21:42

引き続き、Windows上の問題調査中です、進展はありません。 ImageMagick / imagickのインストール失敗も考えてはいますが、ビットマップ->JPEGの変換は出来ている為、他の要因かと思われます。
nnssn

2016/04/10 05:22

ブラウザ、Eclipseそれぞれで ・resizeImageの戻り値 ・writeImageの戻り値 ・使用している画像は同じか このあたりは整理しておいたほうが良いと思います。 何かのとっかかりになるかもしれないので。
tfulcrum

2016/04/11 08:10 編集

var_dump($width, $height) var_dump($width, $height) var_dump('temp.jpg') var_dump($resize, $write)について、Windows / Linuxがそれぞれ下記になっており int 300 float 200.32751091703 int 300 float 200.32751091703 string 'temp.jpg' (length=8) boolean true boolean true int(300) float(199.78448275862) int(300) float(199.78448275862) string(8) "temp.jpg" bool(true) bool(true) それなりに表記方法が異なるのが少々気にはなっていますが、意味としては同じでしょうから、原因特定が難しいところです。
tfulcrum

2016/04/11 10:03

少々意味合いが異なりますが、 ・int、floatで動作が異なりうる事を思い出させて頂いた事 ・コードを提示して頂いた事 は調査上、大いに助かりましたので、 BAとさせて頂きたく思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問