Получить значение пикселя в Gdk :: Pixbuf, Установить значение пикселя с помощью Gdk :: Cairo

Я использую Gdk::Pixbuf отображать изображение с Gdk::Cairo в C ++:

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&W и мне нужно выделить несколько пикселей, яркость которых выше определенного порога. Для этого я бы хотел покрасить эти пиксели.

Во-первых, я не знаю (и не могу найти в Интернете), как получить яркость определенного пикселя моего изображения Pixbuf.

Во-вторых, я не нахожу другого способа нарисовать пиксель, кроме рисования линии длиной 1 (что является уродливым решением).

Не могли бы вы помочь мне в этом? Если возможно, я бы хотел избежать смены библиотеки …

Спасибо

4

Решение

Вы можете использовать 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
}
3

Другие решения

Других решений пока нет …