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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

Q&A

1回答

753閲覧

phpで設定した角丸処理が動かない

youplus40

総合スコア19

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

0グッド

0クリップ

投稿2020/11/13 03:06

前提・実現したいこと

あるサイトをphp5.1からphp7.3に移行して、ローカル環境 (linux:cent os)で動作確認を行っております。
画像の角を丸くするphpから画像を表示する機能が動かず、画像が表示されない状態です。エラーメッセージはないです。
vs codeのphp intelephenseで配列の確認を行いましたが、問題なさそうです。
なぜ、表示されなくなったのか原因がわからない状態です。

該当のソースコード

PHP

1//round.php 2<?php 3// 定数定義 4define('DEFAULT_RADIUS', 10); 5define('DEFAULT_BGCOLOR', 'FFFFFF'); 6define('DEFAULT_TRANSPARENT', true); 7define('DEFAULT_BORDER_WIDTH', 0); 8define('DEFAULT_BORDER_COLOR', '000001'); 9define('CLIP_ORIGIN_TOP_LEFT', 'TL'); 10define('CLIP_ORIGIN_TOP', 'T'); 11define('CLIP_ORIGIN_TOP_RIGHT', 'TR'); 12define('CLIP_ORIGIN_LEFT', 'L'); 13define('CLIP_ORIGIN_CENTER', 'C'); 14define('CLIP_ORIGIN_RIGHT', 'R'); 15define('CLIP_ORIGIN_BOTTOM_LEFT', 'BL'); 16define('CLIP_ORIGIN_BOTTOM', 'B'); 17define('CLIP_ORIGIN_BOTTOM_RIGHT', 'BR'); 18define('DOT_OVERLAY_PATH', './dot_overlay.gif'); 19 20// 処理 21if (isset($_GET['i'])) { 22 $params = getParams(); 23 24 try { 25 $img = new Imagick(); 26 $img->readImage($params['file']); 27 $width = isset($_GET['w']) ? (int)$_GET['w'] : $img->getImageWidth(); 28 $height = isset($_GET['h']) ? (int)$_GET['h'] : $img->getImageHeight(); 29 preg_match('/JPE?G|GIF|PNG/i', $params['format']) 30 ? $img->setImageFormat($params['format']) 31 : $params['format'] = $img->getImageFormat(); 32 33 if ($width !== $img->getImageWidth() 34 || $height !== $img->getImageHeight()) { 35 $img->scaleImage($width, $height, $params['isFit']); 36 if ($params['isFit']) { 37 $width = $img->getImageWidth(); 38 $height = $img->getImageHeight(); 39 } 40 } 41 // 画像の切り抜き 42 if ($params['clip'] && 4 <= count($params['clip'])) { 43 cropImage($img, $params['clip'], $params['origin']); 44 } 45 // on 画像の作成 46 if (isset($_GET['_on_'])) { 47 coverImage($img); 48 } 49 // 角丸処理 50 roundCornersImage( 51 $img, 52 $params['radius'], 53 $params['borderWidth'], 54 $params['borderColor'] 55 ); 56 if (!$params['transparent'] 57 || ($params['format'] !== 'GIF' && $params['format'] !== 'PNG') 58 ) { 59 setBackgroundColor($img, $params['bgcolor']); 60 } 61 if ($params['quality'] !== -1) { 62 $quality = 100 < $params['quality'] ? 100 : $params['quality']; 63 $img->setCompressionQuality($quality); 64 } 65 header('Content-type: image/' . $params['format']); 66 print $img; 67 68 $img->destroy(); 69 } catch (ImagickException $e) { 70 } 71} 72 73// 関数定義 74function encodeFileName($matches) 75{ 76 if (isset($matches[1]) && isset($matches[2])) { 77 if (preg_match('/^https?:///', $matches[1])) { 78 $path = explode('/', $matches[2]); 79 $length = count($path); 80 for ($i = 0; $i < $length; $i++) { 81 $path[$i] = rawurlencode($path[$i]); 82 } 83 return $matches[1] . implode('/', $path); 84 } elseif (preg_match('/^//', $matches[1])) { 85 $matches[1] = $_SERVER['DOCUMENT_ROOT'] . '/'; 86 return $matches[1] . $matches[2]; 87 } 88 } 89 return $matches[0]; 90} 91 92/** 93 * GET で送信されてきた各値を取得 94 */ 95function getParams() 96{ 97 $i = ''; 98 if (isset($_GET['i'])) { 99 $pattern = '/(https?://.*?/|.?/)(.*?)$/'; 100 $i = preg_replace_callback($pattern, 'encodeFileName', $_GET['i']); 101 } 102 return array( 103 'file' => $i, 104 'radius' => isset($_GET['r']) ? $_GET['r'] : DEFAULT_RADIUS, 105 'isFit' => isset($_GET['f']) ? $_GET['f'] == 1 : false, 106 'bgcolor' => isset($_GET['b']) ? $_GET['b'] : DEFAULT_BGCOLOR, 107 'clip' => isset($_GET['c']) ? explode(',', $_GET['c']) : array(), 108 'origin' => checkOriginValue(isset($_GET['o']) ? $_GET['o'] : ''), 109 'format' => isset($_GET['k']) ? strtoupper($_GET['k']) : '', 110 'quality' => isset($_GET['q']) ? (int)$_GET['q'] : -1, 111 'borderWidth' => isset($_GET['bw']) ? (int)$_GET['bw'] : DEFAULT_BORDER_WIDTH, 112 'borderColor' => isset($_GET['bc']) ? $_GET['bc'] : DEFAULT_BORDER_COLOR, 113 'transparent' => isset($_GET['t']) ? $_GET['t'] == 1 : DEFAULT_TRANSPARENT 114 ); 115} 116 117/** 118 * 始点を示す値が正しいか調査 119 */ 120function checkOriginValue($origin) 121{ 122 $origin = strtoupper($origin); 123 switch ($origin) { 124 case CLIP_ORIGIN_TOP_LEFT: 125 case CLIP_ORIGIN_TOP: 126 case CLIP_ORIGIN_TOP_RIGHT: 127 case CLIP_ORIGIN_LEFT: 128 case CLIP_ORIGIN_CENTER: 129 case CLIP_ORIGIN_RIGHT: 130 case CLIP_ORIGIN_BOTTOM_LEFT: 131 case CLIP_ORIGIN_BOTTOM: 132 case CLIP_ORIGIN_BOTTOM_RIGHT: 133 break; 134 135 default: 136 $origin = CLIP_ORIGIN_TOP_LEFT; 137 } 138 return $origin; 139} 140 141/** 142 * 始点から矩形の X, Yの値を変更。 143 * @param array $rect X, Yの値を含めた配列 144 * @param string $origin 始点 145 * @param int $width 画像幅 146 * @param int $height 画像高 147 * @return array 変更後の矩形 148 */ 149function changeRectFromOrigin($rect, $origin, $width, $height) 150{ 151 if (4 <= count($rect)) { 152 $origin = checkOriginValue($origin); 153 if ($origin === CLIP_ORIGIN_BOTTOM 154 || $origin === CLIP_ORIGIN_BOTTOM_LEFT 155 || $origin === CLIP_ORIGIN_BOTTOM_RIGHT) { 156 $rect[1] = $height - (int)$rect[1] - (int)$rect[3]; 157 } 158 if ($origin === CLIP_ORIGIN_RIGHT 159 || $origin === CLIP_ORIGIN_TOP_RIGHT 160 || $origin === CLIP_ORIGIN_BOTTOM_RIGHT) { 161 $rect[0] = $width - (int)$rect[0] - (int)$rect[2]; 162 } 163 if ($origin === CLIP_ORIGIN_CENTER 164 || $origin === CLIP_ORIGIN_LEFT 165 || $origin === CLIP_ORIGIN_RIGHT) { 166 $rect[1] += ($height - (int)$rect[3]) / 2; 167 } 168 169 if ($origin === CLIP_ORIGIN_CENTER) { 170 $rect[0] += ($width - (int)$rect[2]) / 2; 171 } 172 } 173 return $rect; 174} 175 176/** 177 * 画像の切り抜き 178 * @param Imagick $img 対象となる imagick インスタンス 179 * @param array $rect X, Yを格納した配列 180 * @param int $origin 始点 181 * @return void 182 */ 183function cropImage(&$img, $rect, $origin) 184{ 185 $rect = changeRectFromOrigin( 186 $rect, 187 $origin, 188 $img->getImageWidth(), 189 $img->getImageHeight() 190 ); 191 $img->cropImage( 192 (int)$rect[2], 193 (int)$rect[3], 194 (int)$rect[0], 195 (int)$rect[1] 196 ); 197} 198 199/** 200 * 画像を角丸に 201 * @param Imagick $img 対象となる Imagick インスタンス 202 * @param int $radius 角の半径 203 * @param int $borderWidth ボーダー幅 204 * @param int $borderColor ボーダー色 205 */ 206function roundCornersImage( 207 &$img, 208 $radius = DEFAULT_RADIUS, 209 $borderWidth = DEFAULT_BORDER_WIDTH, 210 $borderColor = DEFAULT_BORDER_COLOR 211) { 212 $width = $img->getImageWidth(); 213 $height = $img->getImageHeight(); 214 $radius = (int)$radius; 215 $draw = new ImagickDraw(); 216 $draw->setFillColor(new ImagickPixel('#FFFFFF')); 217 $draw->setStrokeWidth(0); 218 $draw->roundRectangle(0, 0, $width - 1, $height - 1, $radius, $radius); 219 220 $mask = new Imagick(); 221 $mask->newImage($width, $height, 'none'); 222 $mask->drawImage($draw); 223 $mask->setImageFormat($img->getImageFormat()); 224 $mask->compositeImage( 225 $img, 226 Imagick::COMPOSITE_IN, 227 0, 228 0, 229 Imagick::CHANNEL_ALL 230 ); 231 $img = $mask; 232 if (0 < $borderWidth) { 233 $borderColor = preg_match('/([0-9a-f]{2}){3}/i', $borderColor) 234 ? '#' . $borderColor : new ImagickPixel($borderColor); 235 $pos = (int)($borderWidth / 2); 236 $even = (int)($borderWidth % 2 === 0); 237 $borderRadius = $radius - $borderWidth / 2; 238 239 $draw = new ImagickDraw(); 240 $draw->setStrokeAntialias(true); 241 $draw->setFillColor(new ImagickPixel('#FFFFFF')); 242 $draw->setFillOpacity(0); 243 $draw->setStrokeColor($borderColor); 244 $draw->setStrokeWidth($borderWidth); 245 $draw->roundRectangle( 246 $pos, 247 $pos, 248 $width - $borderWidth + $pos - $even, 249 $height - $borderWidth + $pos - $even, 250 $borderRadius, 251 $borderRadius 252 ); 253 $img->drawImage($draw); 254 } 255 $draw->clear(); 256 $draw->destroy(); 257} 258 259/** 260 * マウスホバー時の画像用に加工 261 * @param Imagick $img 対象となる Imagick インスタンス 262 */ 263function coverImage(&$img) 264{ 265 $cover = new Imagick(); 266 $cover->readImage(DOT_OVERLAY_PATH); 267 $width = $img->getImageWidth(); 268 $height = $img->getImageHeight(); 269 270 $w = $cover->getImageWidth(); 271 $h = $cover->getImageHeight(); 272 for ($x = 0; $x < $width; $x += $w) { 273 for ($y = 0; $y < $height; $y += $h) { 274 $img->compositeImage( 275 $cover, 276 Imagick::COMPOSITE_DEFAULT, 277 $x, $y, 278 Imagick::CHANNEL_ALL 279 ); 280 } 281 } 282} 283 284/** 285 * 角丸処理を行った後の背景色を設定 286 * @param Imagick $img 対象となる Imagick インスタンス 287 * @param string $color 色を示す文字列 288 */ 289function setBackgroundColor(&$img, $color) 290{ 291 $bg = new Imagick(); 292 $bgcolor = preg_match('/([0-9a-f]{2}){3}/i', $color) 293 ? '#' . $color : new ImagickPixel($color); 294 $bg->newImage($img->getImageWidth(), $img->getImageHeight(), $bgcolor); 295 $bg->setImageFormat($img->getImageFormat()); 296 $bg->compositeImage( 297 $img, 298 Imagick::COMPOSITE_DEFAULT, 299 0, 300 0, 301 Imagick::CHANNEL_ALL 302 ); 303 $img = $bg; 304} 305
//画像を表示するhtml <p class="img"><a href="/women/xxx/"><img src="/round.php?i=/women/img/xxx/brandList_img.jpg&w=176&h=240&r=10&k=PNG&_off." alt="Rouge vif la cle" /></a></p>

試したこと

ini_set('display_errors')などをround.phpに記載しましたが、エラーは表示はされませんでした。

補足情報(FW/ツールのバージョンなど)

PHP 7.3
CentOS 8.2

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

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

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

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

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

guest

回答1

0

可能性の一つとしてはimagickが不調?

catch (ImagickException $e

で例外処理ひろってきているので
die($e->getMessage());
とかしてみてはどうでしょう?

投稿2020/11/13 03:20

yambejp

総合スコア114833

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

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

yambejp

2020/11/13 04:36

角丸するだけならsvgなどに処理を投げてしまう手もあります
youplus40

2020/11/13 04:50

回答ありがとうございます。 しかしながら、エラーは表示されません。 そうなんですが、round.phpで背景とかホバー時の加工とかいろいろやっているので、 できる限りこのphpは介したいんですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問