获取图片中不规则形状的一部分

本文介绍了一种将原图与特定形状背景图进行融合的方法,通过调整图片的透明度实现精准裁剪效果。该方法适用于不同尺寸图片间的融合,能够保留原图颜色信息并根据背景图形状自动调整透明度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原图:


目标图:

目标图的效果是取得了原图中间部泡形状的部分。

获取方法:

首先,准备一张目标形状的背景图,这里我的背景图如下:

除黑色部分以外其余部分是透明的。

然后,就是代码了。

原理:先截取原图中响应位置的图片,然后取得背景图中各个像素的透明度,将该透明度赋值给截取后的图片,就ok了。


    public static Bitmap getBubbleImage(Bitmap src, Bitmap overlay) {
        //原图比背景图大时,截取得原图的中间部分;
        //原图比背景图小时,取整个原图;
        int width = src.getWidth();
        int height = src.getHeight();

        int w = overlay.getWidth();
        int h = overlay.getHeight();
        int offsetX = 0;
        int offsetY = 0;
        if (width > w) {
            offsetX = (width - w) / 2;
        }
        if (height > h) {
            offsetY = (height - h) / 2;
        }
        Matrix matrix = new Matrix();

        int newWidth = Math.min(w, width) - 2;
        int newHeight = Math.min(h, height) - 2;
        Bitmap bitmap = Bitmap.createBitmap(newWidth, newHeight,
                Bitmap.Config.ARGB_8888);
        Bitmap srcCopy = Bitmap.createBitmap(src, offsetX, offsetY, newWidth,
                newHeight, matrix, true);
        //获取背景图个像素的透明度值,赋值给截取后的图
        int pixColor = 0;
        int layColor = 0;
        int newColor = 0;

        int pixR = 0;
        int pixG = 0;
        int pixB = 0;
        int layA = 0;
        int[] srcPixels = new int[newWidth * newHeight];
        int[] overlayPixels = new int[newWidth * newHeight];
        int[] targetPixels = new int[newWidth * newHeight];

        srcCopy.getPixels(srcPixels, 0, newWidth, 0, 0, newWidth, newHeight);
        overlay.getPixels(overlayPixels, 0, newWidth, 0, 0, newWidth, newHeight);

        for (int i = 0; i < srcPixels.length; i++) {

            pixColor = srcPixels[i];
            layColor = overlayPixels[i];

            pixR = Color.red(pixColor);
            pixG = Color.green(pixColor);
            pixB = Color.blue(pixColor);
            layA = Color.alpha(layColor);

            newColor = Color.argb(layA, pixR, pixG, pixB);
            targetPixels[i] = newColor;
        }
        bitmap.setPixels(targetPixels, 0, newWidth, 0, 0, newWidth, newHeight);

        return bitmap;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值