gpt4 book ai didi

c++ - 如何将一张图片叠加在另一张图片上? C++

转载 作者:行者123 更新时间:2023-11-28 07:36:35 25 4
gpt4 key购买 nike

我有两个 RGB 图像(ppm 格式),我希望能够将顶部图像的任何非纯黑色像素叠加到底部图像上。

我可以成功加载图像、保存图像、复制图像...但我无法按照上述方式从两张图像中创建图像。

我不会包含我拥有的所有代码,但实现这一目标的重要部分是:

struct Pixel
{
unsigned int r;
unsigned int g;
unsigned int b;
}

我重载了它的 == 运算符以便于比较:

bool Pixel::operator==(const Pixel& other)
{
if(r != other.r)
{
return true;
}
else if(g != other.g)
{
return true;
}
else if(b != other.b)
{
return true;
}
else
{
return false;
}
}

在我的 Pic 类中我有这个方法:

Pic Pic::overlay(const Pic& top, Pixel mask)
{
for(int h = 0; h < height; h++)
{
for(int w = 0; w < width; w++)
{
if(!(top.pixels[h][w] == mask))
{
pixels[h][w] = top.pixels[h][w]; // pixels[][] is a Pixel array
}
}
}

return *this;
}

我的主文件有这个:

Pic top;
Pic bot;
Pic overlay;

Pixel mask:
mask.r = 0;
mask.g = 0;
mask.b = 0;

top.loadimage("top.ppm"); //loadimage() loads the image in and all the data
bot.loadimage("bot.ppm"); //samme thing

overlay = bot.overlay(bot, mask);
overlay.saveimage("overlay.ppm");

显然,Pic 类的 = 运算符重载了。

我遇到的问题是:

在覆盖方法中,如果我像上面描述的那样留下这个if语句,顶部图像将显示在保存的文件中。如果我没有 !() 部分,它将显示底部图像。

如果我完全摆脱那个 if() 语句,而只是尝试改变单个像素,例如:

pixels[h][w].r = pixels[h][w].r - 50;

由于显而易见的原因,保存的图像将被更改,看起来很古怪。

但是....b 和 .g 对图像没有影响。

我没主意了……我已经玩了 2 天了,但我不知道出了什么问题。在我的程序中,一切都按需要工作,除了这个覆盖方法。

编辑: 因此,我发现我的代码中存在一个问题,它可以追溯到我如何加载 PPM P6 格式的图像。我没有将每个像素单独加载为 1 个字节,而是尝试将它们全部加载在一起,因此它创建了结构发生的缓冲内容和从压缩中读取的二进制文件......现在我可以将顶部图像的叠加层放在底部图像,但并非所有颜色都显示。尽管如此,还是比以前好。

这是我修改覆盖层的嵌套 for() 循环的内容:

for(int h = 0; h < height; h++)
{
for(int w = 0; w < width; w++)
{
if(top.pixels[h][w].r != mask.r &&
top.pixels[h][w].g != mask.g &&
top.pixels[h][w].b != mask.b )
{
pixels[h][w].r = top.pixels[h][w].r;
pixels[h][w].g = top.pixels[h][w].g;
pixels[h][w].b = top.pixels[h][w].b;
}

}
}

显然它仍然需要工作。

最佳答案

这一行看起来不对:

overlay = bot.overlay(bot, mask);

不应该是:

overlay = bot.overlay(top, mask);

如果你想要一种更短的方式来编写你的相等性测试,那么你可能会喜欢这样:

bool Pixel::operator==(const Pixel& other)
{
return (r==other.r && g==other.g && b==other.b);
}

最后,既然你有一个相等运算符,那么为什么不做添加和赋值('=')来让你的编码器尽可能地整洁

关于c++ - 如何将一张图片叠加在另一张图片上? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16684012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com