私は現在、クラスプロジェクトとしてsteganogrpahyandroidアプリに取り組んでいます。画像を別の画像でエンコードし、エンコードされたビットマップを返すオブジェクトを作成しました。このコードは別のスレッドで実行されます。
new Thread(new Runnable()
{
public void run()
{
Bitmap encoded_image = null;
Encryptor encryptor = new Encryptor();
encoded_image = encryptor.encode_image_in_image(
image_location,message_image_location);
}
}).start();
ビットマップをエンコードした後、ビットマップをpng画像として保存するために作成したファイルブラウザアクティビティにビットマップを渡していました。この方法は小さい画像に対しては機能しますが、大きい画像がエンコードされてサブアクティビティに渡されると、アプリケーションはフリーズしてメインアクティビティに戻ります。
private void pass_image_to_file_browser( Bitmap image )
{
Intent intent = new Intent(Encrypt.this,FileBrowser.class);
intent.putExtra( Intent.EXTRA_STREAM, image );
startActivity( intent );
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = this.getIntent().getExtras();
Bitmap image = bundle.getParacable(Intent.EXTRA_STREAM);
}
インテントを使用してアクティビティ間で送信するには大きなビットマップが大きすぎると想定していたため、画像を一時的な場所に保存し、画像の場所をサブアクティビティに渡すことにしました。次に、ユーザーが指定したpng画像を保存し、一時画像ファイルを削除します。
private void save_bitmap( Bitmap image, String location )
{
FileOutputStream fileOutputStream = new FileOutputStream(location);
BufferedOutputStream buffered_output_stream = new
BufferOutputStream(fileOutputStream);
image.compress(CompressFormat.PNG, 0, buffered_output_stream);
buffered_output_stream.flush();
buffered_output_stream.close();
}
これにより、あるアクティビティから別のアクティビティに大きなビットマップを送信するという問題は解決されますが、私が解決できなかった新しい問題が発生しました。ファイルの場所をサブアクティビティに渡す前に保存された一時的な画像と、ファイルブラウザを使用して画像を再保存した後の画像ファイルの両方で、色がわずかに変更されています。この色の変化は肉眼では認識できませんが、画像をデコードするときに多くの問題が発生します。Bitmap.ConfigがARGB_8888からARGB_4444またはRGB_565に変更されていると思ったのですが、デバッグ後はそうではありませんでした。ビットマップはARGB_8888としてインスタンス化され、ARGB_8888ビットマップとして保存され、その間で変更されることはありません。ビットマップ全体をファイルブラウザアクティビティに渡し、両方の場所でビットマップをまったく同じように保存している場合でも、コードは機能します。私は他に何がこれを引き起こしているのかについては何も考えていません。他に何が問題を引き起こしている可能性があるかについての提案を探しています。申し訳ありませんが、どちらの場合も出力に画像を投稿するつもりでしたが、スタックオーバーフローでは評判レベルに達しませんでした。ありがとうございます。