下载图像:图像质量影响

时间:2011-11-18 08:37:56

标签: android image download

当我从网上下载图片并将其保存到我的应用中的SD卡时,我使用以下方法:

private void saveImageToSDcard() throws IOException {
        File sdImageMainDirectory = new File(
                Environment.getExternalStorageDirectory(), getResources()
                        .getString(R.string.directory));
        if (!sdImageMainDirectory.exists()) {
            sdImageMainDirectory.mkdirs();
        }

        for (int i = 0; i < jArray.length(); i++) {
            reviewImageLink = url[i];

            urlimage = new URL(reviewImageLink);
            input = urlimage.openStream();

            try {
                output = new FileOutputStream(
                        Environment.getExternalStorageDirectory()
                                + "/Downloads/" + "photo" + i + ".jpg");
                try {
                    byte[] buffer = new byte[2];
                    int bytesRead = 0;
                    while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
                        output.write(buffer, 0, buffer.length);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {

                    output.close();

                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {

                input.close();

            }
        }

    }

当我尝试将SD卡中的图像带入我的应用程序时,图像会保存到SD卡,有时图像看起来很模糊。这不会一直发生,但是当它发生时,部分图像非常不清楚。什么可能导致这种情况?

重要:我使用以下缓冲区从url读取输入流:

byte[] buffer = new byte[2];

我注意到如果我增加它的大小,那么保存到SD卡的图像就会模糊不清。

4 个答案:

答案 0 :(得分:1)

你应该只写你读的字节数,其余的缓冲区是零或垃圾。使用几K的缓冲区(例如,2048或4096),并将您的写入呼叫更改为:

output.write(buffer, 0, bytesRead);

答案 1 :(得分:1)

按如下方式更改while循环:

while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
    output.write(buffer, 0, bytesRead);
}

因为read可能无法读取与缓冲区大小相同的字节数。也使用更大的缓冲区大小(如100 * 1024),这不应影响图像质量,但它应该提高性能。

修改
关于模糊图像,您是否在任何地方调整图像大小?这会导致模糊。

答案 2 :(得分:1)

我对初学者的Android开发相当新,但我已经尝试了一段时间,在我的代码中我设置了位图选项,然后获取位图,这似乎对我有用,也许这会有所帮助您。像这样:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inScaled = false;
opt.inSampleSize = 1;                   
opt.inDither = true;

//Use inPreferQualityOverSpeed option with 2.3.3+
if (android.os.Build.VERSION.SDK_INT >= 10) 
        opt.inPreferQualityOverSpeed = true;

然后我用它从数组索引中获取我的位图并告诉它使用选项:

mBitmap = BitmapFactory.decodeResource(getResources(), mImageIds[image_index], opt);

使用此代码和这些位图选项似乎可以为我想要写入外部存储的图像提供最佳图像质量。

答案 3 :(得分:0)

在创建Bitmap时查看代码,并将其与app中的视图一起使用。这里改变其大小等属性会影响质量。