【问题标题】:Watermark function in C dots on watermark picture水印图片C点中的水印功能
【发布时间】:2015-06-06 17:53:36
【问题描述】:

图片上的水印看起来不像图片,只是混点背景可以,如何让它工作?

背景图片如 yuv 数组(复制在 ImgBlend 中),水印图像如 yuv 矩阵,生成的图像,两个图片的宽度和高度,坐标 x 和 y 我应该在哪里放置水印和用于 alpha 透明度的 a。ImgBlend 是生成的图像, WIimage为watermarkimage,heightw i widthw为watermark图片的尺寸。

   for (unsigned int j = 0 ; j < heightw ; ++j)
     {

       for (unsigned int i = 0 ; i < ( widthw * 3); ){    

          ImgBlend [y + j] [3 * x + i ] = (1-a) * ImgBlend [y + j][3 * x+i] + a * WImage [j] [i];

          ImgBlend [y + j] [3 * x + i + 1 ] = 0x80; 

          ImgBlend [y + j] [3 * x + i + 2 ] =0x80;
           i + = 3;
        }        
    }    

【问题讨论】:

  • 很高兴您发布了代码。但问题本身缺乏格式,很难阅读。请添加空格,用重音标记格式化文本中的代码,并在一个句子中提出问题。这是一本关于提出好问题的手册:stackoverflow.com/help/how-to-ask

标签: c image watermark yuv


【解决方案1】:

如果没有有关 ImgBlend 和 WImage 的其他信息,我无法给您一个肯定的答案,但是,这似乎很可能是扫描线的问题。位图由扫描线上的像素组成。扫描线四舍五入到最近的单词边界。因此,下一个扫描线不必在前一个扫描线的最后一个像素之后开始。最多可以有 3 个未使用的字节。

scanlinesize= (((nPixels*bpp) + 31) / 32 * 4);

bpp= 每像素位数。

以下是一个解决方案。我无法运行它,但它应该可以工作。这不是微不足道的。我希望它对你有帮助。如果是家庭作业(你链接到 .edu),那么诚实地告诉你的教授你得到了帮助。

#define BPP 3    // means bytes-per-pixel (not bits)

void watermark(
        unsigned char *ImgBlend, int wimg,  int himg,   // image to blend onto
        unsigned char *Wimage,   int wmark, int hmark,  // image to blend
        int x, int y,                                   // position to blend onto
        int a                                           // alpha blending factor
    )
{
    int wi, hi;

    unsigned int scanlinesizeImgBlend= (((wimg *BPP*8) + 31) / 32 * 4);  // assumed from your code to be 3 BPP
    unsigned int scanlinesizeWimage  = (((wmark* 1 *8) + 31) / 32 * 4);  // assumed from your code to be 1 BPP

    unsigned char *scanlineImgBlend= ImgBlend + y*scanlinesizeImgBlend;  // first scanline to blend onto
    unsigned char *scanlineWimage  = Wimage;                             // first scanline to blend

    for (hi=0; hi<hmark && (hi+y)<himg; hi++,
            scanlineImgBlend += scanlinesizeImgBlend,
            scanlineWimage   += scanlinesizeWimage)
    {
        unsigned char *pixImgBlend= scanlineImgBlend + x*BPP;            // xpos to start blending
        unsigned char *pixWimage  = scanlineWimage;

        for (wi=0; wi<wmark && (wi+x)<wimg; wi++)
        {
            *pixImgBlend = (1-a) * *pixImgBlend + a * *pixWimage; pixImgBlend++; pixWimage++;
            *pixImgBlend++ = 0x80;
            *pixImgBlend++ = 0x80;
        }
    }
}

【讨论】:

  • Nitpick:扫描线垫专门用于 BMP 图像,而不是“一般的任何位图”。尽管如此,还是不​​错的,因为在帖子中很难找到背景信息的 sn-p,它解释了“混合点或其他东西”部分。
  • 我应该怎么做才能让它发挥作用?我无法上传输出图片,因为我是新来的。背景图片是 link 但保存在 512x512 。 bmp
  • @kristina-vakarov,你试过这个解决方案了吗?
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多