Я пытаюсь прочитать файл jpeg, выполнить простое преобразование и записать его, используя библиотеку boost :: gil. Прямо сейчас я застрял, поскольку даже считывание файла, извлечение небелых точек (он содержит только красные и белые точки) и запись их в другой файл дает совершенно неожиданные результаты. Я хочу, чтобы изображения были одинаковыми, но вот что происходит:
Это входное изображение.
И это изображение на выходе:
Вот как я читаю небелые координаты:
vector<Point2D> points;
//load points from file
rgb8_image_t img;
jpeg_read_image(in_file_path, img );
assert( 2 == img._view.num_dimensions );
const auto dimensions = img._view.dimensions();
assert( 2 == dimensions.num_dimensions );
row_width = dimensions.x;
col_height = dimensions.y;
size_t white_cnt = 0;
size_t non_white_cnt = 0;
for ( uint32_t x = 0; x < dimensions.x; ++x ){
for ( uint32_t y = 0; y < dimensions.y; ++y ){
const rgb8_pixel_t& pix = const_view(img)( rgb8_image_t::point_t(x,y) );
if ( !is_white(pix) ){
points.push_back( Point2D {x,y} );
}
}
}
И вот как пишут те же самые пункты
rgb8_image_t img(row_width,col_heigth);
rgb8_pixel_t white(255,255,255);
rgb8_pixel_t red(255,0,0);
rgb8_pixel_t blue(0,0,255);
fill_pixels( view(img), white );
cout << "printing " << points.size() << "points" << std::endl;
for ( Point2D p : points ){
const auto x = p[0];
const auto y = p[1];
cout << x <<"," << y << endl;
view(img)( rgb8_image_t::point_t( x,y ) ) = red;
}
jpeg_write_view( out_file_path, const_view(img));
Для полноты, это проверка is_white:
bool is_white( const boost::gil::rgb8_pixel_t& pix ){
const auto r = boost::gil::at_c<0>(pix);
const auto g = boost::gil::at_c<1>(pix);
const auto b = boost::gil::at_c<2>(pix);
constexpr auto MAX_VAL = std::numeric_limits<decltype(r)>::max();
return ( MAX_VAL == r ) && ( MAX_VAL == g ) && ( MAX_VAL == b );
}
Любая идея, что я делаю неправильно ?
Спасибо