2016-11-21 3 views
9

ImageMagicksconvert in.jpg -resize 50% out.jpgのように)メタデータを削除せずにJPEG画像ファイル(ファイルシステムからファイルシステム)のサイズを変更する方法はありますか?ファイルシステム内のJPEG画像のサイズを変更

私が見つけた.jpgファイルのサイズを変更するための唯一の方法は、BitmapFactory.decodeStreamBitmap.compressです。手動でイメージメタデータを転送する必要がある場合は、オーバーヘッドのようです。

+0

リサイズでは、画像をリサンプリングして解像度を変更することを意味しますか?もしそうなら、AFAIKは、そのための唯一のものは、あなたの質問に引用しているものです。 – CommonsWare

+0

はい、解像度を変更してください。私が探しているものを説明するサンプルコマンドを追加しました。 –

+0

私が見逃してしまったSDKには何かが潜んでいない限り、サードパーティライブラリを使用するか、[EXIFヘッダーを自分で処理する]オプションがあります(https://commonsware.com/blog/2016/05/31 /tale-two-exifinterfaces.html)を 'BitmapFactory' /' Bitmap'と組み合わせて使用​​します。 – CommonsWare

答えて

2

android.media.ExifInterfaceでメタデータを読み取るBitmap.compress介して画像を圧縮してから戻ってメタデータを保存することも可能である。

String filename = "yourfile.jpg"; 
// this reads all meta data 
ExifInterface exif = new ExifInterface(filename); 

// read and compress file 
Bitmap bitmap = BitmapFactory.decodeFile(filename); 
FileOutputStream fos = new FileOutputStream(filename); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); 
fos.close(); 

// write meta data back 
exif.saveAttributes(); 

私はそれをテストしていないが、source code of ExifInterfaceを見て、それが動作する可能性があり。 実装の詳細を頼りにしたくない場合は、もちろんすべての属性をループしてコピーすることができます。


もう1つの解決策は、 Android Exif Extendedライブラリを使用することです。 exifデータを読み書きする小さなプロジェクトです。

+0

問題は、saveAttributes()が意味する "元のイメージファイル"の意味です。これは、ファイルハンドルや何かを開いている可能性があります。私はこれを適切に使用する方法は、2つのExifInterfaceインスタンスを持ち、すべてを1つから別のものにコピーすることだと思います。 –

+0

@SimonWarta [ソースコード](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/media/ExifInterface)を見ると、 .java#ExifInterface.saveAttributes%28%29)、オープンファイルハンドルはありません(私が知る限り)。ファイル名と属性をパラメータとしてネイティブメソッドを呼び出します。 – Manu

+0

これはAndroidバージョン1つで動作する可能性があります。問題は、特定の実装の詳細を乱用していることです。 saveAttributesは、元のファイルの変更された属性を保存し、新しいファイルを新しいファイルに保存しないように文書化されています。ある実装では、実装はディスクに変更を書き込むだけで、すべての属性に書き込むことはできません。たとえば2つの新しいAPI24コンストラクタに追加しました。それらは異なる実装を強制するでしょう。とにかく、2つのExifInterfaceオブジェクトを使用してループとコピーのバージョンに回答を適応させることができます。 –

関連する問題