Не уверен, почему вы захотите скопировать все данные из структуры / класса CImg в другой двумерный массив, если вы в любом случае можете получить к нему доступ именно так. Итак, если вы хотите, чтобы пиксель находился в местоположении [x, y], просто используйте:
img(x,y)
Вот полная программа для вывода изображения - доступа к отдельным пикселям во внутреннем цикле:
#include <iostream>
#include <cstdlib>
#define cimg_display 0
#include "CImg.h"
using namespace cimg_library;
using namespace std;
int main() {
CImg<unsigned char> img("test.pgm");
// Get width, height, number of channels
int w=img.width();
int h=img.height();
int c=img.spectrum();
cout << "Dimensions: " << w << "x" << h << " " << c << " channels" <<endl;
// Dump all pixels
for(int y=0;y<h;y++){
for(int x=0;x<w;x++){
cout << y << "," << x << " " << (int)img(x,y) << endl;
}
}
}
Я использовал это тестовое изображение - 5x3 PGM (Portable Grey Map), чтобы вы могли легко видеть значения пикселей, но оно точно такое же с PNG-изображением:
P2
5 3
255
0 1 2 3 4
10 11 12 13 14
100 101 102 103 104
Вот вывод, который вы видите, соответствует изображению:
Dimensions: 5x3 1 channels
0,0 0
0,1 1
0,2 2
0,3 3
0,4 4
1,0 10
1,1 11
1,2 12
1,3 13
1,4 14
2,0 100
2,1 101
2,2 102
2,3 103
2,4 104