水印图片上C点的水印功能
Watermark function in C dots on watermark picture
图片上的水印看起来不像图片,只是混合点背景就可以了,如何让它起作用?
像 yuv 数组这样的背景图片(在 ImgBlend 中复制),像 yuv 矩阵这样的水印图像,结果图像,两张图片的宽度和高度,坐标 x 和 y 我应该在哪里放置水印和 alpha transparency.ImgBlend是结果图,WIimage是水印图,heightw i widthw是水印图的尺寸。
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;
}
}
没有关于 ImgBlend 和 WImage 的更多信息,我无法给您肯定的答案,但是,这似乎很可能是扫描线的问题。位图由扫描线上的像素组成。扫描线向上舍入到最近的字边界。因此下一个扫描线不必在前一个扫描线的最后一个像素之后开始。最多可以有 3 个未使用的字节。
scanlinesize= (((nPixels*bpp) + 31) / 32 * 4);
bpp= 每像素位数。
以下是解决方法。我无法 运行 它,但它应该可以工作。这不是微不足道的。我希望它能帮助你。如果是家庭作业(你 link 到 .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;
}
}
}
图片上的水印看起来不像图片,只是混合点背景就可以了,如何让它起作用?
像 yuv 数组这样的背景图片(在 ImgBlend 中复制),像 yuv 矩阵这样的水印图像,结果图像,两张图片的宽度和高度,坐标 x 和 y 我应该在哪里放置水印和 alpha transparency.ImgBlend是结果图,WIimage是水印图,heightw i widthw是水印图的尺寸。
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;
}
}
没有关于 ImgBlend 和 WImage 的更多信息,我无法给您肯定的答案,但是,这似乎很可能是扫描线的问题。位图由扫描线上的像素组成。扫描线向上舍入到最近的字边界。因此下一个扫描线不必在前一个扫描线的最后一个像素之后开始。最多可以有 3 个未使用的字节。
scanlinesize= (((nPixels*bpp) + 31) / 32 * 4);
bpp= 每像素位数。
以下是解决方法。我无法 运行 它,但它应该可以工作。这不是微不足道的。我希望它能帮助你。如果是家庭作业(你 link 到 .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;
}
}
}