圖片合成工具類(BitmapMergeUtils)
package com.reader.xdkk.ydq.app.util;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
/**
* 作者: GJP on 2018/8/22 09:27
* 郵箱: xiaoxiao9575@126.com
* 部落格: https://blog.csdn.net/weixin_40998254
* 描述: 圖片合成工具類
*/
public class BitmapMergeUtils {
/**
* 把兩個點陣圖覆蓋合成為一個點陣圖,以底層點陣圖的長寬為基準
* @param backBitmap 在底部的點陣圖
* @param backWidth 底部點陣圖得寬度
* @param backHeight 底部點陣圖得高度
* @param frontBitmap 蓋在上面的點陣圖
* @param frontLeft 頂部點陣圖橫向起點
* @param frontTop 頂部點陣圖縱向起點
* @param frontWidth 頂部點陣圖寬度
* @param frontHeight 頂部點陣圖高度
* @return
*/
public static Bitmap mergeBitmap(Bitmap backBitmap, int backWidth, int backHeight, Bitmap frontBitmap, int frontLeft, int frontTop, int frontWidth, int frontHeight) {
if (backBitmap == null || backBitmap.isRecycled()
|| frontBitmap == null || frontBitmap.isRecycled()) {
return null;
}
// 調整背景圖片到指定得寬高
int width = backBitmap.getWidth();
int height = backBitmap.getHeight();
if (width != backWidth || height != backHeight){
// 計算縮放比例.
float scaleWidth = ((float) backWidth) / width;
float scaleHeight = ((float) backHeight) / height;
// 取得想要縮放的matrix引數.
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的圖片.
backBitmap = Bitmap.createBitmap(backBitmap, 0, 0, width, height, matrix, true);
}
Bitmap bitmap = backBitmap.copy(Config.RGB_565, true);
//繪製前景圖片到指定位置
Canvas canvas = new Canvas(bitmap);
Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
Rect drawRect = new Rect(frontLeft, frontTop, frontLeft+frontWidth, frontTop+frontHeight);
canvas.drawBitmap(frontBitmap, frontRect, drawRect, null);
return bitmap;
}
/**
* 把兩個點陣圖覆蓋合成為一個點陣圖,左右拼接
* @param leftBitmap
* @param rightBitmap
* @param isBaseMax 是否以寬度大的點陣圖為準,true則小圖等比拉伸,false則大圖等比壓縮
* @return
*/
public static Bitmap mergeBitmap_LR(Bitmap leftBitmap, Bitmap rightBitmap, boolean isBaseMax) {
if (leftBitmap == null || leftBitmap.isRecycled()
|| rightBitmap == null || rightBitmap.isRecycled()) {
return null;
}
int height = 0; // 拼接後的高度,按照引數取大或取小
if (isBaseMax) {
height = leftBitmap.getHeight() > rightBitmap.getHeight() ? leftBitmap.getHeight() : rightBitmap.getHeight();
} else {
height = leftBitmap.getHeight() < rightBitmap.getHeight() ? leftBitmap.getHeight() : rightBitmap.getHeight();
}
// 縮放之後的bitmap
Bitmap tempBitmapL = leftBitmap;
Bitmap tempBitmapR = rightBitmap;
if (leftBitmap.getHeight() != height) {
tempBitmapL = Bitmap.createScaledBitmap(leftBitmap, (int)(leftBitmap.getWidth()*1f/leftBitmap.getHeight()*height), height, false);
} else if (rightBitmap.getHeight() != height) {
tempBitmapR = Bitmap.createScaledBitmap(rightBitmap, (int)(rightBitmap.getWidth()*1f/rightBitmap.getHeight()*height), height, false);
}
// 拼接後的寬度
int width = tempBitmapL.getWidth() + tempBitmapR.getWidth();
// 定義輸出的bitmap
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
// 縮放後兩個bitmap需要繪製的引數
Rect leftRect = new Rect(0, 0, tempBitmapL.getWidth(), tempBitmapL.getHeight());
Rect rightRect = new Rect(0, 0, tempBitmapR.getWidth(), tempBitmapR.getHeight());
// 右邊圖需要繪製的位置,往右邊偏移左邊圖的寬度,高度是相同的
Rect rightRectT = new Rect(tempBitmapL.getWidth(), 0, width, height);
canvas.drawBitmap(tempBitmapL, leftRect, leftRect, null);
canvas.drawBitmap(tempBitmapR, rightRect, rightRectT, null);
return bitmap;
}
/**
* 把兩個點陣圖覆蓋合成為一個點陣圖,上下拼接
* @param topBitmap
* @param bottomBitmap
* @param isBaseMax 是否以高度大的點陣圖為準,true則小圖等比拉伸,false則大圖等比壓縮
* @return
*/
public static Bitmap mergeBitmap_TB(Bitmap topBitmap, Bitmap bottomBitmap, boolean isBaseMax) {
if (topBitmap == null || topBitmap.isRecycled()
|| bottomBitmap == null || bottomBitmap.isRecycled()) {
return null;
}
int width = 0;
if (isBaseMax) {
width = topBitmap.getWidth() > bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
} else {
width = topBitmap.getWidth() < bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
}
Bitmap tempBitmapT = topBitmap;
Bitmap tempBitmapB = bottomBitmap;
if (topBitmap.getWidth() != width) {
tempBitmapT = Bitmap.createScaledBitmap(topBitmap, width, (int)(topBitmap.getHeight()*1f/topBitmap.getWidth()*width), false);
} else if (bottomBitmap.getWidth() != width) {
tempBitmapB = Bitmap.createScaledBitmap(bottomBitmap, width, (int)(bottomBitmap.getHeight()*1f/bottomBitmap.getWidth()*width), false);
}
int height = tempBitmapT.getHeight() + tempBitmapB.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
Rect topRect = new Rect(0, 0, tempBitmapT.getWidth(), tempBitmapT.getHeight());
Rect bottomRect = new Rect(0, 0, tempBitmapB.getWidth(), tempBitmapB.getHeight());
Rect bottomRectT = new Rect(0, tempBitmapT.getHeight(), width, height);
canvas.drawBitmap(tempBitmapT, topRect, topRect, null);
canvas.drawBitmap(tempBitmapB, bottomRect, bottomRectT, null);
return bitmap;
}
}
相關文章
- 圖片切割工具類
- PHP 圖片、文字合成PHP
- golang 合成的圖片Golang
- ImageCombiner - Java服務端圖片合成工具,好用!Java服務端
- ImageUtils-圖片相關工具類
- PHP 圖片合成(2合1)PHP
- PhotosBlender for Mac(圖片合成軟體)Mac
- PaddlePaddle : AI摳圖及圖片合成AI
- Mac上圖片合成軟體哪個好?Mac
- JavaScript中的圖片處理與合成(四)JavaScript
- canvas實現二維碼和圖片合成Canvas
- JavaScript中的圖片處理與合成(一)JavaScript
- JavaScript中的圖片處理與合成(二)JavaScript
- 獲取本地圖片或拍照,進行頭像圖片的上傳的工具類地圖
- (iphone/ipad)關於圖片合成的範例iPhoneiPad
- iOS開發者必備:六大圖片、圖示處理類工具iOS
- Android 開源圖片裁剪工具、圖片顯示工具分享Android
- ios-UI高階 GCD佇列組合成圖片iOSUIGC佇列
- 合成圖片的兩種方法,思路都是一樣的
- PHP上傳圖片類PHP
- java 圖片水印處理類Java
- 一對一原始碼,java 圖片之間相互巢狀,合成原始碼Java巢狀
- 圖片摳圖線上工具推薦
- SmallImage for Mac(圖片壓縮工具)Mac
- 極簡圖片編輯工具
- Scotch for Mac圖片處理工具Mac
- ApolloOne for mac(圖片瀏覽工具)Mac
- Mac圖片批量處理工具Mac
- Android 圖片預覽工具Android
- Swift 3 圖片瀏覽工具Swift
- 圖片優化的那些工具優化
- 圖片編輯工具:FotoJet Photo Editor更好的處理圖片
- 開源圖片工具箱(Img Toolbox) 格式轉換 新增水印 圖片壓縮 圖片裁剪 圖片旋轉 圖片縮放
- 分享一個圖片處理類
- CNN-簡單圖片分類CNN
- Photoshop類圖片處理軟體
- 圖片文字識別工具怎樣進行批次識別圖片?
- iOS圖片瀏覽器 - XLPhotoBrowser(類似微信多圖片瀏覽效果)iOS瀏覽器