boost::gil Interleaved_view

3

我在使用boost图像库时遇到了一些问题。

我没有找到有关如何使用boost :: gil库中的interleaved_view函数的确切文档。更具体地说,我不知道原始数据应该以什么二进制格式存储。

我唯一找到的提及它的地方是在gil教程中:

// Calling with 8-bit RGB data into 16-bit BGR
void XGradientRGB8_BGR16(const unsigned char* src_pixels, ptrdiff_t src_row_bytes, int w, int h,
                                 signed short* dst_pixels, ptrdiff_t dst_row_bytes) {
    rgb8c_view_t  src = interleaved_view(w,h,(const rgb8_pixel_t*)src_pixels,src_row_bytes);
    rgb16s_view_t dst = interleaved_view(w,h,(    rgb16s_pixel_t*)dst_pixels,dst_row_bytes);
    x_gradient(src,dst);
}

另外,这个函数的原型声明如下:
template<typename Iterator>
type_from_x_iterator< Iterator>::view_t     
boost::gil::interleaved_view (std::size_t width, std::size_t height, Iterator pixels, std::ptrdiff_t rowsize_in_bytes)
//Constructing image views from raw interleaved pixel data. 

我的问题是,gil在二进制格式中期望的格式是什么?rowsize_in_bytes应该是什么?

我之前只在使用OpenGL时看到过交错图像,它只是存储在一起的每个像素的RGB信息。我认为rowsize_in_bytes只是字节中一行像素的大小,所以我尝试用这个写一个PNG文件:

void makeImage(const string fileName, const unsigned char * src, const int w, const int h) {
    rgb8c_view_t outImage = interleaved_view(w,h, (const rgb8_pixel_t*) src, w*3*sizeof(unsigned char));
    boost::gil::png_write_view(fileName,outImage);
}

输入的 src 是一个大小为 w*h 的平面数组,格式为

(char)R, (char)G, (char)B, (char)R, (char)G, (char)B, (char)R, (char)G, (char)B ...

这张图片只是一个黑色背景上的白色方框。但是,我得到的结果相当奇怪。

Results

如果有人知道为什么会出现这种情况,以及interleaved_view是如何工作的,那就太好了。提前感谢!

编辑:对不起,大家,我刚刚意识到自己的愚蠢错误。现在它可以正常工作了... :( 问题不在于图像格式,而是行主序而非列主序。

1个回答

8

抱歉,大家。我刚发布完就意识到我已经太长时间使用matlab了...我以列主序的形式编写了数组...唉,我感到很愚蠢。


2
+1 因为承认错误并写下答案。不用担心,其他人可能会犯同样的错误,这很有帮助。 - schnaader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接