Skip to content

Commit b54cd8a

Browse files
committed
Changed Image mode property to be read-only by default
1 parent 07623d1 commit b54cd8a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+124
-114
lines changed

Tests/test_image.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ def test_width_height(self):
135135
with pytest.raises(AttributeError):
136136
im.size = (3, 4)
137137

138+
def test_set_mode(self):
139+
im = Image.new("RGB", (1, 1))
140+
141+
with pytest.raises(AttributeError):
142+
im.mode = "P"
143+
138144
def test_invalid_image(self):
139145
im = io.BytesIO(b"")
140146
with pytest.raises(UnidentifiedImageError):

Tests/test_imagefile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def test_no_format(self):
136136

137137
class DummyImageFile(ImageFile.ImageFile):
138138
def _open(self):
139-
self.mode = "RGB"
139+
self._mode = "RGB"
140140
self._size = (1, 1)
141141

142142
im = DummyImageFile(buf)
@@ -217,7 +217,7 @@ def cleanup(self):
217217
class MockImageFile(ImageFile.ImageFile):
218218
def _open(self):
219219
self.rawmode = "RGBA"
220-
self.mode = "RGBA"
220+
self._mode = "RGBA"
221221
self._size = (200, 200)
222222
self.tile = [("MOCK", (xoff, yoff, xoff + xsize, yoff + ysize), 32, None)]
223223

Tests/test_pickle.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ def test_pickle_la_mode_with_palette(tmp_path):
7575

7676
# Act / Assert
7777
for protocol in range(0, pickle.HIGHEST_PROTOCOL + 1):
78-
im.mode = "LA"
78+
im._mode = "LA"
7979
with open(filename, "wb") as f:
8080
pickle.dump(im, f, protocol)
8181
with open(filename, "rb") as f:
8282
loaded_im = pickle.load(f)
8383

84-
im.mode = "PA"
84+
im._mode = "PA"
8585
assert im == loaded_im
8686

8787

docs/example/DdsImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def _open(self):
225225

226226
flags, height, width = struct.unpack("<3I", header.read(12))
227227
self._size = (width, height)
228-
self.mode = "RGBA"
228+
self._mode = "RGBA"
229229

230230
pitch, depth, mipmaps = struct.unpack("<3I", header.read(12))
231231
struct.unpack("<11I", header.read(44)) # reserved

docs/handbook/writing-your-own-image-plugin.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ true color.
7272
# mode setting
7373
bits = int(header[3])
7474
if bits == 1:
75-
self.mode = "1"
75+
self._mode = "1"
7676
elif bits == 8:
77-
self.mode = "L"
77+
self._mode = "L"
7878
elif bits == 24:
79-
self.mode = "RGB"
79+
self._mode = "RGB"
8080
else:
8181
msg = "unknown number of bits"
8282
raise SyntaxError(msg)

src/PIL/BlpImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def _open(self):
266266
msg = f"Bad BLP magic {repr(self.magic)}"
267267
raise BLPFormatError(msg)
268268

269-
self.mode = "RGBA" if self._blp_alpha_depth else "RGB"
269+
self._mode = "RGBA" if self._blp_alpha_depth else "RGB"
270270
self.tile = [(decoder, (0, 0) + self.size, 0, (self.mode, 0, 1))]
271271

272272

src/PIL/BmpImagePlugin.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def _bitmap(self, header=0, offset=0):
163163
offset += 4 * file_info["colors"]
164164

165165
# ---------------------- Check bit depth for unusual unsupported values
166-
self.mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None))
166+
self._mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None))
167167
if self.mode is None:
168168
msg = f"Unsupported BMP pixel depth ({file_info['bits']})"
169169
raise OSError(msg)
@@ -200,7 +200,7 @@ def _bitmap(self, header=0, offset=0):
200200
and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]]
201201
):
202202
raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])]
203-
self.mode = "RGBA" if "A" in raw_mode else self.mode
203+
self._mode = "RGBA" if "A" in raw_mode else self.mode
204204
elif (
205205
file_info["bits"] in (24, 16)
206206
and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]]
@@ -214,7 +214,7 @@ def _bitmap(self, header=0, offset=0):
214214
raise OSError(msg)
215215
elif file_info["compression"] == self.RAW:
216216
if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset
217-
raw_mode, self.mode = "BGRA", "RGBA"
217+
raw_mode, self._mode = "BGRA", "RGBA"
218218
elif file_info["compression"] in (self.RLE8, self.RLE4):
219219
decoder_name = "bmp_rle"
220220
else:
@@ -245,10 +245,10 @@ def _bitmap(self, header=0, offset=0):
245245

246246
# ------- If all colors are grey, white or black, ditch palette
247247
if greyscale:
248-
self.mode = "1" if file_info["colors"] == 2 else "L"
248+
self._mode = "1" if file_info["colors"] == 2 else "L"
249249
raw_mode = self.mode
250250
else:
251-
self.mode = "P"
251+
self._mode = "P"
252252
self.palette = ImagePalette.raw(
253253
"BGRX" if padding == 4 else "BGR", palette
254254
)

src/PIL/BufrStubImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def _open(self):
4646
self.fp.seek(offset)
4747

4848
# make something up
49-
self.mode = "F"
49+
self._mode = "F"
5050
self._size = 1, 1
5151

5252
loader = self._load()

src/PIL/DdsImagePlugin.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def _open(self):
128128

129129
flags, height, width = struct.unpack("<3I", header.read(12))
130130
self._size = (width, height)
131-
self.mode = "RGBA"
131+
self._mode = "RGBA"
132132

133133
pitch, depth, mipmaps = struct.unpack("<3I", header.read(12))
134134
struct.unpack("<11I", header.read(44)) # reserved
@@ -141,9 +141,9 @@ def _open(self):
141141
if pfflags & DDPF_LUMINANCE:
142142
# Texture contains uncompressed L or LA data
143143
if pfflags & DDPF_ALPHAPIXELS:
144-
self.mode = "LA"
144+
self._mode = "LA"
145145
else:
146-
self.mode = "L"
146+
self._mode = "L"
147147

148148
self.tile = [("raw", (0, 0) + self.size, 0, (self.mode, 0, 1))]
149149
elif pfflags & DDPF_RGB:
@@ -153,7 +153,7 @@ def _open(self):
153153
if pfflags & DDPF_ALPHAPIXELS:
154154
rawmode += masks[0xFF000000]
155155
else:
156-
self.mode = "RGB"
156+
self._mode = "RGB"
157157
rawmode += masks[0xFF0000] + masks[0xFF00] + masks[0xFF]
158158

159159
self.tile = [("raw", (0, 0) + self.size, 0, (rawmode[::-1], 0, 1))]
@@ -172,15 +172,15 @@ def _open(self):
172172
elif fourcc == b"ATI1":
173173
self.pixel_format = "BC4"
174174
n = 4
175-
self.mode = "L"
175+
self._mode = "L"
176176
elif fourcc == b"ATI2":
177177
self.pixel_format = "BC5"
178178
n = 5
179-
self.mode = "RGB"
179+
self._mode = "RGB"
180180
elif fourcc == b"BC5S":
181181
self.pixel_format = "BC5S"
182182
n = 5
183-
self.mode = "RGB"
183+
self._mode = "RGB"
184184
elif fourcc == b"DX10":
185185
data_start += 20
186186
# ignoring flags which pertain to volume textures and cubemaps
@@ -189,19 +189,19 @@ def _open(self):
189189
if dxgi_format in (DXGI_FORMAT_BC5_TYPELESS, DXGI_FORMAT_BC5_UNORM):
190190
self.pixel_format = "BC5"
191191
n = 5
192-
self.mode = "RGB"
192+
self._mode = "RGB"
193193
elif dxgi_format == DXGI_FORMAT_BC5_SNORM:
194194
self.pixel_format = "BC5S"
195195
n = 5
196-
self.mode = "RGB"
196+
self._mode = "RGB"
197197
elif dxgi_format == DXGI_FORMAT_BC6H_UF16:
198198
self.pixel_format = "BC6H"
199199
n = 6
200-
self.mode = "RGB"
200+
self._mode = "RGB"
201201
elif dxgi_format == DXGI_FORMAT_BC6H_SF16:
202202
self.pixel_format = "BC6HS"
203203
n = 6
204-
self.mode = "RGB"
204+
self._mode = "RGB"
205205
elif dxgi_format in (DXGI_FORMAT_BC7_TYPELESS, DXGI_FORMAT_BC7_UNORM):
206206
self.pixel_format = "BC7"
207207
n = 7

src/PIL/EpsImagePlugin.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def _open(self):
227227
# go to offset - start of "%!PS"
228228
self.fp.seek(offset)
229229

230-
self.mode = "RGB"
230+
self._mode = "RGB"
231231
self._size = None
232232

233233
byte_arr = bytearray(255)
@@ -344,10 +344,10 @@ def check_required_header_comments():
344344
]
345345

346346
if bit_depth == 1:
347-
self.mode = "1"
347+
self._mode = "1"
348348
elif bit_depth == 8:
349349
try:
350-
self.mode = self.mode_map[mode_id]
350+
self._mode = self.mode_map[mode_id]
351351
except ValueError:
352352
break
353353
else:
@@ -391,7 +391,7 @@ def load(self, scale=1, transparency=False):
391391
# Load EPS via Ghostscript
392392
if self.tile:
393393
self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency)
394-
self.mode = self.im.mode
394+
self._mode = self.im.mode
395395
self._size = self.im.size
396396
self.tile = []
397397
return Image.Image.load(self)

0 commit comments

Comments
 (0)