問題
- 在項目中從存儲設備中讀取出的低像素Bitmap(圓形頭像,在實現圓形切割的時候出現邊緣模糊的情況,在嘗試普通的圓形頭像實現方法的過程中,發現平時使用的圓形頭像方法並不生效,覺得可能是因爲畫布拉伸,所以在拉伸的畫布上面進行繪製Circle的時候得到的也是低像素的圓形
- 下面是平時使用的畫原型頭像的方法:
public class Demo01Activity extends AppCompatActivity {
private ImageView demo01;
private ImageView demo02;
private ImageView demo03;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo01);
demo01 = (ImageView)findViewById(R.id.demo01);
demo02 = (ImageView)findViewById(R.id.demo02);
demo03 = (ImageView)findViewById(R.id.demo03);
Bitmap bitmapsrc = BitmapFactory.decodeResource(getResources(), R.drawable.niuniu);
Bitmap bitmapres1 = createRoundPhoto1(bitmapsrc);
demo01.setImageBitmap(bitmapres1);
Bitmap bitmapres2 = createRoundPhoto2(bitmapsrc);
demo02.setImageBitmap(bitmapres2);
Bitmap bitmapres3 = createRoundPhoto3(bitmapsrc);
demo03.setImageBitmap(bitmapres3);
}
private Bitmap createRoundPhoto1(Bitmap bitmap){
int width = bitmap.getWidth();
Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap circleBitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(circleBitmap);
canvas.drawCircle(width / 2, width / 2, width / 2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, 0, 0, paint);
return circleBitmap;
}
private Bitmap createRoundPhoto2(Bitmap bitmap){
int width = bitmap.getWidth();
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap circleBitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(circleBitmap);
paint.setShader(bitmapShader);
canvas.drawCircle(width/2, width/2, width/2, paint);
return circleBitmap;
}
private Bitmap createRoundPhoto3(Bitmap bitmap){
int width = bitmap.getWidth();
Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap circleBitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(circleBitmap);
Path path = new Path();
path.addCircle(width/2, width/2, width/2, Path.Direction.CW);
canvas.clipPath(path);
canvas.drawBitmap(bitmap, 0, 0, paint);
return circleBitmap;
}
}
解決
- 因爲是畫布可能會出現拉伸的情況,所以我想出的解決方案是,先將Bittmap放大,然後在放大後的Bitmap上進行畫圓,之後,再將整張畫布縮放回原來的大小,最後發現,雖然Bitmap原來是低像素,但是經過上述操作後,Bitmap的像素可能會更低,但是邊緣達到了想要的效果—圓滑
private Bitmap createRoundScalePhoto(Bitmap bitmap, int imageViewSize){
if(bitmap == null){
return null;
}
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
Log.d("WJX", size + " ");
Bitmap output = Bitmap.createBitmap(imageViewSize, imageViewSize, Bitmap.Config.ARGB_8888);
float scaleNum = 0;
if(size != 0) {
scaleNum = imageViewSize / size;
}
float scaleNumReciprocal = size / imageViewSize;
Paint paint = new Paint();
paint.setAntiAlias(true);
BitmapShader bitmapShader = new BitmapShader(bitmap , Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Matrix matrix = new Matrix();
matrix.setScale(scaleNum, scaleNum);
bitmapShader.setLocalMatrix(matrix);
paint.setShader(bitmapShader);
Canvas canvas = new Canvas(output);
canvas.drawCircle(imageViewSize / 2.0f, imageViewSize / 2.0f, imageViewSize / 2.0f, paint);
canvas.scale(scaleNumReciprocal, scaleNumReciprocal, imageViewSize / 2/0f, imageViewSize / 2.0f);
bitmap.recycle();
return output;
}
- 實現效果: