Android - 在imageview

时间:2016-12-12 12:45:48

标签: android image file

我有一个大尺寸的图像文件,大小接近16MB。我想在我的imageView中加载这个图像,然后在添加标记后缩放它。我用 subsampling-scale-image-view 尝试了这个。我正在关注以下链接https://github.com/davemorrissey/subsampling-scale-image-view

重点是我正在从网址加载图片。以上库不支持。所以我刚刚下载了图像并在从该本地文件加载后保存到SD卡。从技术上讲,这是有效的。

问题:

现在问题是第一次下载需要花费太多时间。甚至第二次也需要将近一分钟。

我的想法:

由于这个问题,我尝试逐字节加载图像。一旦图像下载100字节,然后显示在imageView下一步从url下载图像的下一部分。有可能这样做吗?

目前我正在加载图片,如下面的代码:

URL url = new URL(url_);

                URLConnection conection = url.openConnection();
                conection.connect();
                // getting file length
                int lenghtOfFile = conection.getContentLength();

                // input stream to read file - with 8k buffer
                InputStream input = new BufferedInputStream(url.openStream(), 8192);

                // Output stream to write file

                OutputStream output = new FileOutputStream(root+"/"+ fileName);
                byte data[] = new byte[1024];

                long total = 0;
                while ((count = input.read(data)) != -1) {
                    total += count;

                    // writing data to file
                    output.write(data, 0, count);

                }

                // flushing output
                output.flush();

                // closing streams
                output.close();
                input.close();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        image.setImage(ImageSource.uri(root+"/"+ fileName));
                    }
                });

有人可以帮我解决这个谜语吗?

注意: 如果除此库之外还有其他可能性请添加您的建议

1 个答案:

答案 0 :(得分:0)

从未尝试过,但您可以检查一下是否有效。

以字节数组的形式从url获取数据。

data = getImageStream(url);  //should call in async Task.. 

现在将字节数组转换为位图并在imageView中设置。

 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
 image.setImageBitmap(bitmap)

不写入文件。这有助于提高性能。

public byte[] getImageStream(String url){      
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;
try {
  is = url.openStream ();
  byte[] byteChunk = new byte[4096]; // Or whatever size you want to read in at a time.
  int n;

  while ( (n = is.read(byteChunk)) > 0 ) {
    baos.write(byteChunk, 0, n);
  }
}
catch (IOException e) {
  System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());
  e.printStackTrace ();
  // Perform any other exception handling that's appropriate.
}
finally {
  if (is != null) { is.close(); }
}
return baos.toByteArray();
}