我正在尝试从网上下载jpg图像,将其保存为字节数组,以便将压缩图像放在ram上,直到我必须显示它,但我得到一张黑色图片。
我正在做的是:
URL myFileUrl =null;
myFileUrl= new URL(fileUrl);
HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
conn.setUseCaches(false);
InputStream is = conn.getInputStream();
byte[] ba = new byte[is.available()];
之后我将数组保留在RAM中,直到我必须使用它。
要放置它,我这样做:
Bitmap bitmapFromByteArray = BitmapFactory.decodeByteArray(ba,0,ba.length);
imageView1.setImageBitmap(bitmapFromByteArray);
bitmapFromByteArray.recycle();
我通过
解决了这个问题URL myFileUrl =null;
myFileUrl= new URL(fileUrl);
HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
Bitmap bm = BitmapFactory.decodeStream(is);
int size = bm.getWidth() * bm.getHeight();
ByteArrayOutputStream out = new ByteArrayOutputStream(size);
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
byte[] ba2 = out.toByteArray();
bm.recycle()
Buut通过这样做,我正在解码JPEG,然后多次重新编码图像,降低了图片的质量,并使用超过必要的电话资源。此外,重新编码后得到的位图大于原始的jpg图像。
有没有办法让第一种方法起作用?
谢谢。
答案 0 :(得分:0)
您是否只想将InputStream
的内容复制到字节数组中?
您可以使用将InputStream#read
调用到字节数组中的循环直接执行此操作,也可以使用Apache commons中的IOUtils.toByteArray将实现保留给其他人。
编辑 - 如果使用Apache commons方法,则无需处理数组初始化:
byte[] bytes = null;
try {
bytes = IOUtils.toByteArray(conn.getInputStream());
} catch (IOException e) {
// handle the exception
}
toByteArray
使用ByteArrayOutputStream
来避免预先分配数组,但您不必担心这一点。
答案 1 :(得分:0)
byte[] ba = new byte[is.available()];
这不是你得到所需字节的方式。获取该字节的最简单方法是使用Apache commons(IOUtils)。您的第二种方法直接从HTTP输入流解码位图。这也是可能的,但最好先下载并解码。此外,您无需在解码后压缩位图。只需使用它。bitmapFromByteArray.recycle();
。