diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 60850f4ff..2204fbb9b 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3185,7 +3185,7 @@ def frombuffer( from . import ImagePalette im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) - im.readonly = 1 + im.readonly = im.im.readonly return im return frombytes(mode, size, data, decoder_name, args) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index c5d6383a5..00d7832a1 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -319,7 +319,7 @@ class ImageFile(Image.Image): self.im = Image.core.map_buffer( self.map, self.size, decoder_name, offset, args ) - readonly = 1 + readonly = self.im.readonly # After trashing self.im, # we might need to reload the palette data. if self.palette: diff --git a/src/_imaging.c b/src/_imaging.c index 330a7eef4..ece2536c9 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3722,6 +3722,11 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) { ); } +static PyObject * +_getattr_readonly(ImagingObject *self, void *closure) { + return PyLong_FromLong(self->image->readonly); +} + static struct PyGetSetDef getsetters[] = { {"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, @@ -3729,6 +3734,7 @@ static struct PyGetSetDef getsetters[] = { {"id", (getter)_getattr_id}, {"ptr", (getter)_getattr_ptr}, {"unsafe_ptrs", (getter)_getattr_unsafe_ptrs}, + {"readonly", (getter)_getattr_readonly}, {NULL} }; diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 0fc191d15..9c8d30c2b 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -86,6 +86,7 @@ struct ImagingMemoryInstance { int bands; /* Number of bands (1, 2, 3, or 4) */ int xsize; /* Image dimension. */ int ysize; + int readonly; /* Colour palette (for "P" images only) */ ImagingPalette palette; diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 522e9f375..b9a9d1980 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -59,6 +59,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->xsize = xsize; im->ysize = ysize; + im->readonly = 0; im->type = IMAGING_TYPE_UINT8; if (strcmp(mode, "1") == 0) { diff --git a/src/map.c b/src/map.c index c66702981..c0b74711c 100644 --- a/src/map.c +++ b/src/map.c @@ -126,6 +126,7 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) { return NULL; } + im->readonly = view.readonly; /* setup file pointers */ if (ystep > 0) { for (y = 0; y < ysize; y++) {