Я хочу скопировать данные из изображения Qt в Boost Multi Array, выполнить некоторые манипуляции с Multi Array и скопировать данные обратно в QImage для отображения.
Я получаю доступ к необработанным данным с помощью Qimage::bits()
и пытаюсь выполнить копирование с помощью std::copy
, и, похоже, существует проблема с выравниванием данных, которую я не Понимаю. Здесь записка о доступе к данным для изображений с 32 битами на дюйм, но проблема остается, даже если я преобразую QImage в другой формат.
Я собрал фрагмент, иллюстрирующий типичную проблему. Там может быть несколько вещей, которые я делаю неправильно, так что терпите меня. Здесь я пытаюсь скопировать верхнюю половину Изображение 2 в Изображение 1 и получить этот вывод
#include <algorithm>
#include <boost/multi_array.hpp>
#include <QImage>
typedef boost::multi_array<uchar, 3> image_type;
int main() {
QString path = "/path/to/images/";
QImage qimage_1(path + "image1.jpg");
QImage qimage_2(path + "image2.jpg");
image_type bimage_1(boost::extents[qimage_1.width()][qimage_1.height()][4]);
image_type bimage_2(boost::extents[qimage_2.width()][qimage_2.height()][4]);
std::copy(qimage_1.bits(), qimage_1.bits() + qimage_1.width()*qimage_1.height()*4, &bimage_1[0][0][0]);
std::copy(qimage_2.bits(), qimage_2.bits() + qimage_2.width()*qimage_2.height()*4, &bimage_2[0][0][0]);
// copy top half of image 2 to image 1
for(int i = 0; i < qimage_1.width(); i++) {
for(int j = 0; j < qimage_1.height()/2; j++) {
bimage_1[i][j][0] = bimage_2[i][j][0];
bimage_1[i][j][1] = bimage_2[i][j][1];
bimage_1[i][j][2] = bimage_2[i][j][2];
bimage_1[i][j][3] = bimage_2[i][j][3];
}
}
std::copy(&bimage_1[0][0][0], &bimage_1[0][0][0] + bimage_1.num_elements(), qimage_1.bits());
qimage_1.save(path + "output.png");
return 0;
}
Мой файл .pro просто содержит SOURCES += main.cpp
Любая помощь очень ценится.