如何告诉BitmapFactory.decodeStream给我一个完整质量的图像?

时间:2013-02-15 08:16:13

标签: android android-imageview android-image

所以我在AsyncTask中有以下代码。 AsyncTask接收图像文件的网址,将其下载到位图中,将位图保存到某个位置的磁盘,然后在现有ImageView中显示位图。

这是我对AsyncTask的doInBackground()调用的实现:

    protected Bitmap doInBackground(String... urls) {
        try {
            URL image_url = new URL(urls[0]);
            String image_url_prefix_regex = "http://www\\.somewebsite\\.com";
            if (externalStorageIsAvailable()) {
                String file_path = getExternalFilesDir(null).getPath() + image_url.toString().replaceAll(image_url_prefix_regex, "");
                File target_file = new File(file_path);
                if (!target_file.getParentFile().exists()) {
                    target_file.getParentFile().mkdirs();
                }

                BitmapFactory.Options bitmap_options = new BitmapFactory.Options();
                bitmap_options.inScaled = false;
                bitmap_options.inDither = false;
                bitmap_options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                bitmap_options.inPreferQualityOverSpeed = true;
                bitmap_options.inSampleSize = 1;

                Bitmap image = BitmapFactory.decodeStream(image_url.openStream(), null, bitmap_options);
                image.compress(CompressFormat.JPEG, 100, new FileOutputStream(target_file));
                return image;
            }
        }
        catch (MalformedURLException e) {
            Log.v(DEBUG_TAG, "Error: Caught MalformedURLException");
        }
        catch (IOException e) {
            Log.v(DEBUG_TAG, "Error: Caught IOException");
        }
        return null;
    }

然后在onPostExecute()电话中,我有这个:

    protected void onPostExecute(Bitmap image) {
        ImageView mImageView = (ImageView) findViewById(R.id.main_image);
        mImageView.setImageBitmap(image);
    }

然而,当代码下载并显示图像时,图像的尺寸和质量会降低。如何制作以使得到的图像质量完好?那些BitmapFactory。选项设置是我迄今为止尝试过的内容,但它们似乎没有用。

请注意,我并未询问保存到外部存储的图像。我认为由于再次压缩会导致质量较差,但这不应该影响我发送到ImageView的图像,这就是我要问的问题。 。当然,如果这些假设出现任何问题,请指出。

1 个答案:

答案 0 :(得分:-1)

为什么在解码位图Stream时使用Bitmap工厂选项? 只需使用

即可
 Bitmap image = BitmapFactory.decodeStream(image_url.openStream());

而不是

Bitmap image = BitmapFactory.decodeStream(image_url.openStream(), null, bitmap_options);