近期項(xiàng)目中有給上傳的圖片添加水印功能,如下圖所示

圖片添加水印.jpg
水印圖片如下

add.png
項(xiàng)目中用到的是的水印覆蓋到全部圖片的效果,對(duì)水印圖片進(jìn)行尺寸壓縮,壓縮成和上傳圖片一樣的大小。如果需要添加的是固定大小的水印,則不必壓縮。
public class WaterImageTools {
static int compressH;
static int compressW;
public static String createWaterMaskImage(Context context, String filePath) {
calcuateCompressSize(filePath);
//將要上傳的圖片轉(zhuǎn)化為bitmap并壓縮
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
final Bitmap comBit = Bitmap.createScaledBitmap(bitmap, compressW, compressH, true);
//將水印壓縮成和上傳圖片一樣大小
Bitmap watermark = BitmapFactory.decodeResource(context.getResources(), R.mipmap.water);
final Bitmap comWatermark = Bitmap.createScaledBitmap(watermark, compressW, compressH, true);
if (comBit == null) {
return null;
}
int w = comBit.getWidth();
int h = comBit.getHeight();
final Bitmap newb = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);// 創(chuàng)建一個(gè)新的和SRC長度寬度一樣的位圖
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Canvas cv = new Canvas(newb);
cv.drawBitmap(comBit, 0, 0, null);// 在 0,0坐標(biāo)開始畫入src
cv.drawBitmap(comWatermark, 0, 0, null);// 在0,0坐標(biāo)畫入水印,可根據(jù)需求自行設(shè)置
cv.save(Canvas.ALL_SAVE_FLAG);// 保存
cv.restore();// 存儲(chǔ)
}
});
thread.start();
//將添加水印的bitmap轉(zhuǎn)化為file并獲取文件路徑
return saveMyBitmap(newb).getAbsolutePath();
}
public static File saveMyBitmap(Bitmap mBitmap) {
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File file = null;
try {
file = File.createTempFile(
UploadAccess.generateFileName(), /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
FileOutputStream out = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 20, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
//計(jì)算圖片壓縮尺寸,按寬高比進(jìn)行壓縮
private static void calcuateCompressSize(String filePath) {
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
float h = bitmap.getHeight();
float w = bitmap.getWidth();
float expactH = 1920;
float expactW = 1080;
float ratioH;
float ratioW;
if (h < expactH && w < expactW){
compressH = (int) h;
compressW = (int) w;
}else {
ratioH = h/expactH;
ratioW = w/expactW;
if (ratioH > ratioW){
compressH = (int) expactH;
compressW = (int) (w / ratioH);
}else {
compressW = (int) expactW;
compressH = (int) (h / ratioW);
}
}
}
}