ラベル Apache の投稿を表示しています。 すべての投稿を表示
ラベル Apache の投稿を表示しています。 すべての投稿を表示

2016年11月5日土曜日

またしてもたった一行が:Ancroid SDK Camera2で位置情報を写真に保存する #EXIF #Android

みなさまこんばんは。
今日はCamera2で位置情報保存するにはCaptureRequest.JPEG_GPS_LOCATIONしないとだめだよ、ってお話です。あるいは、リファレンスはちゃんと読め、というお話・・・。
週末ですねー。
週末といってもさっぱり休めてませんが、皆様いかがお過ごしでしょうか。

まあ休めていない理由の一つに、今月のABC 2016までに公開しようと目論んでるアプリの進捗が思わしくないことがあるんですけど。
あと二週間だよ。基本的な機能もまだ実装できてないよママン。

で、今日も空き時間を見つけてカリカリとコードを書いてました。
・・・やっぱCamera2難しいわ。
いや、「難しそう」と最初に先入観持ってしまったから、余計そう思うのかもしれませんが。

だってサンプル少ないんだもん。

カメラで撮影して、画像にOpenStreetMapの地図を合成して、ApacheのCommons Imagingを使ってEXIF情報をのっけたまではできたんですが。
肝心な位置情報がどうしても保存できない・・・。
GPSからはきちんと位置情報取れてるのになー。

・・・位置情報だけはExifInterface使わないとダメなのかな?
と思って、嫌々(理由はこちら)試してみるも、玉砕。

まあそんなわきゃねえか。

ここまでで既に一時間。コードを書いちゃ消し・・・はせずに「もったいないから」とコメントアウト。過ぎ去っていく時間に比例して増えていくコメント行。ああ。

でも、ふと、ぶれいくするーは訪れるもので。
「そもそも、位置情報を保存するようにカメラに言わなきゃだめなんじゃね?」

・・・あったあった。
「CaptureRequest」に、「JPEG_GPS_LOCATION」ってのがしっかりと・・・。

こんな感じで。前後ちょっとはしょりますが。

Location crrLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
...
final CaptureRequest.Builder captureBuilder =
     mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
...
captureBuilder.set(CaptureRequest.JPEG_GPS_LOCATION, crrLocation);

これだけ。この最後の一行だけ。
この一行追加しただけで、あっさりと位置情報保存してくれた。
一時間半経過して、ようやくガッツポーズ。周囲に人いなくてよかった。

・・・何もカメラに要求しないでも、GPSさえ有効にしておけば、カメラちゃんの方で勝手に位置情報をメタデータに保存してくれる、って私が思い込んでたんですよねー。

Camera2ではいちいちきちんと要求しないといけない、ということなのかしら。

まあ、Commons Imagingの使い方を疑ったりExifInterfaceに擦り寄ったり、そういう回り道したからこそ、CaptureRequestしないとダメなんでは?と着想したわけで、何つーの?急がば回れ、的な・・・

・・・いや、最初からドキュメント読んどきゃええねん・・・ orz

あともうちょっと。頑張ろう。



2015年6月19日金曜日

ぼくはやればできるこ:Windows 7で写真の「タグ」を表示「Common Imagings」

こんにちはー。ご無沙汰です。
うわー、一ヶ月以上もブログ書いてなかったー。

実は、最近ちょっとアプリ開発から離れておりまして。
今週くらいからやっとAndroid Studio触れるようになりました。

でも、久しぶりにコードを触ったものだから、自分で書いたはずのコードなのに、「あれ?なんでココでこんなことやってんの?」ってことばかり。
あかんなあ。これからちょこちょこ触るようにしよっと。

で、本題。
Google Playに公開してるカメラアプリも、ようやく総ダウンロード数が1,000を越えまして、記念にいっちょ機能を追加してみようかと。

カメラで撮影した写真の上に、ちょっとしたメモを追加するってアプリなんですが。
どうせなら、そのメタ情報を写真ファイル自体にも埋め込んじゃおう、ってね。

まあ埋め込むとしたらEXIFのUserCommentかなー、ってわけで、またまたこちらのライブラリの出番です。

「Commons Imaging」

このTiffOutputDirectoryに、メモの文字列をadd()してやればオッケー。
TiffOutputDirectory.add(ExifTagConstants.EXIF_TAG_USER_COMMENT, "メモ");

「add」のパラメータに、追加先のEXIFタグと、メモの文字列を渡してやればいいんですな。楽勝楽勝。
ドヤ顔でGoogle Playに公開して、その旨ボスに報告したところ、・・・当然といえば当然すぎるツッコミが。
「で、そのメモ、どうやって見るの?」

・・・。
「いや、exiftool使うなり、別のツールを開発したりしてですね・・・」と喉元まででかかったけど、なんとかこらえる。
そうだよなー。
Windowsの表示オプションで、「コメント」って項目にチェックを付ければ、一応UsetComment見られるんだけど。
そもそも、Windowsのフォルダ表示オプションを変更できるユーザーさんて、意外に少ない。
やっぱ、せっかくだから、パソコンでさくっと使いたいよなー。

というわけでGoogle先生に泣きついて、こんなページを見つけました。

「画像を検索しやすいようにタグ付けする」

へー。そーなんだー。ふーん。
こんなんなるらしい。デフォルトの状態から、「詳細表示」に切り替えるだけ。



・・・正直Windows 7、結構長いこと使ってるけど、こんなん全然知らなかった。
Evernoteのタグみたいな感じかな。
でも、「タグ」て。名前、「タグ」って。そのままじゃん。
いや使う分には簡単な名前の方がいいんだけどさ。
じゃ、どうすりゃいいのよ、って検索してみると・・・すっごく探しにくい。
余計な情報ばっかり検索結果に出てくるし。
どうやったら追加できるかとか、そもそもJPEGファイル自体に埋め込めるのかとか、Javaから操作できるのか、とか、さっぱり出てこない。

・・・うう、さくっと公開して、素敵な週末を迎えるはずだったのに。
いやいや諦めるのは、まだ早い。

まず、この「タグ」なるものがなんなのか、調べてみた。
Windows 7で画像に「タグ」を追加して、それをExiftoolにかけてみる。
追加したタグは「lunch」。
・・・こんなん出た。
XP Keywords: lunch
Subject: lunch
Last Keyword XMP: lunch
・・・あれ?情報・・・あるねー。

ちなみに-sオプションをつけるとこのように。
XPKeywords: lunch
Subject: lunch
LastKeywordXMP: lunch
情報のってる、しかもExiftoolで取れるってことは、・・・なんとかなるんじゃないの!?

ダメ元で、Common Imagingsのドキュメント、もう一度探してみた。

んで、発見。「Interface MicrosoftTagConstants」

この「EXIF_TAG_XPKEYWORDS 」ってのが怪しそうだにゃー。
で、先ほどのUserCommentと同じように、以下の定数をaddしてあげたら成功ー。
MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS
Microsoftのタグ、ってことか・・・。
・・・。
やー、ドキュメントは読んでおくものですねー(いまさら)。
ま、やっとこれで素敵な週末になりました。ちゃんちゃん。

2014年3月27日木曜日

Commons Imagingちゃん口説き落とした: Exif情報のコピー

こんに・・・ち・・・は・・・。
コメダなうです。コメダ最高。最高。最高。

今週はずっとExif情報と格闘しているわけです。
あまりにもざっくりとした大雑把?なAndroid ExifInterfaceに見切りをつけて、ネットで出会ったCommons Imagingちゃんを攻略していました。

ある画像から別の画像へ、Exif情報をコピーしたいだけなんですが、なかなかどうしてうまく行かない。
もちろん、Javaを初めて二か月も経っていないワタシのスキル不足、ということはあるにしても、
・・・。

サンプルとか少なすぎるやろ (*´Д`)

Apacheのウェブサイトにはもちろんサンプルがいくつかあるんですが、他の情報が少なすぎる。
ワタシが慣れていないせいかもしれないけど、ドキュメントには最低限の情報しか書いていない気がする。
情報の9割が英語なのはまあいいとしても、Method Detailとかあるんだったら、すこぉしは説明欲しい気がするんだよなー・・・。メソッド名見れば分かるよね?ってことですね、うん、ごめんね・・・。

それでも、なんとか検索しまくって、参考になりそうなサンプルを発見。
Copying EXIF metadata using Sanselan

まあこのサンプルではSanselanを使うことを前提にして書いているので、Commons Imaging用に書き換えましたけど。

↓コレを
IImageMetadata metadata = Sanselan.getMetadata(jpegImageFile);


↓こんな感じに。
IImageMetadata metadata = Imaging.getMetadata(jpegImageFile);

なんとかうごいたー。
なんとか夕方までにめどがついてよかった。これで今晩もぐっすりさ。
もう一度言うけど、コメダ最高。ゆっくり集中できたおかげで解決した。

2014年3月26日水曜日

ExifInterfaceよさようなら、Commons Imagingよこんにちは

こんにちはこんにちは。ひゃっほい。外は雨ですけどウキウキです。

以前からAndroid SDKのExifInterfaceを使って、画像にEXIF情報を設定しようとしていたのですが。

う ま く い か な い

色々調べても、利用できるExifタグに制限があったり、設定しても他のタグ情報を壊してしまったりで、さんざ苦しめられていました。

どっかのサイトには「ExifInterface is buggy」とか書いてあったりして。

で、しょうがないから代替案を探していたのですが・・・

どうやらApacheの「Commons Imaging」というライブラリが良さげ、という情報を見つけましたので、早速試してみました。

「Commons Imaging」
http://commons.apache.org/proper/commons-imaging/

こちらに*.jarファイルが公開されていたので、さくっとダウンロードして、Eclipseに配置、ビルドパスを登録。

で、こちらにサンプルソースがあったので、パチパチと眺めながら組み込んでみますと・・・

やった うごいた うごいたよ!

サンプルどおりにニューヨークのGPSデータをセットしてみたら、問題なく写真がニューヨークで撮った写真になりました(笑)。

案外簡単にできてよかった・・・と安心してると、また壁にぶち当たるな、きっと。
自戒自戒。

あとは、他のタグ情報も設定してみまーす。