Pixbuf показывает неверную информацию об изображении

#c #image #user-interface #gtk #gtkmm

#c #изображение #пользовательский интерфейс #gtk #gtkmm

Вопрос:

Независимо от того, какое изображение я загружаю в Gdk::Pixbuf (используя GTKmm), оно всегда показывает одну и ту же информацию. Я имею в виду функции get_n_channels(), get_bits_per_sample() и get_has_alpha().

Я проверяю изображения другими программами, и они показывают другую (но правильную) информацию. Помогите!

Часть моего кода:

 Glib::RefPtr<Gdk::Pixbuf> ob = scene.get_pixbuf(); // some image
stringstream out;

out.str("");
out << ob->get_n_channels();
tekst  ="Nr. of channels: <b>"   out.str()  "</b>n";
out.str("");
out << ob->get_bits_per_sample();
tekst  ="bits per sample: <b>"   out.str()  "</b>n";
tekst  ="alpha canal: <b>";
if (ob->get_has_alpha())tekst  ="yes</b>n";
else tekst  ="no</b>n";

info.set_markup(tekst); // Gtk::Label
  

Ответ №1:

Обратите внимание, что GdkPixbuf поддерживает очень ограниченный набор форматов пикселей:

  • Цвет RGB, 8 бит на канал
  • 8-разрядный альфа-канал, или альфа отсутствует вообще

Когда вы загружаете изображение с помощью GdkPixbuf, оно преобразует изображение в 24-битный RGB плюс 8-битный alpha, если изображение имеет прозрачность. Например, если вы загрузите изображение в оттенках серого, оно будет «разбито» на каналы RGB. Вот почему вы получаете только GDK_COLORSPACE_RGB из gdk_pixbuf_get_colorspace() и 8 из _get_bits_per_sample().

Это неоптимально, но у нас было время реализовать это только тогда, когда мы изначально писали GdkPixbuf. IrfanView, конечно, будет иметь более сложное представление о представлениях изображений — он покажет вам, что объявляет исходный файл изображения, а не внутреннее представление, которое изображение имеет при декодировании.