Search code examples
androiddrawingborderandroid-canvas

How to add border to bitmap image content instead of its background by using Canvas?


The feature of a bitmap image is that it has a transparent background and usually has a rectangular shape, so when we try to add a border to the image, instead of its content inside there will be a border, its background will have a border. For example, I have a bitmap image of a dog and I want it to have a border but instead, a rectangular background will have a border. I'm using Canvas to draw a bitmap and am having this problem. Can anyone help me?

Block code to create photo

  mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(10); // set stroke width
    mPaint.setColor(getResources().getColor(R.color.black)); // set stroke color
    mPaint.setAntiAlias(true);
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icons8_bus_36_2);
    tempBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas tempCanvas = new Canvas(tempBitmap);
    Rect rect = new Rect(
            10 / 2,
            10 / 2,
            tempCanvas.getWidth() - 10 / 2,
            tempCanvas.getHeight() - 10 / 2);
    tempCanvas.drawRect(rect,mPaint);
    tempCanvas.drawBitmap(bitmap, 0, 0, mPaint);

Solution

  • On this part:

    Rect rect = new Rect(
                10 / 2,
                10 / 2,
                tempCanvas.getWidth() - 10 / 2,
                tempCanvas.getHeight() - 10 / 2);
    

    change to

    Rect rect = new Rect(
                10 / 2,
                10 / 2,
                (tempCanvas.getWidth() - 10) / 2,
                (tempCanvas.getHeight() - 10) / 2);
    

    Thats because 10 is divided by two first

    Also, draw bitmap first before you draw rect

    OR

    you could draw with this:

    Path clipPath = new Path();
    RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
    clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW);
    canvas.clipPath(clipPath);