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);
我想从 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);