質問 > フロント機能 > GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
468 |
投稿日時: 2017/10/25 12:36
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 画像をアップロードした直後は、
SC_UploadFile.phpのfunction makeTempFile()で 一時フォルダに画像が保存されます。 商品情報を確認→登録のタイミングで、 SC_UploadFile.phpのfunction moveTempFile()で 一時フォルダ→保存フォルダにコピーされます。 今回の場合、一時フォルダに画像が保存されるタイミングで 画像回転を行う必要があるかと思います。 画像保存の処理を細かく追っていくと、 makeTempFile()内で$this->makeThumb()が呼ばれていて、その中でさらにgdthumb->Main()を呼び出してファイルの保存を実行していると思います。 ※/data/module/gdthumb.phpの中を確認すると画像を保存する処理が書かれていると思います。 (2.11系でもgdthumbが利用されていますので2.12系でも同じかと思います) gdthumb->Main()を実行した直後で画像回転の処理を呼び出して実行すれば、良いのではないでしょうか? あくまで予想ですが、 返り値の$ret[1]に保存された画像ファイルのパス付ファイル名が格納されているのではないかと思いますので、 それを引数に画像回転の処理が実行できるかと思います。 ただ、2.12系のソースで確認したわけではないので、 多少はソースを読んで、変更箇所を特定していただく必要があると思います。
|
468 |
投稿日時: 2017/10/25 13:16
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 もしかしたらgdthumb->Main()で保存された画像はexif情報を持っていない可能性がありますので、
その場合、gdthumb->Main()より前で画像回転の処理を行う必要があるかと思います。 (リサイズ時に新しい画像として保存している可能性がある為)
|
zenta |
投稿日時: 2017/11/15 20:41
対応状況: −−−
|
常連 登録日: 2016/10/18 居住地: 投稿: 59 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 468様
ご多忙の中、貴重な情報を頂きまして本当に感謝いたします。 いろいろと取り組んでおりますが、大変難しいです。ここでご質問がありまして、 >画像をアップロードした直後は、 >SC_UploadFile.phpのfunction makeTempFile()で >一時フォルダに画像が保存されます。 ①上記の作業でローカルディスクからeccubeにアップロードされた写真が保存される一時フォルダとは以下でよろしいでしょうか。 /httpdocs/upload/temp_image ②アップロードボタンを押して画面に写真が表示される時点では、既に写真は一時フォルダに保存されているのでしょうか。あるいは、画面に表示された後に一時フォルダに保存されるのでしょうか。どちらが先でしょうか。 |
468 |
投稿日時: 2017/11/16 10:24
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 質問いただいている件ですが、
>①上記の作業でローカルディスクからeccubeにアップロードされた写真が保存される一時フォルダとは以下でよろしいでしょうか。 デフォルトでは、 /html/upload/temp_image/ になります。 インストールした場所や環境によってディレクトリ名が変わる可能性がありますので、 /httpdocs/upload/temp_image で合っているのではないでしょうか? >②アップロードボタンを押して画面に写真が表示される時点では、既に写真は一時フォルダに保存されているのでしょうか。あるいは、画面に表示された後に一時フォルダに保存されるのでしょうか。どちらが先でしょうか。 画面に写真が表示された時点で、一時フォルダにファイルは保存されています。 画面に写真が表示された時のhtmlソースを見ると、imgタグのsrc属性は、サーバ上のパスを参照している事が分かります。 2系の商品登録の画面ですが、 アップロードボタンを押したタイミングで、サーバとの通信が走っています。(ブラウザの読込アイコンが動くと思います。) サーバへ指定したファイルを送信し、サーバ側はそれを一時フォルダに保存し、商品編集画面を再度表示させています。 サーバへファイルを送信する際、入力中のデータも一緒に送信していますので、 再度、編集画面を表示する時に、入力中のデータもすべて再セットしています。 この時点では、DBには何も登録されていません。 このアップロードボタンを押した時の判定は サーバ側では LC_Page_Admin_Products_Product.php function action()内の case 'upload_image':で処理を分岐させています。
|
zenta |
投稿日時: 2017/11/18 21:29
対応状況: −−−
|
常連 登録日: 2016/10/18 居住地: 投稿: 59 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 468様、
ご教授大変感謝いたします。 「もしかしたらgdthumb->Main()で保存された画像はexif情報を持ていない可能性がありますので、その場合、gdthumb->Main()より前で画像回転の処理を行う必要があるかと思います。(リサイ>ズ時に新しい画像として保存している可能性がある為)」 上記の内容は事実で、調べると保存された直後はexifは削除され、また(orientation=undefined)になります。そして保存される時点で立て向きの写真が回転されて横向きになっている等の場合があり(保存される直前に持っているexif:orientation関連の情報によって引き起こされる)、”それがそのまま保存されてしまい”、その時に問題が発生致します。 よって、一時フォルダ(temp_image)に保存される前にexif:orientationを削除する記述を記載することは可能でしょうか(回転を掛ける記述は状況によって右回り、左周りなどあり記述自体が複雑になるため現時点では保留。) 通常の記述であれば、パスやファイルのディレクトリを読み取ってその画像のexif:orientationを削除いたしますが、保存される前であればパスやファイルのディレクトリが無く、よってどこに存在する画像を対象に該当箇所の削除をする記述を記載することになるのでしょうか。あるいはこの様な状況下、特別な記述方法はありますでしょうか。 |
468 |
投稿日時: 2017/11/19 10:54
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 まず、やはりExif情報は保持されていなかったとの事、ご確認ありがとうございます。
このスレッドが立ち上がってから、ずっと気になっていた事が1点あるのですが、 Exif情報と画像の向きの関係について、私の認識と違いがあるように感じているのですが、如何でしょうか? タイトルでもそうですが、Exif情報を削除すれば、向きがおかしい状態が解消され、正しい向きで表示されるというようにおっしゃられていると思いますが、 私の認識では、画像ファイル自体はおかしな向きで保存されていて、 デジカメやビューアーアプリで表示する際、Exif情報を用いて自動的に向きを回転させて表示しているので、正しい向きで表示されているように見えているという認識です。 その為、Exif情報を削除すると、自動回転処理が行われず、向きがおかしいまま表示されると思います。 (各社SNS等ではExif情報を削除していると記述がありましたが、 ECCUBEもExif情報は削除しているという事を今回ご確認いただけているかと思います) リンクで参照サイトを提示いただいておりましたが、どのサイトもまずはPHPでExif情報を読み取り回転を処理する事が記述されていたと思います。 デジカメ内やPCのビューアーアプリが表示時に行う自動回転処理をPHPで実装する方法のページかと思いますので、 そこを参考に自動回転処理を実装する作業は避けて通れないと思います。 (これを実装しないと問題は解決しないと思います) SNS各社もExif情報を削除する時に、自動回転処理を実行していると思いますが・・・。 幸い、gdthumb->Main()内でグラフィック関数を用いて、 アップロードした画像のグラフィックデータのみ、一時フォルダへ新規作成した画像データへコピーしていると思いますので、 (ここでファイルコピー処理だった場合は、Exif情報も併せてコピーすると思いますが、 グラフィックデータのみコピーしていますので、Exif情報は無くなっていると思います) 同じくグラフィックデータに対して、Exif情報のorientationによる自動回転を処理すれば良いと思います。 アップロードファイルの仕組みですが、PHPの場合、ざっくり以下の流れとなるかと思います。 1.→2.の処理は、ブラウザとサーバが勝手にやってくれる処理で、 2.→3.の処理は、通常、プログラマが自分で作る必要のある処理です。 今回、2.→3.の処理がgdthumb->Main()にあたると思います。 その処理の中で、参照元ファイル[tmpディレクトリ(OS)]、参照先ファイル[一時ディレクトリ(temp_image)]のパスを変数に格納していると思いますので、 参照元ファイルのExif情報を読み込んで、 参照先ファイルの画像を回転させればいいのではないかと思います。 1.ブラウザからリクエストにファイルが含まれて送信される(POSTデータ) ↓ 2.tmpディレクトリ(OS)にファイルが保存される(ここまで終わって$_FILES変数でファイルにアクセスできる) ↓ 3.tmpディレクトリ(OS)からWEBアプリ内のディレクトリ(ECCUBE2では/temp_image)にコピー
|
zenta |
投稿日時: 2017/11/19 23:41
対応状況: −−−
|
常連 登録日: 2016/10/18 居住地: 投稿: 59 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 468様
ご多忙の中、ご教授頂きまして、感謝致します。 理解しておりませんので大変恐縮なのですが、この様になるのかなと、SC_UploadFile.php内の以下の様な記述を、今回は他のサイトを参考に試してみました。下記の①、③、④、そして配置場所に関して、あるいは、これでは全く無理であるなどアドバイスを頂けませんでしょうか。 // サムネイル画像の作成 function makeThumb($src_file, $width, $height, $dst_file) { $objThumb = new gdthumb(); $ret = $objThumb->Main($src_file, $width, $height, $dst_file); ~~~~~~~~~~~~~~~ $file_name = 'x';//①アップロードするjpgファイル $exif_datas = exif_read_data($file_name);//②jpgファイルからexifを読込むexif_read_data()関数 $img_path = 'y';//③写真の向きを調べる画像のパス $save_path = 'z';//④写真の向きを変えた画像を保存するパス $exif_datas = exif_read_data($img_path); if(isset($exif_datas['Orientation']) && $exif_datas['Orientation'] == 2){ $source = imagecreatefromjpeg($img_path); $rotate = imagerotate($source, 270, 0);//⑤写真を回転して向きを修正 imagejpeg($rotate, $save_path, 100); }else if(isset($exif_datas['Orientation']) && $exif_datas['Orientation'] == 3){ ~~~~~~~~~~~~~~~ if ($ret[0] != 1) { // エラーメッセージの表示 echo $ret[1]; exit; } return basename($ret[1]); } |
468 |
投稿日時: 2017/11/21 13:06
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 処理を記述する場所がそこでは遅いと思います。
$ret = $objThumb->Main($src_file, $width, $height, $dst_file); 上記箇所で、既に画像ファイルはリサイズ(グラフィックデータのコピー)が行われており、 $retに格納されているパスの画像ファイルはExif情報を失っていると思います。 Exif情報による自動回転する処理を記述するのであれば、 /data/module/gdthumb.php function Main($path, $width, $height, $dst_file, $header = false)の中になると思います。 $pathがtmpディレクトリ(OS)のパス(アップロードしたExif情報を持ったファイル)、 $dst_fileがコピー先のパスになると思います。 このメソッドの中で、imagecreate()を実行したり、imagepalettecopy()を実行したり、 拡張子に合わせて、形式を変えて保存したりと、 グラフィック関連の処理を行っていますので、 ここでイメージを回転さればいいのではないでしょうか?
|
zenta |
投稿日時: 2017/11/25 8:08
対応状況: 解決済
|
常連 登録日: 2016/10/18 居住地: 投稿: 59 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 468様、
ご多忙の中、長期間に渡り懇切丁寧にご教授頂きまして、感謝の限りでございます。 468様のご教授、そして最終的には下記サイトの記述を参考に、私が抱えていたeccube上での回転処理の問題が解決されている様でございます。 *回転されるはずの画像とそうでない画像の分岐(例:orientation番号を持っているか否かによる異なるimagejpeg()の使用)がなかなかうまくいかず、力技で対応致しましたので、その記述に関してはここでは省略致します。(今後どのような不具合が出てくるか分かりませんし、より良い方法があるかと思われます。) ですので、その点は適宜応用されなければいけないと存じますが、下記は回転されるはずの画像が正常に表示される記述です。 最後に御社の益々のご発展をお祈り申し上げます。本当にありがとうございます。 gdthumb.php function Main($path, $width, $height, $dst_file, $header = false) { ~~~~~~~~~~~~~~~~~ // jpg形式 case "2": $src_im = imageCreateFromJpeg($path); $dst_im = $imagecreate($re_size[0], $re_size[1]); $imageresize( $dst_im, $src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]); // 画像出力 if($header){ header("Content-Type: image/jpeg"); imageJpeg($dst_im); return ""; }else{ $dst_file = $dst_file . ".jpg"; if($re_size[0] == $size[0] && $re_size[1] == $size[1]) { // サイズが同じ場合には、そのままコピーする。(画質劣化を防ぐ) copy($path, $dst_file); } else { $img_path = $path; //向きを調べる画像のパス $save_path = $dst_file; //向きを変えた画像を保存するパス $exif_datas = exif_read_data($img_path); if(isset($exif_datas['Orientation'])){ switch ($exif_datas['Orientation']){ case(3): $rotation=180; break; case(8): $rotation=90; break; case(6): $rotation=-90; break; default: $rotation=0; break; } $source = imagecreatefromjpeg($img_path); $rotate = imagerotate($source, $rotation, 0); imagejpeg($rotate, $save_path, 100); } } } imagedestroy($src_im); imagedestroy($dst_im); break; |
zenta |
投稿日時: 2017/11/26 0:50
対応状況: −−−
|
常連 登録日: 2016/10/18 居住地: 投稿: 59 |
Re: GPSモバイル機器で撮影した写真に付随するexif情報を削除する機能をeccubeに付加可能でしょうか。 468様
申し訳ございません。まだ、問題がありまして、前回の内容の記述imagejpeg($rotate, $save_path, 100); であれば表示される画像が回転はされるものの、拡大されすぎます。 デフォルトのimageJpeg($dst_im, $dst_file); と異なり、サイズに関する記述が欠落しているためなのかと考え、いろいろ試しておりますが難しく、どのような記述にすべきかご教授頂けませんでしょうか。 |
« 1 (2) 3 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |