0

我正在尝试从服务器下载图像并将其保存在 android 的内部存储中。如果我下载的图像小于 2 MB,它在所有情况下都运行良好。但是当我下载任何大小超过 2 MB 的 JPEG 图像时,我面临两个问题。

第一个是当我尝试使用模拟器从服务器下载和保存图像时,我收到一个错误,例如“位图大小超出 VM 预算”并且活动崩溃。

第二个问题是,当我在手机上运行应用程序时,这个问题不是他们的,而是另一个问题正在发生。当我显示下载的图像时,图像还包含一些其他颜色(彩虹色)。

这是我用来下载和保存图像的代码:

//For downloading the image file
    void downloadFile(String fileUrl)
    {
        URL myFileUrl = null;
        try {
            myFileUrl = new URL(fileUrl);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try 
        {
            HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bmImg = BitmapFactory.decodeStream(is);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //For saving the downloaded image 
    void saveImage() {
        try 
        {
            String fileName ="displayimg.png";
            final FileOutputStream fos = openFileOutput(fileName, Activation.MODE_PRIVATE);
            bmImg.compress(CompressFormat.PNG, 90, fos);

        } catch (Exception e) 
        {
            e.printStackTrace();
        }

    }

这是显示图像的代码:

private Bitmap myBitmap;
myBitmap= BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ivDisplayImage.setImageBitmap(myBitmap);
4

4 回答 4

3

您的代码存在一些问题,首先是您尝试使用 png 格式压缩图像,png 格式不压缩。你应该使用 jpeg。这将减少图像大小和质量。第二件事是下载图像并在图像视图中显示的一种非常有效的方法,这里是链接:有效地显示位图它也解释了您的第一个问题java.lang.OutofMemoryError:位图大小超出 VM 预算。 并且有一些不错的库,我建议您使用主题,例如

于 2013-03-19T08:40:10.597 回答
2

您必须使用ImageLoader 类来缩放您的位图并将其显示在 imageview 中。

还可以按照本教程从网络显示图像。

希望这对您有所帮助。

于 2013-03-19T08:36:23.030 回答
1

您可以使用通用图像加载器。https://github.com/nostra13/Android-Universal-Image-Loader。异步下载图像。您将图像缓存在内存或 SD 卡中。

您还可以查看延迟加载https://github.com/thest1/LazyList

不使用时也回收位图。

 bitmap.recycle();

要有效地加载 bitmpas,请参阅链接中的文档。 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

java.lang.OutofMemoryError: 位图大小超出 VM 预算意味着您有内存泄漏。 http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html

http://www.youtube.com/watch?v=_CruQY55HOk。演讲是关于内存管理和避免内存泄漏的。还解释了如何使用 MAT Analyzer 来查找内存泄漏。

压缩为 png 时位图颜色发生变化。检查可能与您的问题有关的答案。还要检查你的手机运行的是什么安卓版本。

压缩为 png 时位图颜色发生变化。检查此链接。

于 2013-03-19T08:44:49.097 回答
0

嘿,我建议你使用这个库: http: //loopj.com/android-async-http/

这是示例代码:

            AsyncHttpClient client = new AsyncHttpClient();
        String[] allowedContentTypes = new String[] { "image/jpeg" }; // here you need to type the mimetype of the file

        client.get("link to jpg or any image"),
                new BinaryHttpResponseHandler(allowedContentTypes) {
                    @Override
                    public void onSuccess(byte[] fileData) { 
                        // this means it downloaded succesfully and you could make a filoutputstream to sdcard 
                        FileOutputStream fos;
                        try {
                            fos = new FileOutputStream(Environment
                                    .getExternalStorageDirectory()
                                    + "/Images/test.jpg");

                            fos.write(fileData);
                            fos.close();
                            fos.flush();
                        } catch (FileNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } finally {
                        // here you could set it to an imageview or do anything you wouyld like

                        }
                    }
                });
    }

如果您有任何问题,请告诉我。

于 2013-03-19T08:32:11.273 回答