@@ -124,25 +124,32 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
124
124
{
125
125
numpy::array_view<unsigned char , 3 > buffer;
126
126
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;
127
133
double dpi = 0 ;
128
134
int compression = 6 ;
129
135
int filter = -1 ;
130
- const char *names[] = { " buffer" , " file" , " dpi" , " compression" , " filter" , NULL };
136
+ const char *names[] = { " buffer" , " file" , " dpi" , " compression" , " filter" , " metadata " , NULL };
131
137
132
138
// We don't need strict contiguity, just for each row to be
133
139
// contiguous, and libpng has special handling for getting RGB out
134
140
// of RGBA, ARGB or BGR. But the simplest thing to do is to
135
141
// enforce contiguity using array_view::converter_contiguous.
136
142
if (!PyArg_ParseTupleAndKeywords (args,
137
143
kwds,
138
- " O&O|dii :write_png" ,
144
+ " O&O|diiO :write_png" ,
139
145
(char **)names,
140
146
&buffer.converter_contiguous ,
141
147
&buffer,
142
148
&filein,
143
149
&dpi,
144
150
&compression,
145
- &filter)) {
151
+ &filter,
152
+ &metadata)) {
146
153
return NULL ;
147
154
}
148
155
@@ -276,6 +283,36 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
276
283
png_set_pHYs (png_ptr, info_ptr, dots_per_meter, dots_per_meter, PNG_RESOLUTION_METER);
277
284
}
278
285
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
+
279
316
sig_bit.alpha = 0 ;
280
317
switch (png_color_type) {
281
318
case PNG_COLOR_TYPE_GRAY:
0 commit comments