2013-05-22 2 views
0

У меня есть два изображения 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; 
     } 

    } 
} 

Очевидно, что по-прежнему требует работы.

+3

Не должен ли ваш оператор 'bool Pixel :: == (const Pixel & other)' возвращать обратные значения? – Spook

+0

@Spook Ха, ты прав. Я случайно оставил его, когда у меня это было как оператор! =. Я думаю, что я нашел источник своей проблемы ... после того, как не смог изменить значения .g и .b. Так я загрузил изображение, как-то это испортило его (в формате P6). Я могу наложить контур моего верхнего изображения на нижнее изображение. Итак, несколько хитростей и, возможно, все получится. –

ответ

1

Эта линия выглядит неправильно:

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); 
} 

Наконец, поскольку у вас есть оператор равенства, то почему бы не добавить и присваивать ('='), чтобы сохранить ваш кодер как опрятный как возможно

+0

Спасибо, много хороших указателей. –

Смежные вопросы