Java 在Android上下载一个巨大的图像(6144x32768)

Java 在Android上下载一个巨大的图像(6144x32768),java,android,image,download,android-download-manager,Java,Android,Image,Download,Android Download Manager,我们正在尝试将一个应用程序下载到android上,以便在应用程序中查看。我们可以很好地加载它,但由于内存问题,无法下载它。图像是9MB,但是分辨率太大了,我想这是安卓如何读取图像的问题 尝试: 直接写信给SD 毕加索 OpenStream URL url = new URL(link); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); con

我们正在尝试将一个应用程序下载到android上,以便在应用程序中查看。我们可以很好地加载它,但由于内存问题,无法下载它。图像是9MB,但是分辨率太大了,我想这是安卓如何读取图像的问题

尝试: 直接写信给SD 毕加索 OpenStream

URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
错误是:

Java.lang.OutOfMemoryError: Failed to allocate a 805306380 byte allocation with 8329762 free bytes and 180MB until OOM

然而,我们需要实际下载图像

6k×32k的图像在完全加载时需要大约800MB的内存,因为ARGB位图每像素需要4个字节

当你通过USB复制它时,它工作的原因很可能是因为Android将巨大的图像转码到适合手机显示的大小,然后用MTP复制

您可以使用降采样(位图.Options.inSampleSize参数)或
BitMapRegionCoder
来降采样或显示图像的部分区域

另一个选项是一个库,例如,它可以为您处理所有这些,例如使用以下代码:

SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);
imageView.setImage(ImageSource.uri("http://training-slides.com/slides-image/slide-one.jpeg"));

在图像视图中加载图像后,您可以使用“收缩”缩放和触摸平移在图像周围导航。

那么您的问题是什么?无法下载图像?难道你不知道如何显示图像块吗?我们在从服务器下载图像并解码时遇到了内存不足的问题。我们使用的是BitmapFactory.DecodeStream,你能发布相关代码吗?这可能会有所帮助:这是主代码,它对较小的图像效果很好,但它看起来的读取方式会导致它变得更大(我相信),所以我们非常希望找到一个解决方案,即我们正在使用的库,尝试了您的代码后,我们得到:未能初始化位图解码器11-06 03:39:55.592 19690-21365/com.training\u slides.www.slides E/SubsamplingScaleImageView:java.io.FileNotFoundException:无内容提供商:是的,它看起来无法直接从HTTP URI加载图像。尝试先将该文件从HTTP源复制到临时文件,然后将该文件的路径提供给SubsamplingScaleImageView。