У меня есть два изображения RGB (формат ppm), и я хочу, чтобы иметь возможность накладывать любой пиксель, который не является чисто черным верхнего изображения на нижнем изображении.Как наложить одно изображение поверх другого? C++
Я могу успешно загрузить изображения, сохранить изображения, скопировать изображения ... но я не могу создать изображение из двух изображений в том виде, как я описал выше.
Я не собираюсь включать весь код у меня есть, но важные детали для достижения этой цели являются:
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, очевидно.
Вид проблем у меня есть следующие:
В методе наложения, если я оставлю это, если заявление, как описано выше, верхнее изображение будет отображаться в сохраненном файле. Если я сделаю это без!() Части, он отобразит нижнее изображение.
Если я избавлюсь от этого, если() заявление полностью, а просто попытаться изменить отдельные пиксели, например:
pixels[h][w].r = pixels[h][w].r - 50;
сохраненное изображение будет изменено, все дурацкие ищет, по понятным причинам.
Однако ... .b и .g не влияют на изображение.
У меня нет идей ... Я играю с этим в течение 2 дней, и я не могу понять, что случилось. Все работает по мере необходимости в моей программе, кроме этого метода наложения.
EDIT: Итак, я нашел одну из проблем в своем коде, и она вернулась к тому, как я загрузил изображения в формате PPM P6. Вместо того, чтобы индивидуально загружать каждый пиксель в 1 байт, я попытался загрузить их все вместе, поэтому он создал этот материал подушки, который происходит со структурами и двоичным чтением из уплотнения ... Теперь я могу наложить наложение верхнего изображения на отображается нижнее изображение, но не все цвета. Тем не менее, лучше, чем раньше.
Вот что я изменил вложенную для() цикл моего наложения выглядеть следующим образом:
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;
}
}
}
Очевидно, что по-прежнему требует работы.
Не должен ли ваш оператор 'bool Pixel :: == (const Pixel & other)' возвращать обратные значения? – Spook
@Spook Ха, ты прав. Я случайно оставил его, когда у меня это было как оператор! =. Я думаю, что я нашел источник своей проблемы ... после того, как не смог изменить значения .g и .b. Так я загрузил изображение, как-то это испортило его (в формате P6). Я могу наложить контур моего верхнего изображения на нижнее изображение. Итак, несколько хитростей и, возможно, все получится. –