【问题标题】:How to get particular cropping image using canvas circular image?如何使用画布圆形图像获取特定的裁剪图像?
【发布时间】:2016-12-12 19:45:44
【问题描述】:

我正在创建一个自定义的 ImageView,其中包含 Pinch IN-OUT 缩放和圆形裁剪图像。Pinch in-out 工作正常,但是当我尝试裁剪图像时,无法获得特定的圆形图像。我正在使用基于 onTuchListener 的 Pinch in-out 工作和基于 canvas 类的 Circular Cropping。

我已经使用下面提到的代码来进行捏合和圆形裁剪图像:

@Override
    protected void onDraw(Canvas canvas) {
        onDrawReady = true;
        imageRenderedAtLeastOnce = true;
        if (delayedZoomVariables != null) {
            setZoom(delayedZoomVariables.scale, delayedZoomVariables.focusX, delayedZoomVariables.focusY, delayedZoomVariables.scaleType);
            delayedZoomVariables = null;
        }
        super.onDraw(canvas);

        if (bitmap == null) {
            circleWindowFrame(); //Creating circle view
        }
        canvas.drawBitmap(bitmap, 0, 0, null);
    }

    protected void circleWindowFrame() {
        bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        Canvas osCanvas = new Canvas(bitmap);

        RectF outerRectangle = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(getResources().getColor(R.color.overlay));
        paint.setAlpha(99);
        osCanvas.drawRect(outerRectangle, paint);

        paint.setColor(Color.TRANSPARENT);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
        float centerX = getWidth() / 2;
        float centerY = getHeight() / 2;

        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        int width = metrics.widthPixels;
        float radius = width / 2;
        osCanvas.drawCircle(centerX, centerY, radius, paint);
    }

此裁剪代码:

public static Bitmap getCrop() {
        Bitmap circleBitmap;
        circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        Paint paint = new Paint();
        paint.setShader(shader);
        paint.setAntiAlias(true);
        Canvas c = new Canvas(circleBitmap);
        c.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
        return bitmap;
    }

感谢您的进步...

【问题讨论】:

标签: android imageview android-canvas


【解决方案1】:

试试这个

 public static Bitmap toOvalBitmap(@NonNull Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(output);

        int color = 0xff424242;
        Paint paint = new Paint();

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);

        RectF rect = new RectF(0, 0, width, height);
        canvas.drawOval(rect, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, 0, 0, paint);

        bitmap.recycle();

        return output;
    }

【讨论】:

  • 我需要裁剪选定的叠加圆形区域。 但您的示例正在裁剪完整图像。
  • 你使用我的方法而不是你的 getCrop() 方法吗?
  • 在你的问题中你说它没有正确裁剪,我所做的是一种裁剪方法,所以我认为它应该对你有用,因为你的方法正在裁剪图像的所需覆盖区域
  • github.com/ArthurHub/Android-Image-Cropper 去看看这个库虽然你必须改变一些参数才能得到想要的结果,但这肯定会帮助你。有耐心。
  • 兄弟,我添加了缩放功能。所以你的方法裁剪完整图像。但是我需要在放大和缩小后裁剪突出显示的区域图像。我知道 getCrop() 无法正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多