我目前正在为课程项目开发一款隐写术安卓应用。我已经创建了一个对象,可以将一张图片编码到另一张图片中,并返回一个编码后的位图。这段代码在一个单独的线程中运行。
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位图,并且在中间不会发生任何变化。如果我将整个位图传递给文件浏览器活动,并且在两个地方完全相同地保存位图,则代码仍然可以正常工作。我没有其他可能导致这种情况的想法。我正在寻求关于可能导致问题的建议。很抱歉我本来想在两种情况下发布输出图像,但由于我的声望等级,堆栈溢出不允许我这样做。