我正在尝试将服务器中的jpg文件显示到imageView中。当我尝试加载较小的图像(300x400)时,没有问题。但是当我尝试加载全尺寸图片(2336x3504)时,图像将无法加载。图像的文件大小仅为2mb。我没有在logcat中得到任何错误,也没有抛出异常。它根本不会加载图像。我也试过用这个:
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);
这对于加载大文件没有任何帮助,但它会调整较小的图像(就像它假设的那样)。我确实将大图添加到我的资源并测试它,就像它嵌入在应用程序中一样,它工作正常,只是无法在服务器上工作。我一整天都在工作,似乎无法弄清楚如何加载这些大图片。任何人都可以帮我解决这个问题吗?谢谢你的任何信息。
Here是我找到上述代码的链接,并且一直在玩其他示例,但仍然没有让它工作。
修改
以下是我正在使用的代码,用于加载图片:
public static Bitmap getBitmapFromURL(String src) {
Bitmap bmImg;
URL myFileUrl = null;
try {
myFileUrl = new URL(src);
HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 16;
bmImg = BitmapFactory.decodeStream(is, null, options);
return bmImg;
} catch (Exception e) {
// TODO Auto-generated catch block
Log.d("Error", e.toString());
return null;
}
}
这是logcat截图(无法弄清楚如何在eclipse中正确复制文本)我在点击按钮加载图像之前清除了日志。所以你看到的就是当我点击那个按钮时会发生什么。我删除了公司和应用程序名称(你看到“com。”,假设它的“com.mycompany.myapp”。
答案 0 :(得分:8)
BitmapFactory.decodeFromStream()
放弃并在将其直接连接到远程连接的null
时返回InputStream
的情况并不少见。在内部,如果你没有为方法提供BufferedInputStream
,它会将提供的流包装在一个缓冲区大小为16384的流中。有时可行的一个选项是传递带有更大缓冲区的BufferedInputStream
大小如:
BufferedInputStream bis = new BufferedInputStream(is, 32 * 1024);
更普遍有效的方法是首先完全下载文件,然后像这样解码数据:
InputStream is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is, 8190);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte)current);
}
byte[] imageData = baf.toByteArray();
BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
仅供参考,本例中的缓冲区大小有些随意。正如在其他答案中所说的那样,不要将图像在内存中保留的时间长于你所需要的,这是一个奇妙的想法。您可以考虑将其直接写入文件并显示缩减采样版本。
希望有所帮助!
答案 1 :(得分:2)
Devunwired的回答是正确的但是如果图像尺寸太大会导致内存不足,在这种情况下我们将不得不缩小图像,这是在DevunWired的下载图像代码之后缩小图像的代码
final BitmapFactory.Options options = new BitmapFactory.Options();
BufferedInputStream bis = new BufferedInputStream(is, 4*1024);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte)current);
}
byte[] imageData = baf.toByteArray();
BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options);
options.inJustDecodeBounds = true;
options.inSampleSize = 2; //calculateInSampleSize(options, 128, 128);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options);
答案 2 :(得分:0)
它是静默失败,还是抛出异常或OutOfMemory错误?顺便说一句,如果一个jpeg是2MB,这并不意味着它将占用2MB的内存。 2MB是压缩大小,由于Android正在使用Bitmap,因此2336 x 3504将占用大约2336 x 3504 x 4字节的内存。 (2336 x 3504 x 4 = 32,741,376)。下采样8次仍然可能还不够,尤其是当时内存中还有其他位图。