gpt4 book ai didi

java - 读取时,android 中保存的位图长度为 3 个字节

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:58 25 4
gpt4 key购买 nike

我有一个选择和保存个人资料图片的 Activity 。有一个 ImageView 和一个启动图库 Activity 的按钮,等待用户选择图像。当画廊关闭时,执行以下代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if ((resultCode == RESULT_OK) && (requestCode == SELECT_PHOTO)) {
Uri selectedImage = data.getData();

try {
Bitmap image = this.decodeAndScaleImage(selectedImage, 285);
imgInsertPicture.setImageBitmap(image);

this.imagePresent = true;
this.saveMyProfilePicture(image);
this.popImageView();
} catch (IOException e) {
e.printStackTrace();
showToast(R.string.error_saving_picture);
}
}
}

private void saveMyProfilePicture(Bitmap picture) throws IOException {
FileOutputStream outputStream = openFileOutput(Globals.MY_PICTURE_FILE_NAME, MODE_PRIVATE);
picture.compress(Globals.MY_PICTURE_FORMAT, 90, outputStream);
outputStream.close();

ByteArrayOutputStream rawOutputStream = new ByteArrayOutputStream();
picture.compress(Globals.MY_PICTURE_FORMAT, 90, rawOutputStream);

byte[] rawPictureData = rawOutputStream.toByteArray();
rawOutputStream.close();

byte[] base64PictureData = Base64.encode(rawPictureData, Base64.DEFAULT);
rawPictureData = null;

FileOutputStream base64OutputStream = openFileOutput(Globals.MY_PICTURE_B64_FILE_NAME, MODE_PRIVATE);
base64OutputStream.write(base64PictureData);
base64OutputStream.close();
}

我调试了这段代码并验证了: - 不抛出异常; - 写入的文件包含准确的数据量(jpg 图像为 17kB,base64 版本为 24kB); - 生成的位图符合我的预期,并在 ImageView 中正确显示。

popImageView 仅用于在选择图像之前将 ImageView 撞到前面的其他 View 之上;并且 decodeAndScale 方法仅适用于内存中的位图数据,不保存任何内容。

但是,当我尝试在 Activity 启动时重新加载当前图片时,显示的图像是空白的,jpeg 文件仅包含 3 个字节:

@Override
public void onStart() {
super.onStart();

if (!imagePresent && pictureExists()) {
File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME);
imgInsertPicture.setImageURI(Uri.fromFile(pictureFile));
popImageView();
imagePresent = true;
}
}

此处 pictureExists 检查文件名是否包含在 listFiles() 返回的集合中。 pictureFile.exists() 返回 true,但正如我所说,它只包含 3 个字节。我也尝试过使用 BitmapFactory.decodeX,但由于文件已损坏,所以没用。

我不明白为什么。我检查了该文件是否已完全写入,然后它就消失了......当我在我的 Nexus S 上调试时,代码运行良好,但后来我切换到 Nexus 5,它就坏了。

最佳答案

您是否尝试过使用 BitmapFactory 将文件解码为位图?

http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String)

还没有测试过下面的代码,但你能试试吗:

File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME);

Bitmap bitmapImage = BitmapFactory.decodeFile(Uri.fromFile(pictureFile));
imgInsertPicture.setImageBitmap(bitmapImage);
popImageView();
imagePresent = true;

关于java - 读取时,android 中保存的位图长度为 3 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com