Java 如何保持从url下载到imageview的图像的质量并将其裁剪成圆形?
我在“Android Universal image loader”库的帮助下使用了以下代码,但是图像质量很差,我的logcat中有太多跳过的帧, 这是我的代码,请查看并帮助我如何改进它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
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);