美文网首页
Android 实现图片加水印或logo

Android 实现图片加水印或logo

作者: qiuxintai | 来源:发表于2020-06-02 17:17 被阅读0次

我们常常会遇到为图像加水印或logo的需求,一般可以通过三方库或者软件实现,但其实加水印非常简单,仅用一个函数即可实现。
实现思路,逐一计算水印和原图重叠部分的像素点的RGBA分量:
  float percent = watermarkA / 255.0f
  dstR = srcR * (1 - percent) + watermarkR * percent;
  dstG = srcG * (1 - percent) + watermarkG * percent;
  dstB = srcB * (1 - percent) + watermarkB * percent;
  dstA = srcA * (1 - percent) + watermarkA * percent;

JNI实现:

extern "C" JNIEXPORT void JNICALL
Java_com_qxt_watermark_WatermarkUtils_add(JNIEnv *env, jclass clazz, jbyteArray src, jint srcWidth,
                   jint srcHeight, jbyteArray watermark, jint watermarkWidth, jint watermarkHeight,
                   jint x, jint y) {
    uint8_t *_src = (uint8_t *) env->GetByteArrayElements(src, nullptr);
    uint8_t *_watermark = (uint8_t *) env->GetByteArrayElements(watermark, nullptr);

    int positionX;
    if (x < 0) {
        positionX = 0;
    } else if (x > srcWidth - watermarkWidth) {
        positionX = srcWidth - watermarkWidth;
    } else {
        positionX = x;
    }
    int positionY;
    if (y < 0) {
        positionY = 0;
    } else if (y > srcHeight - watermarkHeight) {
        positionY = srcHeight - watermarkHeight;
    } else {
        positionY = y;
    }

    for (int h = 0; h < watermarkHeight; h++) {
        for (int w = 0; w < watermarkWidth; w++) {
            /*int srcPosition = ((srcHeight - watermarkHeight + y) * srcWidth
                               + srcWidth - watermarkWidth + x) * 4;*/
            int srcPosition = ((positionY + h) * srcWidth
                               + positionX + w) * 4;
            int position = (h * watermarkWidth + w) * 4;

            float watermarkAlpha = _watermark[position + 3] / 255.0f;
            float dstR = _src[srcPosition] * (1.0f - watermarkAlpha)
                         + _watermark[position] * watermarkAlpha;
            _src[srcPosition] = (uint8_t) dstR;
            float dstG = _src[srcPosition + 1] * (1.0f - watermarkAlpha)
                         + _watermark[position + 1] * watermarkAlpha;
            _src[srcPosition + 1] = (uint8_t) dstG;
            float dstB = _src[srcPosition + 2] * (1.0f - watermarkAlpha)
                         + _watermark[position + 2] * watermarkAlpha;
            _src[srcPosition + 2] = (uint8_t) dstB;
            float dstA = _src[srcPosition + 3] * (1.0f - watermarkAlpha)
                         + _watermark[position + 3] * watermarkAlpha;
            _src[srcPosition + 3] = (uint8_t) dstA;
        }
    }
    env->ReleaseByteArrayElements(watermark, (jbyte *) _watermark, JNI_ABORT);
    env->ReleaseByteArrayElements(src, (jbyte *) _src, 0);
}

java函数及参数说明:

    /**
     *
     * @param image, src image byte array
     * @param imageWidth, src image width
     * @param imageHeight, src image height
     * @param watermark, watermark image byte array
     * @param watermarkWidth, watermark image width
     * @param watermarkHeight, watermark image height
     * @param x, watermark coordinate x,  x >= 0 && x <= imageWidth - watermarkWidth
     * @param y, watermark coordinate y,  y >= 0 && y <= imageHeight - watermarkHeight
     */
    public static native void add(byte[] image, int imageWidth, int imageHeight,
                                  byte[] watermark, int watermarkWidth, int watermarkHeight,
                                  int x, int y);

可以通过x, y坐标控制水印或者logo图片的位置,最终实现效果:


watermark.png

以上仅是一个demo,在实际项目中,我们可以结合人脸检测,用类似的方法轻松地实现在相机的预览帧中加个兔子耳朵、络腮胡子之类的效果。
最后,本文demo代码已上传至github:https://github.com/qiuxintai/Watermark

相关文章

  • Android 实现图片加水印或logo

    我们常常会遇到为图像加水印或logo的需求,一般可以通过三方库或者软件实现,但其实加水印非常简单,仅用一个函数即可...

  • 图片加数字水印

    数字水印介绍 常见的图片水印多是在图片上附上文字、logo等信息,可以直观地看出来,除了这种水印外,好可以给图片加...

  • ios绘图实列

    1> 水印PPT简介 * 图片水印作用:防止他人盗取图片,加一些Logo,生成一张新的图片。 * 怎么生成新的图片...

  • 图片添加二维码水印教程

    本博客介绍一下用jdk awt实现图片加文字水印和图片水印的方法 一、图片文字水印 原来图片 加上文字水印后图片 ...

  • 添加图片水印

    图片水印 水印:在图片上加的防止他人盗图的半透明logo、文字、图标 作用:主要是一些网站为了版权问题、广告而添加...

  • 15-Quartz2D演练

    图片水印 图片水印就是在图片的基础上绘制一些文字或logo,最终生成一张新的图片 在viewDidLoad方法中生...

  • Tensorflow 迁移学习 识别中国军网、中国军视网Logo

    Tensorflow 目标检测项目 图片logo水印识别。识别中国军网、中国军视网Logo水印。 Step 0 下...

  • 图片加水印

    加文字水印 图片水印 给字体加颜色

  • 利用ImageMagick给图片加水印

    利用ImageMagick给图片加水印 水印可能是文字,也可能是网站的logo等。图片水印比较简单,就是把自己水印...

  • 沟通事情,先问清楚对方要什么

    同事托我帮她设计一下图片的水印,说是要给微信图片加一个好看的水印,之前有设计过这个活动的logo,然后PS去除了l...

网友评论

      本文标题:Android 实现图片加水印或logo

      本文链接:https://www.haomeiwen.com/subject/qzefzhtx.html