I have an image with frames and I need to add a watermark effect. How might I do this?
6 Answers
I found great tutorial on Android Image Processing here.
public static Bitmap mark(Bitmap src, String watermark, Point location, Color color, int alpha, int size, boolean underline) {
int w = src.getWidth();
int h = src.getHeight();
Bitmap result = Bitmap.createBitmap(w, h, src.getConfig());
Canvas canvas = new Canvas(result);
canvas.drawBitmap(src, 0, 0, null);
Paint paint = new Paint();
paint.setColor(color);
paint.setAlpha(alpha);
paint.setTextSize(size);
paint.setAntiAlias(true);
paint.setUnderlineText(underline);
canvas.drawText(watermark, location.x, location.y, paint);
return result;
}
Thanks to Pete Houston who shares such useful tutorial on basic image processing.
- 1,940
- 3
- 17
- 24
- 637
- 4
- 10
-
Can i call this method inside another function where image is specified? – info May 22 '12 at 06:37
-
1You can call it in another function.For example - Bitmap result = mark(src, watermark, location, color, alpha, size, underline); – AndroidLearner May 22 '12 at 07:12
-
1The param Color color should be int color, the method paint.setColor() is waiting for argument int. If you have a better idea, please share it with us. – technik Feb 16 '17 at 17:05
-
Hi, it is not working. I using it on an image view inside a fragment – Faris Muhammed Apr 17 '18 at 18:46
-
After i captured image I'm saving it on storage by converting it into bitmap. So, When i used the above code to write water mark on that bitmap image before saving. It is not working. Can you give more details – Oct 03 '20 at 03:41
For others reference, if you want to add the logo of your application (which is in your drawable folder(s)) on top of image use following method:
private Bitmap addWaterMark(Bitmap src) {
int w = src.getWidth();
int h = src.getHeight();
Bitmap result = Bitmap.createBitmap(w, h, src.getConfig());
Canvas canvas = new Canvas(result);
canvas.drawBitmap(src, 0, 0, null);
Bitmap waterMark = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.logo);
canvas.drawBitmap(waterMark, 0, 0, null);
return result;
}
- 49,622
- 70
- 212
- 354
-
1
-
1I'm not getting anything on image. It is just getting saved without watermark. Any help ! – Oct 03 '20 at 03:47
-
Comments aren't answered, why is that? Are you guy OK? I am also not getting anything above the image. – Maseed Mar 23 '22 at 14:09
If someone is still searching for this, I found a good solution here
It adds a watermark to the bottom right portion and scales it according to the source image which was exactly what I was looking for.
/**
* Embeds an image watermark over a source image to produce
* a watermarked one.
* @param source The source image where watermark should be placed
* @param watermark Watermark image to place
* @param ratio A float value < 1 to give the ratio of watermark's height to image's height,
* try changing this from 0.20 to 0.60 to obtain right results
*/
public static Bitmap addWatermark(Bitmap source, Bitmap watermark, float ratio) {
Canvas canvas;
Paint paint;
Bitmap bmp;
Matrix matrix;
RectF r;
int width, height;
float scale;
width = source.getWidth();
height = source.getHeight();
// Create the new bitmap
bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG);
// Copy the original bitmap into the new one
canvas = new Canvas(bmp);
canvas.drawBitmap(source, 0, 0, paint);
// Scale the watermark to be approximately to the ratio given of the source image height
scale = (float) (((float) height * ratio) / (float) watermark.getHeight());
// Create the matrix
matrix = new Matrix();
matrix.postScale(scale, scale);
// Determine the post-scaled size of the watermark
r = new RectF(0, 0, watermark.getWidth(), watermark.getHeight());
matrix.mapRect(r);
// Move the watermark to the bottom right corner
matrix.postTranslate(width - r.width(), height - r.height());
// Draw the watermark
canvas.drawBitmap(watermark, matrix, paint);
return bmp;
}
And it is well commented which is what is a huge plus!
- 1,874
- 1
- 12
- 23
It seems you are looking for a waterrippleeffect as this one. Checkout the complete source code. Also check the screenshot how does the effect look like.
- 66,608
- 21
- 157
- 241
You can use androidWM to add a watermark into your image, even with invisible watermarks:
add dependence:
dependencies {
...
implementation 'com.huangyz0918:androidwm:0.2.3'
...
}
and java code:
WatermarkText watermarkText = new WatermarkText(“Hello World”)
.setPositionX(0.5)
.setPositionY(0.5)
.setTextAlpha(100)
.setTextColor(Color.WHITE)
.setTextFont(R.font.champagne)
.setTextShadow(0.1f, 5, 5, Color.BLUE);
WatermarkBuilder.create(this, backgroundBitmap)
.loadWatermarkText(watermarkText)
.getWatermark()
.setToImageView(backgroundView);
You can easily add an image type watermark or a text watermark like this, and the library size is smaller than 30Kb.
- 3
- 2
-
don't post a link of a tool as an answer, specially if you wrote it, you need to disclose affiliation, else it's spam – Jean-François Fabre Mar 23 '19 at 17:33
use framelayout. put two imageviews inside the framelayout and specify the position of the watermark imageview.
- 384
- 2
- 11
-
Watermark means that second image will be a part from the first image, then can be used like sharing the first image with water mark. Framelayout just just present two pictures, but doesn't change them – صلي علي محمد Atef Farouk Jun 06 '20 at 08:05