傳入圖片,按比例縮放拼接圖片

最近由於項目需求,需要傳入一個圖片,然後再將圖片進行比例裁剪或者放大,然後實現拼接處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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章