2011-01-26 6 views
17

Androidでは、電話機の写真からビットマップをデコードすると、元の画像のEXIFデータが失われます。このBitmapをソケット経由でサーバーに送信していて、不足しているEXIFデータを送信するデータに再接続したいと考えています。Androidのシリアル化されたビットマップにEXIFメタデータを添付するにはどうすればいいですか?

Bitmap bitmap = ... 
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap); 
bitmap.compress(CompressFormat.JPEG, 70, stream); 
byte[] input = stream.toByteArray(); 

私はEXIFで取得するためにExifInterfaceを使用したい:

私はメディアストアからBitmapオブジェクトをロードし、ソケットの上にそれを送信するための準備でバイト配列にそれを圧縮し、いくつかのコードを持っていますメタデータをSDカードの元のjpegに入れて、どうにかそれを送信バイト配列に追加して、サーバ側で正しいEXIFをjpegで抽出できるようにします。これまでのところ、私はすべてのEXIFデータを読み取るためにExifInterfaceを使用するために管理:

String path = ... //bitmap file path 
ExifInterface exif = new ExifInterface(path); 
... = exif.getAttribute(...) 

EDIT:最適には、私は何のライブラリを使用しない解決策を見つけるしたいと思います。 EXIFを含むオリジナルのjpegのバイト配列のインデックスを取得して、これらのバイトをbitmap.compress(...)によって生成されるバイト配列に追加することができれば、これが最適です。

+0

あなたはバイト配列にEXIF情報を追加することで成功しましたか? – Vikas

答えて

7

@Nick CampionSanselanのおかげです。コードの作業

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 100, bos); //Bitmap object is your image 
byte[] data = bos.toByteArray(); 

TiffOutputSet outputSet = null; 

IImageMetadata metadata = Sanselan.getMetadata(new File(filepath)); // filepath is the path to your image file stored in SD card (which contains exif info) 
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; 
if (null != jpegMetadata) 
{ 
    TiffImageMetadata exif = jpegMetadata.getExif(); 
    if (null != exif) 
    { 
     outputSet = exif.getOutputSet(); 
    } 
} 
if (null != outputSet) 
{ 
    bos.flush(); 
    bos.close(); 
    bos = new ByteArrayOutputStream(); 
    ExifRewriter ER = new ExifRewriter(); 
    ER.updateExifMetadataLossless(data, bos, outputSet); 
    data = bos.toByteArray(); //Update you Byte array, Now it contains exif information! 
} 
+0

上記のコードは、Sanselan Androidで期待通りに動作しないことがよくあります。特に、イメージのサイズを変更すると、上記のコードはEXIFメタデータをコピーするだけでなく、イメージデータを上書きしてサイズ変更を元に戻します。他の人が出会ったSanselanの問題と思われます:http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E。私はここでこの問題の回避策について書いた:http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

それは私とうまく動作します。 'Sanselan'はhttps://commons.apache.org/proper/commons-imaging/を指し、' Sanselan.getMetadata'は 'Imaging.getMetadata'になります。 – Leon

関連する問題