传入图片,按比例缩放拼接图片

最近由于项目需求,需要传入一个图片,然后再将图片进行比例裁剪或者放大,然后实现拼接处1080*1920+1080*1920 => 2160*1920的图片的横竖状态的两种图片。
这里写图片描述

这里写图片描述
基本上需求就是这样。
下面是实现的代码:

private Bitmap splitJoinPic(Bitmap originBitmap) {
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            return splitJoinPicLandscape(originBitmap);
        } else {
            return splitJoinPicPortrait(originBitmap);
        }
    }

    private final int SCREEN_WIDTH_SINGLE_LANDSCAPE = 1920;
    private final int SCREEN_WIDTH_SINGLE_POTRAIT = 1080;
    private final int SCREEN_WIDTH_DUAL_LANDSCAPE = 2160;
    private final int SCREEN_WIDTH_DUAL_POTRAIT = 1920;
    private final int SCREEN_HEIGHT_SINGLE_LANDSCAPE = 1080;
    private final int SCREEN_HEIGHT_SINGLE_POTRAIT = 1920;
    private final int SCREEN_HEIGHT_DUAL_LANDSCAPE = 1920;
    private final int SCREEN_HEIGHT_DUAL_POTRAIT = 2160;

    private Bitmap splitJoinPicLandscape(Bitmap originBitmap) {
        Bitmap bitmapOriginal = clipWallpaper(originBitmap, SCREEN_WIDTH_SINGLE_POTRAIT, SCREEN_HEIGHT_SINGLE_POTRAIT);
        Bitmap combineBitmap = Bitmap.createBitmap(SCREEN_WIDTH_DUAL_LANDSCAPE, SCREEN_HEIGHT_DUAL_LANDSCAPE, Bitmap.Config.ARGB_4444);
        Canvas canvas = new Canvas(combineBitmap);
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLACK);
        canvas.drawBitmap(bitmapOriginal, 0, 0, null);
        canvas.drawRect(SCREEN_WIDTH_SINGLE_POTRAIT, 0, SCREEN_WIDTH_DUAL_LANDSCAPE, SCREEN_HEIGHT_DUAL_LANDSCAPE, paint);
        return combineBitmap;
    }

    private Bitmap splitJoinPicPortrait(Bitmap originBitmap) {
        Bitmap bitmapOriginal = clipWallpaper(originBitmap, SCREEN_WIDTH_SINGLE_LANDSCAPE, SCREEN_HEIGHT_SINGLE_LANDSCAPE);
        Bitmap combineBitmap = Bitmap.createBitmap(SCREEN_WIDTH_DUAL_POTRAIT, SCREEN_HEIGHT_DUAL_POTRAIT, Bitmap.Config.ARGB_4444);
        Canvas canvas = new Canvas(combineBitmap);
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLACK);
        canvas.drawBitmap(bitmapOriginal, 0, 0, null);
        canvas.drawRect(0, SCREEN_HEIGHT_SINGLE_LANDSCAPE, SCREEN_WIDTH_DUAL_POTRAIT, SCREEN_HEIGHT_DUAL_POTRAIT, paint);
        return combineBitmap;

    }

    private Bitmap clipWallpaper(Bitmap bitmap, int targetWidth, int targetHeight) {
        if (bitmap == null) {
            return null;
        }
        int bitmapWidth = bitmap.getWidth();
        int bitmapHeight = bitmap.getHeight();
        float scaleOfWidth = (float) targetWidth / (float) bitmapWidth;
        float scaleOfHeight = (float) targetHeight / (float) bitmapHeight;
        float scaleMax = scaleOfWidth > scaleOfHeight ? scaleOfWidth : scaleOfHeight;
        int scaleWidth = (int) (scaleMax * bitmapWidth);
        int scaleHeight = (int) (scaleMax * bitmapHeight);
        Bitmap tmpBitmap = Bitmap.createScaledBitmap(bitmap, scaleWidth, scaleHeight, false);
        Bitmap result = Bitmap.createBitmap(tmpBitmap, (int) ((scaleWidth - targetWidth) / 2f), (int) ((scaleHeight - targetHeight) / 2f), targetWidth, targetHeight);
        if (result != null) {
            if (bitmap != result) {
                bitmap.recycle();
            }
            if (tmpBitmap != result) {
                tmpBitmap.recycle();
            }
        }
        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Python和OpenCV拼接多张带角度的图片时,可以按照以下步骤进行操作: 首先,导入OpenCV库和NumPy库,确保安装了这两个库。 接下来,读取多张图片,可以使用OpenCV的cv2.imread()函数,将图片路径作为参数传入,读取图片并储存在变量中。 然后,使用OpenCV的cv2.resize()函数,将所有的图片统一调整为相同的大小,以便进行拼接。可以选择将目标图片的大小作为参数传入,也可以指定一个统一的大小。 接下来,对于所有的图片,例如可以先选择其中一张作为基准图像,然后将其他图片与基准图像进行角度旋转的拼接。可以使用OpenCV的cv2.warpAffine()函数,传入待旋转的图片、旋转矩阵和目标大小作为参数。旋转矩阵可以使用OpenCV的cv2.getRotationMatrix2D()函数,将旋转中心、旋转角度和缩放因子作为参数传入。 最后,将拼接后的图片保存为新的图片文件,可以使用OpenCV的cv2.imwrite()函数,传入保存路径和拼接后的图片作为参数进行保存。 需要注意的是,拼接的结果可能受到图片的尺寸、角度差异等因素的影响,因此在实际操作中可能需要进行一些调整,例如调整拼接顺序、调整旋转中心、调整旋转角度等。 总结起来,通过读取和调整多张带角度的图片大小,然后进行角度旋转并拼接,最后保存拼接后的图片,就可以实现Python和OpenCV拼接多张带角度图片的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值