お世話になっております。
以下のコードで画像のリサイズを行っていますが、うまくいきません。
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 ====
ちなみにサイズが小さい場合はそのままのサイズで格納されています。
どこに間違いがあるのかわからず行き詰ってしまいました。
正しくリサイズする方法をご教授いただければと思います。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。