Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保持从url下载到imageview的图像的质量并将其裁剪成圆形?_Java_Android_Bitmap_Android Imageview - Fatal编程技术网

Java 如何保持从url下载到imageview的图像的质量并将其裁剪成圆形?

Java 如何保持从url下载到imageview的图像的质量并将其裁剪成圆形?,java,android,bitmap,android-imageview,Java,Android,Bitmap,Android Imageview,我在“Android Universal image loader”库的帮助下使用了以下代码,但是图像质量很差,我的logcat中有太多跳过的帧, 这是我的代码,请查看并帮助我如何改进它 private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { ImageView bmImage; public DownloadImageTask(ImageView bmIma

我在“Android Universal image loader”库的帮助下使用了以下代码,但是图像质量很差,我的logcat中有太多跳过的帧, 这是我的代码,请查看并帮助我如何改进它

private class DownloadImageTask extends AsyncTask<String, Void,
        Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        //  Bitmap mIcon11 = null;
        ImageLoader imageLoader = ImageLoader.getInstance();
        Bitmap bitmap = imageLoader.loadImageSync(urldisplay);


        Bitmap circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                Bitmap.Config.ARGB_8888);

        BitmapShader shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        Paint paint = new Paint();
        paint.setShader(shader);

        Canvas c = new Canvas(circleBitmap);
        c.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);

        //img1.setImageBitmap(circleBitmap);
        //bmImage.setImageBitmap(circleBitmap);
        return circleBitmap;

    }

    protected void onPostExecute(Bitmap result) {


        bmImage.setImageBitmap(result);
    }
}
私有类下载ImageTask扩展异步任务{
图像视图bmImage;
公共下载ImageTask(ImageView bmImage){
this.bmImage=bmImage;
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
//位图mIcon11=null;
ImageLoader ImageLoader=ImageLoader.getInstance();
位图位图=imageLoader.loadImageSync(urldisplay);
Bitmap circleBitmap=Bitmap.createBitmap(Bitmap.getWidth()、Bitmap.getHeight(),
位图.Config.ARGB_8888);
BitmapShader着色器=新的BitmapShader(位图,TileMode.CLAMP,TileMode.CLAMP);
油漆=新油漆();
画图。设置阴影(着色器);
画布c=新画布(圆形位图);
c、 drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,bitmap.getWidth()/2,paint);
//img1.setImageBitmap(circleBitmap);
//bmImage.setImageBitmap(circleBitmap);
返回圈位图;
}
受保护的void onPostExecute(位图结果){
bmImage.setImageBitmap(结果);
}
}
试着这样做:

Picasso.with(context).load("url").transform(new CircleTransform()).into(target);

毕加索和凌空对图像很有帮助,我使用凌空,并创建了一个扩展NetworkImageView的类,在那里我裁剪图像并使其圆化

public class RoundedNetworkImageView extends NetworkImageView {

    private Bitmap frame;

    public RoundedNetworkImageView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public RoundedNetworkImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // frame = BitmapFactory.decodeResource(context.getResources(), R.drawable.chat_list_profile_frame);
    }

    public RoundedNetworkImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // frame = BitmapFactory.decodeResource(context.getResources(), R.drawable.chat_list_profile_frame);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // super.onDraw(canvas);

        Drawable drawable = getDrawable();

        if (drawable == null) {
            return;
        }

        if (getWidth() == 0 || getHeight() == 0) {
            return;
        }
        Bitmap b = ((BitmapDrawable) drawable).getBitmap();
        if (b != null) {
            Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

            int w = getWidth(), h = getHeight();

            Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
            canvas.drawBitmap(roundBitmap, 0, 0, null);
            // canvas.drawBitmap(frame, 0, 0, null);
        }
    }

    public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
        Bitmap sbmp;
        if (bmp.getWidth() != radius || bmp.getHeight() != radius)
            sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
        else
            sbmp = bmp;
        Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xffa19774;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());

        paint.setAntiAlias(true);
        paint.setFilterBitmap(true);
        paint.setDither(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(Color.parseColor("#FFFFFF"));
        canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f, sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(sbmp, rect, rect, paint);

        return output;
    }

}
//---------当我公开使用它的时候 //声明

public RoundedNetworkImageView user_status_pic;
//从列表适配器中的url获取图像

viewHolder.user_status_pic.setImageUrl(image_url, imageLoader);

添加示例代码和参考,而不仅仅是简单的文字。答案现在已更新,从未想过这是不可理解的。这是为了避免您的答案被标记为“非答案”或“低质量答案”。您的图像大小是多少?我正在从推特api加载图像,用户档案图片,所以我不知道确切的尺寸,所以尺寸不是很大。我建议你看看下面的帖子谢谢:),它帮我完成了任务
viewHolder.user_status_pic.setImageUrl(image_url, imageLoader);