@@ -124,25 +124,32 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
124124{
125125 numpy::array_view<unsigned char , 3 > buffer;
126126 PyObject *filein;
127+ PyObject *metadata;
128+ PyObject *meta_key, *meta_val;
129+ png_text *text;
130+ Py_ssize_t pos = 0 ;
131+ int meta_pos = 0 ;
132+ Py_ssize_t meta_size;
127133 double dpi = 0 ;
128134 int compression = 6 ;
129135 int filter = -1 ;
130- const char *names[] = { " buffer" , " file" , " dpi" , " compression" , " filter" , NULL };
136+ const char *names[] = { " buffer" , " file" , " dpi" , " compression" , " filter" , " metadata " , NULL };
131137
132138 // We don't need strict contiguity, just for each row to be
133139 // contiguous, and libpng has special handling for getting RGB out
134140 // of RGBA, ARGB or BGR. But the simplest thing to do is to
135141 // enforce contiguity using array_view::converter_contiguous.
136142 if (!PyArg_ParseTupleAndKeywords (args,
137143 kwds,
138- " O&O|dii :write_png" ,
144+ " O&O|diiO :write_png" ,
139145 (char **)names,
140146 &buffer.converter_contiguous ,
141147 &buffer,
142148 &filein,
143149 &dpi,
144150 &compression,
145- &filter)) {
151+ &filter,
152+ &metadata)) {
146153 return NULL ;
147154 }
148155
@@ -276,6 +283,36 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
276283 png_set_pHYs (png_ptr, info_ptr, dots_per_meter, dots_per_meter, PNG_RESOLUTION_METER);
277284 }
278285
286+ #ifdef PNG_TEXT_SUPPORTED
287+ // Save the metadata
288+ if (metadata != NULL )
289+ {
290+ meta_size = PyDict_Size (metadata);
291+ text = new png_text[meta_size];
292+
293+ printf (" meta_size = %d\n " , meta_size);
294+ while (PyDict_Next (metadata, &pos, &meta_key, &meta_val)) {
295+ printf (" pos = %i\n " , meta_pos);
296+ printf (" key = %s\n " , PyBytes_AsString (meta_key));
297+ printf (" val = %s\n " , PyBytes_AsString (meta_val));
298+ text[meta_pos].compression = PNG_TEXT_COMPRESSION_NONE;
299+ #if PY3K
300+ text[meta_pos].key = PyBytes_AsString (meta_key);
301+ text[meta_pos].text = PyBytes_AsString (meta_val);
302+ #else
303+ text[meta_pos].key = PyString_AsString (meta_key);
304+ text[meta_pos].text = PyString_AsString (meta_val);
305+ #endif
306+ #ifdef PNG_iTXt_SUPPORTED
307+ text[meta_pos].lang = NULL ;
308+ #endif
309+ meta_pos++;
310+ }
311+ png_set_text (png_ptr, info_ptr, text, meta_size);
312+ delete[] text;
313+ }
314+ #endif
315+
279316 sig_bit.alpha = 0 ;
280317 switch (png_color_type) {
281318 case PNG_COLOR_TYPE_GRAY:
0 commit comments