8000 Allow to store metadata in png files · matplotlib/matplotlib@8e45f4d · GitHub
[go: up one dir, main page]

Skip to content

Commit 8e45f4d

Browse files
Xarthisiusnewville
authored andcommitted
Allow to store metadata in png files
1 parent 75a4986 commit 8e45f4d

File tree

1 file changed

+40
-3
lines changed

1 file changed

+40
-3
lines changed

src/_png.cpp

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)
0