如何从android中不同形状的位图剪切圆圈

时间:2015-03-23 22:39:00

标签: java android bitmap

如何从android中的不同形状的位图剪切圆圈。

我尝试了这段代码,但有些图片被拉伸了:

    public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
    int targetWidth = 240;
    int targetHeight = 200;
    Bitmap targetBitmap = Bitmap.createBitmap(targetWidth,
            targetHeight,Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(targetBitmap);
    Path path = new Path();
    path.addCircle(((float) targetWidth - 1) / 2,
            ((float) targetHeight - 1) / 2,
            (Math.min(((float) targetWidth),
                    ((float) targetHeight)) / 2),
            Path.Direction.CCW);

    canvas.clipPath(path);
    Bitmap sourceBitmap = scaleBitmapImage;
    canvas.drawBitmap(sourceBitmap,new Rect(0, 0, sourceBitmap.getWidth(),
                    sourceBitmap.getHeight()),
            new Rect(0, 0, targetWidth, targetHeight), null);
    return targetBitmap;
}

2 个答案:

答案 0 :(得分:1)

如果要剪切图像,则需要找到图像居中的最大正方形。考虑到这一点,以下行修复了您的拉伸问题:

Bitmap bitmap = ThumbnailUtils.extractThumbnail(bitmap, radius, radius, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

此方法创建目标位图的圆形切口:

private Bitmap getCircularBitmap(int radius, Bitmap bitmap) {
    Bitmap.Config conf = Bitmap.Config.ARGB_8888;
    Bitmap bmp = Bitmap.createBitmap(radius, radius, conf);
    Canvas canvas = new Canvas(bmp);

    // creates a centered bitmap of the desired size
    bitmap = ThumbnailUtils.extractThumbnail(bitmap, radius, radius, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
    BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    Paint paint = new Paint();
    paint.setAntiAlias(true);

    paint.setShader(shader);
    RectF rect = new RectF(0, 0, radius, radius);
    canvas.drawRoundRect(rect, radius, radius, paint);

    return bmp;
}

答案 1 :(得分:0)

一种方法是使用BitmapShader

我们的想法是使用带有Paint的{​​{1}}来使用位图绘制纹理。然后你只需在画布上画一个圆圈。

以下是使用BitmapShader的一个很好的例子。在此示例中,绘制了一个带圆角的矩形,但它可以很容易地成为圆形。

Android Recipe #1, image with rounded corners