使用字节数组读入文件,然后在ImageView(Android)上显示

时间:2011-07-11 11:51:30

标签: android bytearray

我试图使用ImageView显示图片文件, 虽然我知道我可以直接将文件解码为位图, 但我必须做一些其他事情,所以我只能选择byte []。

代码如下所示:

File file = new File(getRealPathFromURI(Uri.parse(ImgUri)));
byte[] beforeData = new byte[(int) file.length()];
try {
    FileInputStream fis = new FileInputStream(file);
    int detectEnd = 0;
    while (detectEnd != -1){detectEnd = fis.read(beforeData, 0, 1024);}
    Bitmap b_t = BitmapFactory.decodeByteArray(beforeData, 0, beforeData.length);
    editImgView.setImageBitmap(b_t);
} catch (FileNotFoundException e) {e.printStackTrace();}
    catch (IOException e) {e.printStackTrace();}

我试图测试我是否正确阅读了图片, 所以我解码到Bitmap然后尝试显示它, 但它根本不显示任何图片。

我对FileInputStream有什么误解吗? PS。我使用log.i来检查并发现beforeData的长度是正常的, 但里面的数据只得到:         [B @ 40c4b110, 这不像图片的数据。

先谢谢, Desolve。

哎呀,谢谢你,硅胶, 我忘了考虑那个部分......(一开始我做了) 然而,好像它不是主要问题所在...... 现在循环看起来像:

    while (pos < beforeData.length){
            read = fis.read(beforeData, pos, 1);
            pos += read;
        }

我知道这是愚蠢的假人 但是这个块中的代码应该正常工作,对吧? 但是,我仍然无法在ImageView中看到任何图片。

另一个PS: 该文件的路径位于/mnt/sdcard/DCIM/Camera/1310368442822.jpg, 大小1485847字节, 会不会造成任何麻烦?

1 个答案:

答案 0 :(得分:1)

您只是将数据读入每个循环的数组的前1024个字节。

fis.read(beforeData, 0, 1024);

你必须维护一个位置计数器(int pos)并使用另一个变量(int read)来检测-1

int read=0;
int pos=0;
while (read!=-1) {
    read= fis.read(beforeData, pos, 1024);
    pos+=read;
}

确保关闭文件(fis.close())......

最好的方法是:

File tmpImgFile = new File("/path");
BitmapFactory.decodeFile(tmpImgFile.getAbsolutePath());