2015-02-24 15:39 GMT+01:00 Krzesimir Nowak <qdl...@gmail.com>:

> 2015-02-24 13:28 GMT+01:00 Glus Xof <gtg...@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.
>

Thanks a lot, Krzesimir,

You have written a very beautiful example that demostrates how to use
std::vector to reach the same result as the one requested by me, using
std::string objects.

Another problem goes just after creating the new buffer, when this buffer
is going to be set in a Gtk::Image...

Gtk:Image image;
image.set (ref_dest);

The image is not seen properly... in my case almost all pixels appear in
black...

And I don't know why... while "ref_dest->save(argv[2], "png");" runs
perfectly...

Glus



>
> > ==
> >
> > 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 <qdl...@gmail.com>:
> >>
> >> 2015-02-23 23:05 GMT+01:00 Glus Xof <gtg...@gmail.com>:
> >> >
> >> >
> >> > 2015-02-23 22:21 GMT+01:00 Markus Kolb <
> markus.kolb+gt...@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
> >> >
> >
> >
>
_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to