簡體   English   中英

android中保存的位圖讀取時長度為3個字節

[英]Saved bitmap in android is 3 bytes long when read

我有一項活動可以選擇並保存個人資料照片。 有一個圖像視圖和一個按鈕,用於啟動圖庫活動以獲得用戶選擇圖像的結果。 關閉圖庫時,將執行以下代碼:

@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); - 生成的位圖是我期望的,並在圖像視圖中正確顯示。

popImageView僅用於在選擇圖像之前將圖像視圖置於正面的其他視圖之上; 和decodeAndScale方法僅適用於內存中的位圖數據,不保存任何內容。

但是,當我嘗試在活動開始時重新加載當前圖片時,顯示的圖像為空白,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;

在onActivityResult中嘗試這個

 Uri selectedImage = data.getData();
 String[] filePathColumn = {MediaStore.Images.Media.DATA};

 Cursor cursor = getActivity().getContentResolver().query(
                           selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        cursor.close();


        selectedImagePath =filePath;

然后使用selectedImagePath作為文件路徑。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM