我有一个大尺寸的图像文件,大小接近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));
}
});
有人可以帮我解决这个谜语吗?
注意: 如果除此库之外还有其他可能性请添加您的建议。
答案 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();
}