20

I have an image with frames and I need to add a watermark effect. How might I do this?

Michael Petrotta
  • 58,479
  • 27
  • 141
  • 176
info
  • 2,102
  • 5
  • 22
  • 38

6 Answers6

39

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.

Mohsen
  • 1,940
  • 3
  • 17
  • 24
AndroidLearner
  • 637
  • 4
  • 10
  • Can i call this method inside another function where image is specified? – info May 22 '12 at 06:37
  • 1
    You 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
  • 1
    The 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
20

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;
    }
Hesam
  • 49,622
  • 70
  • 212
  • 354
  • 1
    i´m getting null from the waterMark Bitmap, why would that be? – Andrey Sep 15 '16 at 19:21
  • 1
    I'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
14

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!

Irshad P I
  • 1,874
  • 1
  • 12
  • 23
4

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.

Lalit Poptani
  • 66,608
  • 21
  • 157
  • 241
0

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.

-5

use framelayout. put two imageviews inside the framelayout and specify the position of the watermark imageview.

SathishBabu S
  • 384
  • 2
  • 11