Я хочу написать функцию, которая объединяет (слева направо) два файла PNM (P6), которые хранятся попиксельно в Image
классы. У меня есть функция, настроенная следующим образом:
void LRConcatenate()
{
Image* input1 = GetInput();
Image* input2 = GetInput2();
Image* output = GetOutput();
if (input1->GetY() == input2->GetY())
{
output->ResetSize(input1->GetX()+input2->GetX(), input1->GetY());
// rest of logic goes here
}
}
Итак, учитывая, что input1
а также input2
имеют одинаковую высоту, они должны быть размещены в новом output
рядом друг с другом. Есть ли прямые способы сделать это в C ++? Не нужно писать рабочий код — я просто пытаюсь придумать идеи.
РЕДАКТИРОВАТЬ: мой файл заголовка изображения, как требуется
#ifndef IPIXEL_H
#define IPIXEL_H
struct PixelStruct
{
unsigned char red;
unsigned char green;
unsigned char blue;
};
#endif
#ifndef IMAGE_H
#define IMAGE_H
class Image
{
private:
int x;
int y;
PixelStruct *data;
public:
Image(void); /* Default constructor */
Image(int width, int height, PixelStruct* data); /* Parameterized constructor */
Image(const Image& img); /* Copy constructor */
~Image(void); /* Destructor */
void ResetSize(int width, int height);
int GetX();
int GetY();
PixelStruct* GetData();
void SetData(PixelStruct *data);
};
#endif
Не совсем ответ, но слишком долго для комментария.
Вам нужно что-то вроде:
if (input1->GetY() == input2->GetY())
{
const size_t width1 = input1->GetX();
const size_t width2 = input2->GetX();
const size_t width12 = width1 + width2;
const size_t height = input1->GetY();
output->ResetSize(width12, height);
for (int y = 0; y < height; ++y)
{
PixelStruct out_row = output->GetData() + (y * width12);
const PixelStruct *data1_row = input1->GetData() + (y * width1);
std::copy(data1_row, data1_row + width1, out_row);
const PixelStruct *data2_row = input2->GetData() + (y * width2);
std::copy(data2_row, data2_row + width2, out_row + width1);
}
}
(не проверено и не скомпилировано)