我目前正在开发一个隐写 Android 应用程序作为一个班级项目。我创建了一个对象,它将在另一个图像中对图像进行编码并返回编码的位图。该代码在单独的线程中运行。
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 位图,并且其间不会发生变化。如果我将整个位图传递给文件浏览器活动并且在两个位置保存完全相同的位图,则代码仍然有效。我不知道还有什么可能导致这种情况。我正在寻找有关其他可能导致问题的原因的建议。抱歉,我打算在这两种情况下在输出上发布图像,但是堆栈溢出不会让我达到我的声誉水平,谢谢。