<Excerpt in index | 首页摘要>
Android 图片加水印
<The rest of contents | 余下全文>
项目APP社交类应用,属于富图应用,自然少不了图片下载了~
为了保护连载主的版权信息,在图片下载之后自然需要给图片增加水印图片了。
按理来说,这样的水印应该都是在后台来处理了。
不巧的是我们图片用的是七牛图片处理。我们自己的后台没有图片的备份,包括上传也是没有经过后台的。
七牛自己也带了图片水印的添加,但是我们需要对下载的图片进行一个简单的缩放,而七牛并不支持同时调用两种图片处理
而且我们水印是图片+文字,七牛水印对文字+图片混合水印的支持也不够美好。
最后大任还是交给了我们前端。
简单说下水印的添加方式,也比较简单,就是把图片读到内存中,然后创建画布,在上面画上原图+水印信息就好了。
直接看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
public static File Watermark(File file){ Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); canvas.drawBitmap(bitmap, 0, 0, null);
Bitmap watermarkImg = getWatermarkImg(newBitmap.getWidth() > newBitmap.getHeight() ? newBitmap.getHeight() : newBitmap.getWidth()); Paint paint = new Paint(); canvas.drawBitmap(watermarkImg, margin , (newBitmap.getHeight() - watermarkImg.getHeight() - margin), paint);
paint.setColor(Color.rgb(0xff, 0xff, 0xff)); paint.setTextSize(watermarkImg.getHeight() / 4); canvas.drawText("要添加的水印文字", margin * 2 + watermarkImg.getWidth(), newBitmap.getHeight() - (watermarkImg.getHeight() / 2) - margin, paint);
canvas.save(Canvas.ALL_SAVE_FLAG); try { file.delete(); FileOutputStream fos = new FileOutputStream(file); newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (Exception e) {
} return file; }
private static Bitmap getWatermarkImg(int width) {
Bitmap imgWatermark = null; try { imgWatermark = BitmapFactory.decodeStream( MyApp.getInstance().getAssets().open("shuiyin.png"));
Matrix matrix = new Matrix(); float scale = width * 1.0f / 7 / imgWatermark.getWidth(); matrix.postScale(scale, scale , imgWatermark.getWidth() * 1.0f / 2, imgWatermark.getHeight() * 1.0f / 2); imgWatermark = Bitmap.createBitmap(imgWatermark, 0, 0, imgWatermark.getWidth(), imgWatermark.getHeight() , matrix, true); } catch (IOException e) { imgWatermark = null; e.printStackTrace(); }
return imgWatermark; }
|
最后,图片添加水印是属于耗时操作,务必在新开的子线程中去操作!!!