2015-02-24 13:28 GMT+01:00 Glus Xof <gtglus gmail com>:
> Hi guys,
>
> I need your help...
>
> I insist that maybe it's not an specifically Gtkmm question... but you may
> know better how it's done, the library...
>
> Gdk::Pixbuf::get_pixels()... returns a guint8 (const unsigned char) pointer.
> So,
>
> 1) Which is the best way to build an std::string object containing the data
> of the buffer (the pixels)... ?
>
> Is the following well reasoned ?
>
> Glib::RefPtr<Gdk::Pixbuf> ref_orig = Gdk::Pixbuf::create_from_file
> ("./file.png");
> std::string image_pixels (reinterpret_cast<const char
> *>(ref_orig->get_pixels()), ref_orig->get_byte_length());
>
> Why std::vector(s) should be used, here ?
>
http://pastebin.com/tVBR3bGF
std::string is supposed to hold text, so storing arbitrary binary data
there is just confusing and hacky. You have to take special care about
null bytes. On the other hand, std::vector is well suited for such
task.
> ==
>
> Once an std::string object created... and from this object...
>
> 2) Which is the best way to convert it back to guint8 (const unsigned char)
> pointer, in order to pass it as first argument to
> Gdk::Pixbuf::create_from_data() ?
>
>
> I'd like to know how to realize these two steps... even if building
> std::string objects sounds a little silly or strange... I wonder... is it
> possible ?
>
> Glus
>
> 2015-02-24 11:38 GMT+01:00 Krzesimir Nowak <qdlacz gmail com>:
>>
>> 2015-02-23 23:05 GMT+01:00 Glus Xof <gtglus gmail com>:
>> >
>> >
>> > 2015-02-23 22:21 GMT+01:00 Markus Kolb <markus kolb+gtkmm tower-net de>:
>> >>
>> >> Am 2015-02-23 21:40, schrieb Glus Xof:
>> >>>
>> >>> Hi guys,
>> >>>
>> >>> Before anything, I admit that probably my question is not an
>> >>> specifically
>> >>> Gtkmm question... but nevertheless I think you may know how
>> >>> Gdk::Pixbuf
>> >>> is
>> >>> done...
>> >>>
>> >>> Having the following,
>> >>>
>> >>> Glib::RefPtr<Gdk::Pixbuf> ref_orig = Gdk::Pixbuf::create_from_file
>> >>> ("./file.png");
>> >>>
>> >>> I'm trying to temporary store (because I need so) the image data into
>> >>> a
>> >>> std::string object. It seems that get_pixels() could solve the
>> >>> problem,
>> >>> getting a pointer of type guint8.
>> >>
>> >>
>> >> Seems that gdkmm is not up-to-date here.
>> >> gdk uses a guchar*. But this shouldn't be a problem.
>> >
>> >
>> >>>
>> >>> So, I wrote as follows,
>> >>>
>> >>> std::string image_pixels (reinterpret_cast<const char
>> >>> *>(ref_orig->get_pixels()), ref_orig->get_rowstride());
>> >>
>> >>
>> >> I think this does not what you expect.
>> >>
>> >>
>> >>
>> >> https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#gdk-pixbuf-get-rowstride
>> >>
>> >> See also the part below the description headline.
>> >>
>> >> Maybe you should use gsize Gdk::Pixbuf::get_byte_length()
>> >> because
>> >>
>> >> https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#gdk-pixbuf-get-pixels-with-length
>> >> is missing.
>> >>
>> >> I hope it will help you.
>> >>
>> >> But think about the std::string. Big ? ;-)
>> >>
>> >
>> > According to Yann & Markus' comments, I remake my code as follows,
>> >
>> > Glib::RefPtr<Gdk::Pixbuf> ref_orig = Gdk::Pixbuf::create_from_file
>> > ("./file.png");
>> >
>> > // Glib::ustring::c_str() or data() allows me to get an std::string
>> > object...
>> >
>> > Glib::ustring image_pixels (
>> > reinterpret_cast<const char *>(ref_orig->get_pixels()),
>> > ref_orig->get_byte_length());
>>
>> I think you wanted to use std::string here instead of Glib::ustring.
>> Glib::ustring expects utf8 strings, not some random binary data.
>> Especially it does not like embedded zeros. The Glib::ustring
>> constructor calls utf8_byte_offset
>> (https://git.gnome.org/browse/glibmm/tree/glib/glibmm/ustring.cc#n60)
>> returns std::string::npos when it encounters embedded zero. And that
>> thing is passed to std::string constructor which throws the exception,
>> because npos is a -1 cast to size_type.
>>
>> Anyway, I'd recommend rather using std::vector instead.
>>
>> >
>> > Glib::RefPtr<Gdk::Pixbuf> ref_dest =
>> > Gdk::Pixbuf::create_from_data (
>> > reinterpret_cast<const guint8*>(image_pixels.data()),
>> > Gdk::COLORSPACE_RGB,
>> > ref_orig->get_has_alpha(), ref_orig->get_bits_per_sample(),
>> > ref_orig->get_width(), ref_orig->get_height(),
>> > ref_orig->get_rowstride());
>> >
>> > But, at runtime I get a lenght error exception,
>> >
>> > terminate called after throwing an instance of 'std::length_error'
>> > what(): basic_string::_S_create
>> >
>> > Could help ?
>> >
>> > Glus
>> >
>> >
>> >
>> >
>> >
>> >>
>> >> _______________________________________________
>> >> gtkmm-list mailing list
>> >> gtkmm-list gnome org
>> >> https://mail.gnome.org/mailman/listinfo/gtkmm-list
>> >
>> >
>> >
>> > _______________________________________________
>> > gtkmm-list mailing list
>> > gtkmm-list gnome org
>> > https://mail.gnome.org/mailman/listinfo/gtkmm-list
>> >
>
>