2016-02-09 56 views
1

我試圖用下面的代碼從Using Boost.GIL to convert an image into 「raw」 bytes轉換PNG文件爲原始比特(這將在後面由OpenGL的使用),讀.png文件逐像素使用boost.gil

包括:

#include <boost/gil/gil_all.hpp> 
#include <boost/gil/extension/io/png_io.hpp> 
#include <boost/gil/extension/io/png_dynamic_io.hpp> 

內部功能:

boost::gil::rgba8_image_t image; 
png_read_and_convert_image(path, image); 

unsigned char* data = new unsigned char[image.width() * image.height() * 
    boost::gil::num_channels<boost::gil::rgba8_pixel_t>()]; 
std::size_t i = 0; 

auto lambda = [data, &i](boost::gil::rgba8_pixel_t p) 
    { 
     data[i] = boost::gil::at_c<0>(p); ++i; 
     data[i] = boost::gil::at_c<1>(p); ++i; 
     data[i] = boost::gil::at_c<2>(p); ++i; 
     data[i] = boost::gil::at_c<3>(p); ++i; 
    }; 
boost::gil::for_each_pixel(image._view, std::function<void(boost::gil::rgba8_pixel_t)>(lambda)); 

其中std::string path給出。但是這不能編譯。(int_p_NULLpng_io_private.hpp中未申報的標識符)。我也曾嘗試更換for_each_pixel由以下

for (int x = 0; x < image.width(); ++x) 
{ 
    boost::gil::rgba8_view_t::y_iterator it = image._view.col_begin(x); 
    for (int y = 0; y < image.height(); ++y) 
    { 
     data[i] = boost::gil::at_c<0>(it[y]); ++i; 
     data[i] = boost::gil::at_c<1>(it[y]); ++i; 
     data[i] = boost::gil::at_c<2>(it[y]); ++i; 
     data[i] = boost::gil::at_c<3>(it[y]); ++i; 
    } 
} 

此代碼不編譯任,並給出了同樣的錯誤。我應該怎麼做才能正確讀取.png圖像?

編輯: @cv_and_he指出lambda和boost.gil不能自然地工作。我修改了第一段代碼,現在它給出了與第二段相同的錯誤。

+0

我不知道這是否會有所幫助,因爲我對圖書館沒有經驗,但我注意到,所有鏈接的答案都使用'for_each_pixels'的視圖,並且您直接使用圖像。你可以嘗試'boost :: gil :: for_each_pixel(const_view(image),...'並看看它是否有效嗎? – llonesmiz

+0

@cv_and_he謝謝,解決了一些問題,但編譯器仍然說我試圖引用刪除函數 –

+0

http://comments.gmane.org/gmane.comp.lang.c%2B%2B.isocpp.general/513 – llonesmiz

回答

1

int_p_NULL在libpng-1.2.x/png.h中定義;確保你已經直接或間接地包含了png.h,並且你沒有使用更新版本的libpng。

+0

我基本上遵循[Design guide](http://www.boost.org) /doc/libs/develop/libs/gil/doc/html/gildesignguide.html)boost :: gil。使用1.2以上版本有什麼問題嗎? –

+0

boost:你提到的gil文檔說你需要有png.h在你的inlude路徑中,但沒有提供任何關於所需版本的信息,但是對int_p_NULL的引用表明它需要1.2.x.BTW這不是一個函數,它只是libpng-1.0中存在的NULL的同義詞.x和1.2.x,但從1.4.0中刪除。 –