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

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

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

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

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

Q&A

解決済

1回答

1313閲覧

画像のリサイズについて

ao_love

総合スコア441

PHP

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

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

0グッド

0クリップ

投稿2016/10/17 10:01

お世話になっております。
以下のコードで画像のリサイズを行っていますが、うまくいきません。

php

1$data = @getimagesize($_FILES['upfile']['tmp_name']); 2 3// 画像処理に使う関数名を決定する 4$create = str_replace('/', 'createfrom', $data['mime']); 5$output = str_replace('/', '', $data['mime']); 6 7// 画像の縦横を取得 8$w = $data[0]; 9$h = $data[1]; 10 11// 保存する画像のサイズ 12$dst_w = 600; 13$dst_h = 900; 14 15if ( $w <= $dst_w && $h <= $dst_h){ 16 $sttX = 0; 17 $sttY = 0; 18 $dst_w = $w; 19 $dst_h = $h; 20} else { 21 // 横が$dst_wより大きければ中心点から始点を計算 22 if ($w > $dst_w) { 23 $centerW = $w/2; 24 $sttX = $centerW - $dst_w/2; 25 } else { 26 $sttX = 0; 27 $dst_w = $w; 28 } 29 // 縦が$dst_hより大きければ中心点から始点を計算 30 if ($h > $dst_h) { 31 $centerH = $h/2; 32 $sttY = $centerH - $dst_h/2; 33 } else { 34 $sttY = 0; 35 $dst_h = $h; 36 } 37} 38 39// 元画像リソースを生成する 40if (!$src = @$create($_FILES['upfile']['tmp_name'])) { 41 throw new RuntimeException("画像リソースの生成に失敗しました"); 42} 43 44// リサンプリング先画像リソースを生成する 45$dst = imagecreatetruecolor($dst_w, $dst_h); 46 47// getimagesize関数で得られた情報も利用してリサンプリングを行う 48imagecopyresampled($dst, $src, 0, 0, $sttX, $sttY, $dst_w, $dst_h, $w, $h);

具体的な不具合としては、800×600の画像をリサイズした場合、imagecreatetruecolorの部分は成功しているようで、600×600の黒い背景の中に微妙なサイズの元画像があり、黒い余白ができてしまっています。しかもその余白の分横サイズが圧縮されてしまっている状態です。
始点や幅の値の取り方がおかしいのかと思い、書き出してみたコードと結果がこちらです。

php

1$file = "photo.txt"; 2 3$txt = "====\n"; 4$txt.= $photo."\n"; 5$txt.= "コピー先始点X(sttX):".$sttX."\n"; 6$txt.= "コピー先始点Y(sttY):".$sttY."\n"; 7$txt.= "コピー先幅(dst_w):".$dst_w."\n"; 8$txt.= "コピー先高さ(dst_h):".$dst_h."\n"; 9$txt.= "コピー元幅(w):".$w."\n"; 10$txt.= "コピー元高さ(h):".$h."\n"; 11$txt.= "====\n\n"; 12 13file_put_contents($file, $txt);

結果

==== photo.jpeg コピー先始点X(sttX):100 コピー先始点Y(sttY):0 コピー先幅(dst_w):600 コピー先高さ(dst_h):600 コピー元幅(w):800 コピー元高さ(h):600 ====

ちなみにサイズが小さい場合はそのままのサイズで格納されています。

どこに間違いがあるのかわからず行き詰ってしまいました。
正しくリサイズする方法をご教授いただければと思います。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました…。

php

1// getimagesize関数で得られた情報も利用してリサンプリングを行う 2imagecopyresampled($dst, $src, 0, 0, $sttX, $sttY, $dst_w, $dst_h, $w, $h);

上記の部分を

php

1// getimagesize関数で得られた情報も利用してリサンプリングを行う 2imagecopyresampled($dst, $src, 0, 0, $sttX, $sttY, $dst_w, $dst_h, $dst_w, $dst_h);

とすることで期待通りの動きになりました。

投稿2016/10/17 10:18

ao_love

総合スコア441

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問