Документация GIL довольно точно документирует различные макеты памяти.
Однако цель библиотеки - абстрагировать макеты памяти. Если вам требуется некоторое представление (плоское / чередованное, упакованное или распакованное), вы делаете вещи "сложным образом" для интерфейса библиотеки.
Итак, я думаю, что вы можете читать и конвертировать в один go, например, для jpeg:
gil::rgb32f_image_t img;
gil::image_read_settings<gil::jpeg_tag> settings;
read_and_convert_image("input.jpg", img, settings);
Теперь получение необработанных данных возможно:
auto* raw_data = gil::interleaved_view_get_raw_data(view(img));
Это тот случай, когда предпочтительная реализация хранилища чередуется, что вполне вероятно, что вы ожидаете. Если ваше конкретное хранилище изображений является плоским, вызов не будет скомпилирован (и вы, вероятно, захотите вместо него planar_view_get_raw_data(vw, plane_index)
).
Обратите внимание, что вам придется повторно интерпретировать_cast для float [const]*
, если вам нужно это потому, что нет интерфейса publi c для получения ссылки на scoped_channel_value<>::value_
, но тип BaseChannelValue
действительно float
, и вы можете утверждать, что оболочка не добавляет дополнительный вес:
static_assert(sizeof(float) == sizeof(raw_data[0]));
Альтернативный подход:
И наоборот, вы можете настроить свой собственный буфер необработанных пикселей, смонтировать в него изменяемый вид и использовать его для чтения / преобразования вашей начальной загрузки в:
// get dimension
gil::image_read_settings<gil::jpeg_tag> settings;
auto info = gil::read_image_info("input.jpg", settings).get_info();
// setup raw pixel buffer & view
using pixel = gil::rgb32f_pixel_t;
auto data = std::make_unique<pixel[]>(info._width * info._height);
auto vw = gil::interleaved_view(info._width, info._height, data.get(),
info._width * sizeof(pixel));
// load into buffer
read_and_convert_view("input.jpg", vw, settings);
Я на самом деле проверил, что он работает правильно, выписав получившийся вид:
//// just for test - doesn't work for 32f, so choose another pixel format
//gil::write_view("output.png", vw, gil::png_tag());