boost :: gil是否支持10位图像?

时间:2018-07-27 16:42:43

标签: c++ image boost boost-gil

我正在尝试从缓冲区读取10位图像,并使用boost :: gil分析它们。我注意到存在一个rgb8_image_t类型,gray8_image_t类型,但是找不到grey10_image_t类型(这是我需要的)。 gil中是否存在?谢谢!

编辑:使用这些typedef时:

// reference type
typedef boost::gil::bit_aligned_pixel_reference<unsigned short, boost::mpl::vector1_c<unsigned, 10>, boost::gil::gray_layout_t, true> gray10_ref_t;

// iterator type
typedef boost::gil::bit_aligned_pixel_iterator<gray10_ref_t> gray10_ptr_t;

// pixel type
typedef std::iterator_traits<gray10_ptr_t>::value_type gray10_pixel_t;

// pixel storage to read, contains 3 10-bit gray pixels, all with value of 1 as per the following layout
// spaces show byte breaks, bars show pixel breaks, lsb first
// 10000000 00|100000 0000|1000 00000000
std::uint8_t data[4] = { 0x01, 0x04, 0x10, 0x00 };

// an iterator to the start of the storage
gray10_ptr_t p(&data[0], 0);

// check the expected pixel values
assert(p[0] == 0x01);
assert(p[1] == 0x01);
assert(p[2] == 0x01);

编译时出现以下错误:

untitled.cpp:17:6: error: ‘uint8_t’ in namespace ‘std’ does not name a type 
std::uint8_t data[4] = { 0x01, 0x04, 0x10, 0x00 };
     ^
untitled.cpp:20:17: error: ‘data’ was not declared in this scope
 gray10_ptr_t p(&data[0], 0);
                 ^
In file included from /usr/include/boost/predef/detail/_cassert.h:14:0,
                 from /usr/include/boost/predef/library/c/_prefix.h:11,
                 from /usr/include/boost/predef/library/c.h:11,
                 from /usr/include/boost/predef/library.h:11,
                 from /usr/include/boost/predef.h:14,
                 from /usr/include/boost/smart_ptr/detail/yield_k.hpp:28,
                 from /usr/include/boost/smart_ptr/detail/spinlock_sync.hpp:18,
                 from /usr/include/boost/smart_ptr/detail/spinlock.hpp:50,
                 from /usr/include/boost/smart_ptr/detail/spinlock_pool.hpp:25,
                 from /usr/include/boost/smart_ptr/shared_ptr.hpp:34,
                 from /usr/include/boost/shared_ptr.hpp:17,
                 from /usr/include/boost/gil/extension/io/io_error.hpp:23,
                 from /usr/include/boost/gil/extension/io/tiff_io.hpp:29,
                 from untitled.cpp:1:
untitled.cpp:23:13: error: expected ‘)’ before ‘==’ token
 assert(p[0] == 0x01);
             ^
untitled.cpp:23:13: error: expected ‘)’ before ‘==’ token
untitled.cpp:24:13: error: expected ‘)’ before ‘==’ token
 assert(p[1] == 0x01);
             ^
untitled.cpp:24:13: error: expected ‘)’ before ‘==’ token
untitled.cpp:25:13: error: expected ‘)’ before ‘==’ token
 assert(p[2] == 0x01);
             ^
untitled.cpp:25:13: error: expected ‘)’ before ‘==’ token

有人知道如何解决这些问题吗?谢谢。

1 个答案:

答案 0 :(得分:2)

没有,但是您可以define one yourself

由于您的像素类型不是按字节对齐的,因此您需要声明一个按位对齐的像素和相关类型:

  

按位对齐的像素(和图像)比压缩像素更复杂。由于压缩像素是按字节对齐的,因此我们可以将C ++引用用作压缩像素的引用类型,并将C指针用作压缩像素行上的x_iterator。对于位对齐的构造,我们需要一个特殊的引用代理类(bit_aligned_pixel_reference)和迭代器类(bit_aligned_pixel_iterator)。位对齐像素的值类型为packed_pixel。

一个工作示例:

#include <boost/gil.hpp>
#include <boost/mpl/vector.hpp>
#include <cstdint>

int main()
{
    // reference type
    using gray10_ref_t = boost::gil::bit_aligned_pixel_reference<unsigned short, boost::mpl::vector1_c<unsigned, 10>, boost::gil::gray_layout_t, true>;
    // iterator type
    using gray10_ptr_t = boost::gil::bit_aligned_pixel_iterator<gray10_ref_t>;
    // pixel type
    using gray10_pixel_t = std::iterator_traits<gray10_ptr_t>::value_type;

    // pixel storage to read, contains 3 10-bit gray pixels, all with value of 1 as per the following layout
    // spaces show byte breaks, bars show pixel breaks, lsb first
    // 10000000 00|100000 0000|1000 00000000
    std::uint8_t data[4] = { 0x01, 0x04, 0x10, 0x00 };

    // an iterator to the start of the storage
    gray10_ptr_t p(&data[0], 0);

    // check the expected pixel values
    assert(p[0] == 0x01);
    assert(p[1] == 0x01);
    assert(p[2] == 0x01);
}