与在android中下载图像有关的问题

时间:2013-03-19 08:23:29

标签: android bitmap

我正在尝试从服务器下载图像并将其保存在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 个答案:

答案 0 :(得分:3)

您的代码存在一些问题,首先是您尝试使用png格式压缩图像,png格式不要压缩。你应该使用jpeg。这将减少图像尺寸和质量。第二件事是有一种非常有效的方式来下载图像并在imageview中显示,这里是链接:Displaying Bitmaps Efficiently它还解释了你的第一个问题 java.lang.OutofMemoryError:位图大小超过VM预算。  并且有一些好的库我建议你使用像

这样的主题

答案 1 :(得分:2)

您必须使用ImageLoader class缩放位图并在imageview中显示它。

另请关注this tutorial以获取来自网络的显示图片。

希望这会对你有所帮助。

答案 2 :(得分:1)

您可以使用Universal Image Loader。 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查找内存泄漏。

Bitmap color change while compressing to png。检查可能与您的问题相关的答案。还要检查手机正在运行的Android版本。

Bitmap color change while compressing to png。点击此链接。

答案 3 :(得分: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

                        }
                    }
                });
    }

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