Android 从 url 加载时图像质量差

Android bad image quality when loading from url

我想从 url 加载图像并将其显示在图像视图中。 图像比图像视图大并且具有良好的分辨率。 但是视图中显示的图像非常模糊。如果我放大图像视图,图像不会那么模糊。所以我认为这是一个缩放问题。我想动态加载图像,所以我不会不下载它们。我在这里尝试了这个问题的几种解决方案:Bad image quality after resizing/scaling bitmap and also this one: How to scale an Image in ImageView to keep the aspect ratio 但没有任何效果。这是我的代码,用于将图像加载到视图中:

Bitmap bm1 = BitmapFactory.decodeStream(new URL(url).openConnection().getInputStream());

runOnUiThread(() -> {
    ((ImageView) findViewById(R.id.simImg1)).setImageBitmap(bm1);
 
});

这是图像视图

            <ImageView
                android:id="@+id/simImg1"
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:padding="5dp" />

这是图像的 url:https://www.ingolstadt.de/media/custom/3052_32_1_g.JPG

这是它的样子:Screenshot

提前致谢!

使用 Glide 而不是自己获取图像。它根据图像视图大小调整图像大小。

在你的build.gradle中添加它的依赖:

dependencies {
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}

并且在 java 代码中:

Glide.with(context)
    .load(url)
    .into(imageView);

不使用任何库使用此方法下载原始图像并显示它

 // DownloadImage AsyncTask
        private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
            }
    
            @Override
            protected Bitmap doInBackground(String... URL) {
    
                String imageURL = URL[0];
    
                Bitmap bitmap = null;
                try {
                    // Download Image from URL
                    InputStream input = new java.net.URL(imageURL).openStream();
                    // Decode Bitmap
                    bitmap = BitmapFactory.decodeStream(input);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return bitmap;
            }
    
            @Override
            protected void onPostExecute(Bitmap result) {
    
                    if (result != null) {
                        File destination = new File(getActivity().getCacheDir(),
                                "image" + ".jpg");
                        try {
                            destination.createNewFile();
                            ByteArrayOutputStream bos = new ByteArrayOutputStream();
                            result.compress(Bitmap.CompressFormat.PNG, 100 /*ignored for PNG*/, bos);
                            byte[] bitmapdata = bos.toByteArray();
    
                            FileOutputStream fos = new FileOutputStream(destination);
                            fos.write(bitmapdata);
                            fos.flush();
                            fos.close();
                            selectedFile = destination;
                            runOnUiThread(() -> {
    ((ImageView) findViewById(R.id.simImg1)).setImageBitmap(result);});
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

   }

如何使用?

new DownloadImage().execute("url_here);