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

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

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

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

Q&A

解決済

1回答

1084閲覧

phpで画像のExif情報(回転方向)を修正

k_m_pg

総合スコア6

PHP

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

0グッド

0クリップ

投稿2020/02/01 14:16

編集2020/02/01 14:28

表題の件に関してですが、

iPhoneのカメラで撮った画像が反転してしまうのを修正するために調べると
phpのexif_read_dataでexif情報を読み込み、修正できるとあったので
やってみているのですが、なかなかうまくできず質問させて頂きます。

phpマニュアルでexif_read_dataを調べ、コードを書いてみました。

ただし、下記のコードで最終的に$imageに回転が修正された
画像データが入っているとあるのですが、
$imageはimagecreatefromstringで作成された
画像の Resource id なので、それをその後、どう利用すればいいのかがわかりません。。。

$photo = "../../images/".$photo['name']; $image = imagecreatefromstring(file_get_contents($photo)); $exif = exif_read_data($photo); if(!empty($exif['Orientation'])) { switch($exif['Orientation']) { case 8: $image = imagerotate($image,90,0); break; case 3: $image = imagerotate($image,180,0); break; case 6: $image = imagerotate($image,-90,0); break; } }

フレームワークやライブラリなどは何も使用しておらず、使用せずにできればと考えております。

初歩的な質問で恐縮ですが、、、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

手軽さでいえば ImageMagic & Imagick なんですが、なにせ脆弱性報告が多いので……

imagecreatefromstring が返すのは、イメージのID ではありません。イメージリソースという(イメージ自体を表すための)構造体のようなものです。

で、imagerotate が受け取るのもこのイメージリソースなので、書かれたとおりで動く筈なんですが……

なお、Exif の Orientation の値は次の通りになるので、単純な回転だけでは無理なパターンがあります。

意味正位置への変換方法
0値なし不明
1正位置不要
2水平方向に反転(左右が逆)imageflip()で左右を反転させる
3180度回転imagerotate()で180度回転させる
4垂直方向に反転(上下が逆)imageflip()で上下を反転させる
5左右逆+反時計回り90度回転左右反転+90度回転
6反時計回り90度回転90度回転
7左右逆+時計回り90度回転左右反転+270度(-90度)回転
8時計回り90度回転270度(-90度)回転

投稿2020/02/01 15:18

tacsheaven

総合スコア13703

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

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

k_m_pg

2020/02/01 15:27

すいません。私が言葉足らずでした。。。 imagerotateも正常に動いているようなんですが、コードの2行目の$imageをechoすると「Resource id #8」となっていて、 最後にもう一度$imageをechoすると「Resource id #10」と表示されますが、 この「Resource id #10」と表示される$imageをどうブラウザ上に画像として表示させたり、DBに保存するのかがわからなかったのです。 画像の表示はhtmlのimgタグのsrc="../../images/".$photo['name'];"で表示させる方法しかわからなかったので。。。
k_m_pg

2020/02/01 15:47

ご返答ありがとうございます! header('Content-Type: image/jpeg'); imagepng($image); imagedestroy($image); こちらも試してはみたのですが、header('Content-Type: image/jpeg');を書いた時点で画面が真っ黒になり、真ん中に小さく白線の四角形が表示されてしまいます。。。
takepan1973

2020/02/01 16:19

「書いた時点で」というのは何ですか? リアルタイム系の開発環境(Brackets)とかを使っていますか? ヘッダーだけ吐いて次のバイナリデータ送出を実行しない中途半端な状態で検証(?)をする意味はなんですか?
k_m_pg

2020/02/01 16:24

すいません。言葉の選び方が悪かったです。。。 header('Content-Type: image/jpeg'); imagepng($image); imagedestroy($image); こちらを書いてページをリロードした時に上記の状態になったので下からコメントアウトしながらリロードしていくとheader('Content-Type: image/jpeg');が書かれた時点でリロードしたら真っ黒になったという意味です。
takepan1973

2020/02/01 16:54 編集

ヘッダだけのときは真っ黒で、3行のときは真っ黒の真ん中に白い四角形が表示された、ということなんでしょうかね?よく分かりませんが…… 質問に書かれているのがプログラム全部なのか、CSSで何か記述しているのか、ブラウザのデフォルト背景が白なのか黒なのか、等よく分からないので何とも言えませんが、私が手元の環境で実行してみたところ、何の問題もなく画像が(回転した状態で)表示されました。 そんな訳で、画像が壊れているとか、回転させようとした段階で画像が壊れるとか、Exif情報が不完全なデータであるとか、色々考えられると思いますので、まぁ色々考えながら、画像とか変えたりしながら、デバッグコードとか仕込みながら、試行錯誤してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問