メモ > 技術 > プログラミング言語: PHP > 画像
画像
スマホから写真を撮影したものを保存すると、画像が回転した状態で表示されることがある。
Exif回転情報を読み取り、それに従って画像を回転させる必要がある。
PHPで写真のExif回転に対応する
https://blog.ver001.com/php_exif_orientation/
ブラウザによる画像向き補正確認用ページ
https://blog.knjcode.com/browser-image-rotation-test/
UIImageOrientation / EXIF orientation sample images - Matt Galloway
https://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images/
GDまたはImagick拡張でexif情報を削除する - Qiita
https://qiita.com/mgng/items/416eaacf01e424cdca29
iPhoneで縦向き撮った画像が横向きに回転しちゃうよーん! - Qiita
https://qiita.com/HorikawaTokiya/items/7d469ec5b6660a7e4c96
iPhoneで撮影したHEIC型式の画像ファイルのExif情報をExifToolで取得する - ふぁメモ
https://fa.hatenadiary.jp/entry/20200502/1588373190
■画像の回転(回転情報を読み取る)
<?php
$file_path = 'path/to/image.jpg';
$exif_data = exif_read_data($file_path);
if (isset($exif_data['Orientation'])) {
$flip = '';
$rotate = '';
switch($exif_data['Orientation']) {
case 1:
$flip = '反転していない';
$rotate = '回転していない';
return;
case 8:
$flip = '反転していない';
$rotate = '右に90度回転している';
break;
case 3:
$flip = '反転していない';
$rotate = '180度回転している';
break;
case 6:
$flip = '反転していない';
$rotate = '右に270度回転している';
break;
case 2:
$flip = '反転している';
$rotate = '回転していない';
break;
case 7:
$flip = '反転している';
$rotate = '右に90度回転している';
break;
case 4:
$flip = '反転している';
$rotate = '180度回転している';
break;
case 5:
$flip = '反転している';
$rotate = '右に270度回転している';
break;
}
echo '画像 ' . $file_path . ' は[' . $flip . '][' . $rotate . ']画像です。';
} else {
echo '画像 ' . $file_path . ' はOrientationの無い画像です。';
}
echo 'Exif情報は以下のとおりです。';
print('<pre>');
print_r($exif_data);
print('</pre>');
exit;
■画像の回転(回転&反転させる)
GDのimageflip関数やimagerotate関数で回転させ、それをimagejpegで保存する…のような方法で対応できる。
ただしHEIC形式には有効な手段では無いと思われる。詳細は後述の「HEICの対応」を参照。
PHPで写真のExif回転に対応する
https://blog.ver001.com/php_exif_orientation/
■画像の回転(HEICの対応)
※若干釈然としないまま。
最近のiOSでは「HEIF」という画像形式が採用されている。(拡張子は「.heic」となっている。)
これは「High Efficiency Image File Format」の略で、高効率のフォーマット画像となっている。
HEIFとJPEGどっちを選ぶ?空き容量対策にもなるiPhoneカメラの保存形式を比較してみた | あいこうらのさくっとふぉとらいふ
https://photolog.aiko15.com/10141/
このファイルの場合、アップロードすると「Exifを削除したうえでJpeg形式に変換する」とされてしまうらしい。
iPhoneの高効率フォーマット(HEIC)だとinput[type=file]でExifが読み取れない - Qiita
https://qiita.com/dameyellow/items/1ed487216f563c871cb5
以下のページによると
・iOSがExifを削除するのは意図された挙動。
・ユーザのプライバシーを保護するため、Exifを削除している。
・この挙動は、現状どうすることもできない。
らしい。
アップロードした後に、ユーザ自身で画像を回転させたりできるUIを用意する…くらいしか無いか。
php - Image upload from iPhone strips exif data - Stack Overflow
https://stackoverflow.com/questions/16297730/image-upload-from-iphone-strips-exif-data
…と思ったが、2023年3月時点でiPhone12mini実機で試すと、普通にExifでOrientationを参照できた。
「保存処理を書かずに $_FILES['upfile']['tmp_name'] の画像を直接参照すると駄目なのでは」という意見もあったが、それでも参照できた。
プライバシーの都合でExifを削除するようにしたが、不満が多かったのでその後のiOSアップデートで削除しないようにした。
…のかもしれないが、詳細は不明。