Re: How to store Gdk::Pixbuf pixels into std::string objects



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





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]