低像素Bitmap圓形頭像實現邊緣銳化

問題

  • 在項目中從存儲設備中讀取出的低像素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;
}

  • 實現效果:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章