Resize image file w Geo Pic Plugin
Dev Record GeoPicPlugin, GeoPicPlugin

Abstract#

画像ファイルをアップロードするときにファイルサイズを小さくしたい。

Topics#

やりたいこと#

記録#

アップロードボタンが押されてから、まず、サーバにファイルがアップロードされて、そのあとEXIFを読み取るのが今回のプログラムかな。保存のタイミングはどこか。
GeoPicServlet.upload()の175ライン当たりにparseRequestというのがあり、ここで”本当に制限したいファイルサイズ”のチェックがされる。
GeoPicServlet.upload()の250ラインあたりに(FileItem)actualFileオブジェクトができている。そこから情報を吸い出しているようだ。InputStreamもそこからいつでも得られる。このInputStreamからEXIFなどを吸い出して、Fileを更新して一次フォルダに保管しておいて、ファイルアップロードを実行するときには一次保管したファイルのInputStreamを渡す。
315行あたりにthis.executeUpload(,InputStream in,)とある。
467行あたりにm_engine.getAttachmentManager().storeAttachment(att, data);とある。
AttachmentManagerの574行目にm_provider.putAttachmentData( att, in )がある。これは、WikiAttachmentProviderというInterface Classに定義されているメソッド。実態はどこだ?org.apache.wiki.providersパッケージの中にいくつかある。
この(InputStream)dataを圧縮後のファイルに置き換えるということか。
TOMCAT_HOMEの下にtempフォルダがあって、そこにアップロードするファイルが一時的に保存されている。プロパティのworkDirを使っているところを探そう。m_engine.getWorkDir()で取れるっぽい。そこに淡々と保存するか。で、そのファイルを開いて、InputStreamをつくるか。
もし一時ファイルに保存したとしたら、それを消すのはいつ?tempFile.deleteOnExit()
in は InputStream、Outは、InputStreamってできる?一度Tempファイルで保存か。サンプルを見よう[4].
ImageIOってなんだろう[2]。いくつかサンプルが[3]。BufferredImageが便利。しかしImageオブジェクトをBufferredImageにキャストしようとしたらエラーがでた。同じ問題に当たった人も[5]
Apache Commons Imaging を使った場合。実は、JPEGの保存について、Imagingが対応していない[6]ためエラーorg.apache.commons.imaging.ImageWriteException: This image format (Jpeg-Custom) cannot be written.がでる。
	Imaging.writeImage(buffered, tempImageFile, ImageFormats.JPEG, null);
ImageIOでやるとこうなる。画質が指定できないのが玉に傷だが、シンプルだ。
	ImageIO.write(buffered, "jpeg", tempImageFile);
orientation value回転角度(°)高さ回転の中心座標
10widthheight回転しない
3180 degwidthheight(width/2, height/2)
690 degheightwidth(height/2, height/2)

Referece#

  1. [#1]http://commons.apache.org/proper/commons-imaging/
  2. [#2]https://qiita.com/oohira/items/be99b3c8f025d04a5541
  3. [#3]エンジニアの入り口, 2018.04.13,【入門者向け】Javaにおける画像の扱い方を分かり易く解説, https://eng-entrance.com/java-image
  4. [#4]http://commons.apache.org/proper/commons-imaging/sampleusage.html
  5. [#5]https://stackoverflow.com/questions/13605248/java-converting-image-to-bufferedimage
  6. [#6]http://commons.apache.org/proper/commons-imaging/formatsupport.html
  7. [#7]http://mumumu.github.io/blog/2013/05/15/rotate-image-depending-on-exif-orientation-value/
  8. [#8]@oohira, 2017年4月16日, JavaでJPEG画像の保存品質を変更する, https://qiita.com/oohira/items/be99b3c8f025d04a5541
  9. [#9]EXIF Tags, https://exiftool.org/TagNames/EXIF.html
  10. [#10]2019年6月9日, Invalid marker found in entropy data, https://issues.apache.org/jira/browse/IMAGING-134