tedd0203
@tedd0203

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Laravelでgdライブラリを用いたコードが文字化けしてしまう

Q&A

Closed

解決したいこと

phpのLaravelでサイトを作成しています。
座標から図形を作成する段階でエラー?文字化けが起きていて
自分の調べ方が悪いのか、解消できずにいます。

解決方法を教えて下さい。

発生している問題・エラー

エラーはでておりませんが
ブラウザではこのような状況です。

SS 2023-10-20 20.10.06.jpg

環境

ローカル環境 Laravel v10.28.0 (PHP v8.2.11)

該当するソースコード

<?php
//線分の長さ
$r = 80;

//角度
$angle = 45;

//キャンバスサイズ
$width   = 200;
$height  = 200;

//キャンバスの中心を原点とする
$origin = array( round($width / 2), round($height / 2) );

$image = imagecreatetruecolor($width, $height);

//線の色
$color = imagecolorallocate( $image, 255, 255, 255 );

list($x, $y) = point_rotate($r, $angle);
imageline($image, $origin[0], $origin[1], $origin[0] + $x, $origin[1] + $y, $color);

header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);

function point_rotate($r, $angle){
    $angle = deg2rad($angle);
    $x = round($r * cos($angle));
    $y = round($r * sin($angle));
    return array($x, $y);
}

解決しました 2023/10/21

出力方法を変えたら解決に至りました。
GDライブラリの学習をしてから使うべきだという教訓になりました...

header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);

上記の部分を、下記に変更したところ問題なく出力されました!

header('Content-Type: image/jpeg');
imagejpeg($image,"horo.jpg");
echo '<img src="horo.jpg" alt="Image">';

自分で試したこと

・gdライブラリは有効であることを確認しました。
・素のphpファイルでは文字化けは確認されませんでした。

追記 2023/10/21

ブラウザのレスポンスヘッダーは
Content-Type:text/html; charset=UTF-8を返しておりました。

しかし少し調べましたが解決には至っておりません。

SS 2023-10-21 12.26.01.jpg

0

4Answer

文字化けしたHTMLでは、何の文字コードを指定していますか?

ブラウザ側で、表示文字コード(エンコード)を変更する機能があるはずなので、EUC、UTF-8、Shift-JIS、ISO-JP 等に変更してみて、正しく表示される文字コードを特定して、HTMLのmetaタグのcharsetかcontext属性で、その文字コードを指定するのはどうでしょうか?

1Like

Comments

  1. @tedd0203

    Questioner

    回答ありがとうございます。
    文字コードの指定はutf-8で意図通りでした。

    chromeでエンコード方法を変更しましたがどれも文字化けでした。
    学び始めて間もないため何がどうなっているのかわからない状態です(^_^;)
    画像の出力方法に問題があるのかもしれません。

Laravelが「Content-type: text/html」とかを吐いていたりしませんか。
ウェブブラウザのデバッグツールでどういうレスポンスヘッダーが返されたのか確認すればよいと思います。

1Like

回答ありがとうございます。

おっしゃるとおり、レスポンスヘッダーのコンテンツタイプが
Content-Type:text/html; charset=UTF-8
を示しておりました。

少し調べましたが解決には至りませんでした。
このあたりのエラーは何を学べば理解できるでしょうか?

0Like

Comments

  1. エラーではないと思います。JPEGを生で見るとご提示のような出力になります。

    私はLaravel使いでないので詳しいことはわかりませんが、こちらのページが関係あるかもしれません。
    HTTPレスポンス

    何を学べば・・・

    経験を重ねた(場数を踏んだ)としか言えないのですが、ウェブで扱うバイナリファイル(例えば画像とか)を生で見たらどういう表示になるかを知っておき、そのような表示になるときは正しいレスポンスヘッダーが出力されているかを調べるのが一番最初の手続きではないかと私は思います。

  2. @tedd0203

    Questioner

    解決しました。
    画像の出力方法が間違っていたみたいです。

    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);
    

    上記の部分を、以下に変更したところ...

    header('Content-Type: image/jpeg');
    imagejpeg($image,"horo.jpg");
    echo '<img src="horo.jpg" alt="Image">';
    

    無事表示することができました!

    SS 2023-10-21 13.39.01.jpg

    みなさま気付きをありがとうございました!

「Laravelで」とありますが、該当するソースコードにLaravelの要素が見えないので、問題の推測が難しいところがあります。
誤記でないのであれば、省略せずに記載するのが良いと思います。

ひとまずLaravelのコントローラーなどで実行していると仮定して回答します。
Laravelにはレスポンスについての決まりがあるので、独自にheader('Content-Type: image/jpeg')としても意図しない挙動になる可能性があります。

「Fileレスポンス」の項を参照していただければ、ブラウザへ画像やPDFのようなファイルを表示するため方法が記載されています。
生成した画像をいったん保存することになりますが、こちらを試してみてはいかがでしょうか?

0Like

Comments

  1. @tedd0203

    Questioner

    回答ありがとうございます。

    「Laravelで」とありますが、該当するソースコードにLaravelの要素が見えないので、問題の推測が難しいところがあります。
    誤記でないのであれば、省略せずに記載するのが良いと思います。

    おっしゃるとおりですね、以後気をつけます。

    ご指摘の方法でも画像が表示されることを確認しました。
    出力方法に問題があったようです。
    ありがとうございます!

Your answer might help someone💌