我正在使用Gdk::Pixbuf
在C ++中显示Gdk::Cairo
的图片:
virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file(filename);
Gdk::Cairo::set_source_pixbuf(cr, image, (width - image->get_width())/2, (height - image->get_height())/2);
cr->paint();
/* other displaying stuffs */
}
该图像在B&amp; W中,我需要显示一些亮度高于某个阈值的像素。为此,我想为这些像素着色。
首先,我不知道(我在网上找不到)如何获得我的Pixbuf图像的某个像素的亮度。
其次,我没有找到绘制像素的另一种方法,而不是画一条长度为1的线(这是一种难看的解决方案)。
你能帮我解决这个问题吗?如果可能的话,我想避免更换库......谢谢
答案 0 :(得分:3)
您可以使用get pixels()
功能。
void access_pixel( Glib::RefPtr<Gdk::Pixbuf> imageptr, int x, int y )
{
if ( !imageptr ) return;
Gdk::Pixbuf & image = *imageptr.operator->(); // just for convenience
if ( ! image.get_colorspace() == Gdk::COLORSPACE_RGB ) return;
if ( ! image.get_bits_per_sample() == 8 ) return;
if ( !( x>=0 && y>=0 && x<image.get_width() && y<image.get_height() ) ) return;
int offset = y*image.get_rowstride() + x*image.get_n_channels();
guchar * pixel = &image.get_pixels()[ offset ]; // get pixel pointer
if ( pixel[0]>128 ) pixel[1] = 0; // conditionally modify the green channel
queue_draw(); // redraw after modify
}