似乎有什么不对劲after显示的转换。
当我将预览数据保存为 PNG 时:
bg::write_view("output.png", preview_view, bg::png_tag{});
我得到预期的输出:
这是预览缓冲区(buff1
)与将其复制到平面 int32 向量中完全相同。
另请注意
- 返回参数是按值传递的,这意味着它实际上不会被更改
read_pixel_arr
(added &
用于通过引用传递)
- 出现内存泄漏,因为
buff1
从未被释放。下面,我用一个修复了它unique_ptr
.
住在科里鲁 http://coliru.stacked-crooked.com/a/50b9d1aa0ac8edd4
void read_pixel_arr(FlatINT32TArr& r_preview_flat_arr, std::string filepath) {
std::ifstream byte_stream(filepath, std::ios::binary);
bg::image_read_settings<bg::png_tag> settings;
//settings._read_transparency_data = true;
PreviewImageT image;
bg::read_and_convert_image(byte_stream, image, settings);
auto width = image.width();
auto height = image.height();
auto npixels = width * height;
auto buff1 = std::make_unique<PreviewPixelT[]>(npixels);
auto preview_view = bg::interleaved_view(
width, height, buff1.get(),
width * sizeof(PreviewPixelT));
assert(buff1.get() == &preview_view[0]); // checking understanding
bg::copy_and_convert_pixels(
bg::flipped_up_down_view(const_view(image)), preview_view);
r_preview_flat_arr = FlatINT32TArr(npixels);
memcpy(r_preview_flat_arr.data(),
buff1.get(),
sizeof(PreviewPixelT) * npixels);
bg::write_view("output.png", preview_view, bg::png_tag{});
}
int main() {
FlatINT32TArr v(1 << 20);
read_pixel_arr(v, "sample.png");
}
大大简化
Using read_image_info
您可以避免分配缓冲区 3 次并复制它多次:
- 对于图像缓冲区(仅用于复制和检测宽度/高度)
- for the
buff1
(最初也是泄露的)
- 对于平面数组(
std::vector
)
相反,让我们从文件信息中检测尺寸,然后读取directly进入平面数组:
auto flatvector_view(FlatINT32TArr& v, long width) {
return bg::interleaved_view(
width, v.size()/width,
reinterpret_cast<PreviewPixelT*>(v.data()),
width * sizeof(PreviewPixelT));
}
long read_pixel_arr(FlatINT32TArr& r_pixeldata, std::string filepath) {
bg::image_read_settings<bg::png_tag> settings;
auto info = bg::read_image_info(filepath, settings);
auto width = info._info._width;
auto height = info._info._height;
r_pixeldata.resize(width * height);
bg::read_and_convert_view(filepath,
bg::flipped_up_down_view(flatvector_view(r_pixeldata, width)),
settings);
return width;
}
int main() {
FlatINT32TArr v;
auto width = read_pixel_arr(v, "sample.png");
bg::write_view("output.png", flatvector_view(v, width), bg::png_tag{});
}
请注意,reinterpret_cast
是由static_assert
。它在逻辑上相当于你的memcpy
类型双关语。