Android 在图像视图中获取模糊图像

Android 在图像视图中获取模糊图像,android,image,imageview,blur,stretched,Android,Image,Imageview,Blur,Stretched,我从服务器上获取图像,图像很大,我在我的应用程序中以缩略图的方式显示它们,但图像看起来像是压缩和模糊的。 我使用惰性列表方法下载它们 我使用Gallery并创建了自定义阵列适配器来显示图像 这是画廊项目的XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_wi

我从服务器上获取图像,图像很大,我在我的应用程序中以缩略图的方式显示它们,但图像看起来像是压缩和模糊的。 我使用惰性列表方法下载它们

我使用Gallery并创建了自定义阵列适配器来显示图像

这是画廊项目的XML

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:background="@drawable/galimagebg"
    android:gravity="center_vertical|center_horizontal"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/ivGal"
        android:layout_width="250dp"
        android:layout_height="200dp"
        android:layout_margin="10dp"
         />

</LinearLayout>

惰性列表视图代码(正在执行此工作的类)

package-imageutil;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.Collections;
导入java.util.Map;
导入java.util.Stack;
导入java.util.WeakHashMap;
导入android.app.Activity;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.drawable.BitmapDrawable;
导入android.graphics.drawable.drawable;
导入android.widget.ImageView;
公共类图像加载器{
MemoryCache MemoryCache=新的MemoryCache();
文件缓存文件缓存;
private Map ImageView=Collections.synchronizedMap(新的WeakHashMap());
活动;
公共图像加载器(活动){
//将后台设为低优先级。这样不会影响UI性能
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
fileCache=新的fileCache(活动);
这个。活动=活动;
}
最终int存根_id=R.可拉伸.加载;
public void DisplayImage(字符串url、活动活动、图像视图)
{
put(imageView,url);
位图位图=memoryCache.get(url);
if(位图!=null)
{
//设置图像位图(位图);
Drawable Drawable=新的位图Drawable(位图);
//imageView.setBackgroundDrawable(可拉伸);
imageView.setImageDrawable(可绘制);
//imageView.setScaleType(ScaleType.CENTER);
}
其他的
{
队列照片(url、活动、图像视图);
setImageResource(存根id);
}    
}
私有void queuePhoto(字符串url、活动活动、ImageView ImageView)
{
//此ImageView以前可能用于其他图像。因此队列中可能有一些旧任务。我们需要丢弃它们。
Photosque.Clean(imageView);
PhotoToLoad p=新的PhotoToLoad(url,imageView);
已同步(PhotoQueue.photosToLoad){
photoqueue.photoload.push(p);
photoqueue.phototoload.notifyAll();
}
//如果尚未启动,则启动线程
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}
私有位图getBitmap(字符串url)
{
文件f=fileCache.getFile(url);
//从SD缓存
位图b=解码文件(f);
如果(b!=null)
返回b;
//从网络
试一试{
位图=空;
URL imageUrl=新URL(URL);
HttpURLConnection conn=(HttpURLConnection)imageUrl.openConnection();
连接设置连接超时(30000);
连接设置读取超时(30000);
InputStream is=conn.getInputStream();
OutputStream os=新文件OutputStream(f);
Utils.CopyStream(is,os);
os.close();
位图=解码文件(f);
返回位图;
}捕获(例外情况除外){
例如printStackTrace();
返回null;
}
}
//对图像进行解码和缩放以减少内存消耗
私有位图解码文件(文件f){
试一试{
//解码图像大小
BitmapFactory.Options o=新的BitmapFactory.Options();
o、 inJustDecodeBounds=true;
解码流(新的FileInputStream(f),null,o);
//找到正确的刻度值。它应该是2的幂。
所需的最终int_尺寸=70;
内部宽度=o.向外宽度,高度=o.向外高度;
int标度=1;
while(true){

如果(width_tmp/2将其固定,则将所需的_size变量的大小从70更改为200,然后它就工作了


Cheers

修复了它,将所需大小变量的大小从70更改为200,然后它就工作了


干杯

听起来你的问题在于你下采样太多了:

final int REQUIRED_SIZE=70;

这意味着您需要70px宽的图像,但这应该根据您的设备进行调整。您将250 dp设置为ImageView的目标大小,您应该使用相同的值来计算图像的大小。

听起来您的问题在于您的下采样太多:

final int REQUIRED_SIZE=70;

这意味着您需要70px宽的图像,但这应该根据您的设备进行调整。您将250 dp设置为ImageView的目标大小,您应该使用相同的值来计算图像的大小。

我认为您有两点错误:

  • final int REQUIRED\u SIZE=70;
    您需要使用库项目的实际宽度
  • 您的比例计算算法错误:
    宽度\u tmp/=2;
    不要将宽度除以2

  • 尝试使用文章中的方法
    calculateInSampleSize()

    我认为您有两点是错误的:

  • final int REQUIRED\u SIZE=70;
    您需要使用库项目的实际宽度
  • 您的比例计算算法错误:
    宽度\u tmp/=2;
    不要将宽度除以2

  • 尝试使用文章中的方法
    calculateInSampleSize()

    在decodeFile函数中传递所需的大小,您可以获得更清晰的图像

    private Bitmap decodeFile(File f,int size){
        try {
            //decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);
    
            //Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE=size;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }
    
            //decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {}
        return null;
    }
    
    私有位图解码文件(文件f,int size){
    试一试{
    //解码图像大小
    BitmapFactory.Options o=新的BitmapFactory.Options();
    o、 inJustDecodeBounds=true;
    解码流(新的FileInputStream(f),null,o);
    //F