From 329fd00d3fe2709c043c73e075da03b6d9729a2b Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 14 Apr 2014 13:49:29 +0300 Subject: [PATCH 1/3] Test j2k --- Tests/images/rgb_trns_ycbc.j2k | Bin 0 -> 5365 bytes Tests/images/rgb_trns_ycbc.jp2 | Bin 0 -> 5450 bytes Tests/test_file_jpeg2k.py | 36 ++++++++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 Tests/images/rgb_trns_ycbc.j2k create mode 100644 Tests/images/rgb_trns_ycbc.jp2 diff --git a/Tests/images/rgb_trns_ycbc.j2k b/Tests/images/rgb_trns_ycbc.j2k new file mode 100644 index 0000000000000000000000000000000000000000..462729501e184f82e36a5dc9ea9548c9dca6a4ea GIT binary patch literal 5365 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 literal 0 HcmV?d00001 diff --git a/Tests/images/rgb_trns_ycbc.jp2 b/Tests/images/rgb_trns_ycbc.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..dea77c6dab27083254984681d6b79ff2ce73619b GIT binary patch literal 5450 zcmZWrWmFr?woUNjlHwj9w8h;C6n87o;!uh^#jQn)dvPhnp%g7na0!`_{VetaE0c*?Z5dv*yFa9m%E$QF1OA1ak7)b2 zCAYJE>;8z)e+mN|`w;;EA}be1ci=xQ@#A^aquJ^~^FbTH_YVhsT>q|r2lTP|yZ$#Y zuz|q;8sOkcq{M%>(AOZfD^HD|n z*ENqS+W%M4|4&8#FEwSwr-1OM6h*E0y&=7*1?fnBsgKLs9hXO%#0RBki!ECLYAdW= z5MjDU0*~TWd@}G7Y3ur!rrD=I9WYVHGp0CLmOPrtrX5Oc(!I_^oPUYhvVI(ZYJ(U}p7Of;h zbW=Z0ObX6|R}y0bKk{Bhg@9?R%Leotx~dzHBMob%)(+HCV0uF0jZP!b(lz%7lw~lO z42KrFRSaQ>Yd-xplm;YQNesK~E4;)B0r%}RCu^u>$=6aIV(B>zs22;61xm6n^JlkDn?B(*jb)aL3yNM zE!l-0wsfbcGegr`lGic`S%NuVcSEu!6DJ2w51EK1Y0OB^%r9-RCeDsWtxx8MzARbb zi8_Qx;z_Yxy;Hj4NF7Myzlt)Cx+zTYY2`!L&i_crI&E+^qgEDcU;0L zJ8*39czc~x&-UX8`~i*?->Iqd*H?x3(J)T6O|rv)A{< zjPUDjKNWeBNkSZ!<-xrPD(><&L8T6bY3b;k)MYU;4zVxR=|mzK=%$^W+N(n;Y{6#R;~0s%8Iq#orwvgCq9ElzI&r9q2RWIQ_&L;c^eTpOcXCK+U#Q; zU9R_>XiK3XsxGkS4}3tQHD;xH(yRtuYni#7MKkd8SDC(60U9u=di%+q%*ZJl#h)(e zT;o(z5}CBAf+$tS{#S7m$&J79N(C6oEXGEt_iL0JYgYZRUI+)77aFt6IzXWGhwybN z1iDU3Wq`Zyr{||*Ca!l@lo$z33`OCJScbw+8a&1^Wre zeU#4nd?QEUVU2ATR=JRk-i4ImjM9{{F|J>)a#selMaj9AnF2kY3?S=Haj_--}KDc3YI2PJ4d;K9gZg|_B^z6&vAfiJWb6YBFH4~q!L{Jt% zP$e@?)3ho+Ol)1H&&8}h8W{ex2NoP6#mb?neXwz2PQg3$TLmSMk)9r=?sJZEdiPwe z;X4(fudY{xGoFNZDhzPftR86t7x1CcgeT1+mGLkZ zq4C^&uZdB;5@1b%WzMg(VfE!}2-$p^(VNmEnHQh;Ds9k~wW%_QZ z=md!>Zs|#^Cshm{oEv0t5Ma>7iA4Bj!d4G~_lLBmL6YC%c!>gezR*^*Shy^){S_eK z)$>GGbh@h+mL&jz(JW3Ha-zx{`Gh6CIJvI05gYm9Z`7@@*r#_gi4_WmlYT4dRlrcW znrs?-_$a;`#Izu2HP$7POLlbHA{(n6Q67mIy6E>LtV4DWbEtHXSKlxJCkt~(PDyTK z;IRK*Yxl1qmdejF3tC6FIM%*)=~sc#r;6_mBUG^zIJ8L2a%7qtBC=v%*`-#n1*oyK zFNImGWjqxri@8Zz^oat=y5rq9G`ss!(n|%*J+s`xZCKM~r@M_loyls(U}hhpSFys& z@W+qOkv}g??o$0{cvgE|u*^H7WEoKCjny1*^fTPs|)&anuB8igwEK;K)r zi^%qFC>=T+%k?JTvJ+j75n*x1%b`Jc<31#tsd|{OHewWwpV8%tjj0WJfOV@%rWu@|zI&zMP|?;~z1zR+;f=w297jM) zt>CZ2TvGe?GR`^rWQ6w8M&;9(5?7AbkzW2C^)ao_afYp+yo_7uzq~+M~X7ud!LRUw47m;wqGZ+^Zf%C+E-_@ z-_S@tkB5n~*o9h>psQwBK73@Ai5H#2fbjJSx_tkB@{NMGcd z+ibqYM#EMmK8=xz5Lp1_8zLgIsbi`+MN-qNl2&V6P`g`HhW2V&G`<*d%*=^Lpy+^Y>hDbjkX>}7S*fpdhd!qD}ICEoUYCWqz#{Jwv^mgw7AL{Cp; zCg@Y%e%G4!MTusp%-`){~<+}Q%yhg$iUnG#gN^b3zco0686DxP+mCHEa*M>n`G_f~vBjj4C&W$BhAz33 z(h|4K;OBgy%gzY;;Oy|q)rd`IVUQL>Uox3wUNZq1=0Ql;wrd&sOi^mvJEtoRG2EE5 znaMR?Uu&!uME^UsN@edpKmU2t_u%c#rbOAkW$yjp&Tv{~Ff(qavOfK>@zHx{PGcxn zFb7;Pwz_Nb#>+{_Z`JOUc7yPFy*jBfP`6^!65(t$9URLgm9+a50dxkwH*TFV>3O}H zF3vLAxNpQ(g>!j5;<;B4ibG@&^6lBWC4OR^C5kAC{Ppf7>Hg6RO>Uu9Y}~h|{-*gj z{B1QEh2s4t1p?h)cN&T^NQ}a&gXIi@NMYoQb*Mw0z$vaf1x$P4&q~xGy>b{m`HfqO za4icdM-)<@Ce!bJuKUn8&QRJRolD{YK$9Wnwg;{6c(UB6QLn76aW zJx6G)NWRDcV^};sm&qpZQTpN?^0FU1XUlbUX}MDuCH#HR6G@)Do_{->LUT-qs3DhP za;Q9F8k&S=c{00sDs36|p7*gkV{Gb~#2v*YB$pM(iMfrG>F}n3)v^-SEeZ%16qx*@ zz=J0H7oxvMVtaW%Co?LuAp5y%k9ja(tbRk(J>PsQY`Sn8hY<&-Sr@Xrru(Y5-Ym0_ zPD7C9jN5)0Jh)(|*|QY7JK;K99rg`-Ps#svgpxERX4uiQdSUx#5(hEA^{swg!+7qk z3nt2MGf+>gR&~+MFf5XZsGSVqMN|b7t^}h=FTSeRP$0O2B4XRW*G-O6fv%HMju#7F zwX@|@`#C{d<{PCY#XZhIl0?ZO9}|iroP;vIy^vUA>LD3H)m0abKhwKA-0c!ig8gpa zqVjQz`QnbDqxPjBm=sxd(Of=LwfpOtL_%1kx{6@eVN(>dKY>h=y(DyR5gDqd(%guJ zkUR=H1n(~ck*wM!7|NLrqeGVM2@Cb-oQ4JypDV*ZWmlCsAn>M?8|NmrqvL%cd0TE= z8gJNq^iFCxi(e{CPHO;eGa!Pox~=Z&I$zn>#O9!?)(&RCp7ufaO_f>;kC#OhXk&y) zP&RgxYoiqLDx5LWaC5Y*vs*QLUu}m?#*S0Fe6jidK2#M}Xd$sDt!+*Lo4PmNX6Awb zUurc|SmBb63VP?#eI&cQ8llX_8fSK4mrW1mz6aDE=IN(pdMjM=Aq0lz^$Grwh5McR zy|fu-ROzpEhB1_4{G7kC2v+g;Psu-c=nQg<)$FB3>T4Dn(Ckl~dNk;$qRrOn2WP2D zVx0E#dcUmC;|dALfA6Wy*$KxJ#A7R9e~=>M?ktnF8&mgG#TMxQ2Axn9S`IlJ^Wx(< zD(UmSQuWBAalo>rGOLmf<(oIe2=&G+pe-t4SAk%$iGQ@_HNzE%x2=oV4Kbtfjf&z@ z@x;4wJrV(C=w(r0o09sfFpFKJTX}VZ<~l_JI6EfxSb>wkwZ86Wj{0R!rF>L9sClV^c{IsqjYL2_fM!J^vKAu*431Se+HbBn*OloC!BlGiM(z;pHzOSYb-153*)Mp z!@DkaY50*>?Mg~Wx?Dq=lY0JE!ob-)j_|K_-JzUymJg;ZsavXC4SlzM zoZDW=7fwFn-=h3c-cAgqy_PRj{_cfcCcQCeAEBi>nl{O$8L__zImdBb$G46BbK2O_ z5WUI*uMtqWVx1~1hzifb&k3H%en}Y{3EI0lGwVK2^l`aaHJpgR67>m%G0FWbrGYz6 zW(-4Dw48l-cZzAACFmAj#%mz%AqBleBi`4ceJ#9^VDq*D15Ir-h!Z24`|T*TC5~U@ z?|tN}N#YR%xkR)dFwm8+4)`}!H%P+L6vFd_4F1ogak)dT&O_>CJ6fI2J8tY+57q^ypk&w6A#}zEuJ?H9tNm^ETov$jf zAHVNGfxG;tl1&`gQ$I&jTGW_~8p>ZH>-R5s-#%yCaUYL4*&>PR`>@*T>MX71wIOjZ zllx}XKO=3f#aWHn+MwpR2zoT=Y1KDYvgI!0X(!fT81ROlaWO96viHwqCK}3Wm_v$_ z^2Y!w2ycyLtuP@yJCyvZ73UEh2^q8d78P7 t7H=z97fCe$i*Th&JHFoG?Sc4K*NpO+zPV=9hf7#zHpEYT;O2Ok{~w$!MHB!4 literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index b11e5e6ab..628c53437 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -1,7 +1,6 @@ from tester import * from PIL import Image -from PIL import ImageFile codecs = dir(Image.core) @@ -15,18 +14,20 @@ ignore('Not enough memory to handle tile data') test_card = Image.open('Tests/images/test-card.png') test_card.load() + def roundtrip(im, **options): out = BytesIO() im.save(out, "JPEG2000", **options) bytes = out.tell() out.seek(0) im = Image.open(out) - im.bytes = bytes # for testing only + im.bytes = bytes # for testing only im.load() return im # ---------------------------------------------------------------------- + def test_sanity(): # Internal version number assert_match(Image.core.jp2klib_version, '\d+\.\d+\.\d+$') @@ -36,9 +37,10 @@ def test_sanity(): assert_equal(im.mode, 'RGB') assert_equal(im.size, (640, 480)) assert_equal(im.format, 'JPEG2000') - + # ---------------------------------------------------------------------- + # These two test pre-written JPEG 2000 files that were not written with # PIL (they were made using Adobe Photoshop) @@ -48,6 +50,7 @@ def test_lossless(): im.save('/tmp/test-card.png') assert_image_similar(im, test_card, 1.0e-3) + def test_lossy_tiled(): im = Image.open('Tests/images/test-card-lossy-tiled.jp2') im.load() @@ -55,49 +58,58 @@ def test_lossy_tiled(): # ---------------------------------------------------------------------- + def test_lossless_rt(): im = roundtrip(test_card) assert_image_equal(im, test_card) + def test_lossy_rt(): im = roundtrip(test_card, quality_layers=[20]) assert_image_similar(im, test_card, 2.0) + def test_tiled_rt(): im = roundtrip(test_card, tile_size=(128, 128)) assert_image_equal(im, test_card) + def test_tiled_offset_rt(): im = roundtrip(test_card, tile_size=(128, 128), tile_offset=(0, 0), offset=(32, 32)) assert_image_equal(im, test_card) - + + def test_irreversible_rt(): im = roundtrip(test_card, irreversible=True, quality_layers=[20]) assert_image_similar(im, test_card, 2.0) + def test_prog_qual_rt(): im = roundtrip(test_card, quality_layers=[60, 40, 20], progression='LRCP') assert_image_similar(im, test_card, 2.0) + def test_prog_res_rt(): im = roundtrip(test_card, num_resolutions=8, progression='RLCP') assert_image_equal(im, test_card) # ---------------------------------------------------------------------- + def test_reduce(): im = Image.open('Tests/images/test-card-lossless.jp2') im.reduce = 2 im.load() assert_equal(im.size, (160, 120)) + def test_layers(): out = BytesIO() test_card.save(out, 'JPEG2000', quality_layers=[100, 50, 10], progression='LRCP') out.seek(0) - + im = Image.open(out) im.layers = 1 im.load() @@ -108,3 +120,17 @@ def test_layers(): im.layers = 3 im.load() assert_image_similar(im, test_card, 0.4) + + +def test_rgba(): + # Arrange + j2k = Image.open('Tests/images/rgb_trns_ycbc.j2k') + jp2 = Image.open('Tests/images/rgb_trns_ycbc.jp2') + + # Act + j2k.load() + jp2.load() + + # Assert + assert_equal(j2k.mode, 'RGBA') + assert_equal(jp2.mode, 'RGBA') From d5b09509beb7552e651cbe1db1aeb0f873a490e4 Mon Sep 17 00:00:00 2001 From: Dmitry Selitsky Date: Wed, 16 Apr 2014 16:07:43 +0300 Subject: [PATCH 2/3] logic typo fix --- PIL/Jpeg2KImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIL/Jpeg2KImagePlugin.py b/PIL/Jpeg2KImagePlugin.py index f57f4a784..128248512 100644 --- a/PIL/Jpeg2KImagePlugin.py +++ b/PIL/Jpeg2KImagePlugin.py @@ -45,7 +45,7 @@ def _parse_codestream(fp): elif csiz == 3: mode = 'RGB' elif csiz == 4: - mode == 'RGBA' + mode = 'RGBA' else: mode = None @@ -122,7 +122,7 @@ def _parse_jp2_header(fp): if nc == 3: mode = 'RGB' elif nc == 4: - mode == 'RGBA' + mode = 'RGBA' break return (size, mode) From 54173d2c67bc8ed8953b56e67d4719676f43a073 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 9 May 2014 21:36:15 -0700 Subject: [PATCH 3/3] Cherry-pick of portions of patch a500ca13933183fa845f09762fc2948fbfe409f1, many shortcut ops added, no functional changes --- PIL/ArgImagePlugin.py | 2 +- PIL/BdfFontFile.py | 2 +- PIL/EpsImagePlugin.py | 4 ++-- PIL/ExifTags.py | 7 ++----- PIL/FliImagePlugin.py | 2 +- PIL/FontFile.py | 4 ++-- PIL/FpxImagePlugin.py | 2 +- PIL/GimpGradientFile.py | 2 +- PIL/GimpPaletteFile.py | 2 +- PIL/IcnsImagePlugin.py | 8 ++++---- PIL/ImImagePlugin.py | 2 +- PIL/Image.py | 5 ++--- PIL/ImageFile.py | 2 +- PIL/ImageMath.py | 1 - PIL/ImageOps.py | 4 ++-- PIL/ImageShow.py | 4 ++-- PIL/ImageStat.py | 5 ++--- PIL/IptcImagePlugin.py | 14 +++++++------- PIL/Jpeg2KImagePlugin.py | 2 +- PIL/JpegImagePlugin.py | 4 ++-- PIL/MpegImagePlugin.py | 4 ++-- PIL/PalmImagePlugin.py | 8 ++++---- PIL/PcxImagePlugin.py | 2 +- PIL/PdfImagePlugin.py | 4 ++-- PIL/PsdImagePlugin.py | 8 ++++---- PIL/TiffImagePlugin.py | 12 ++++++------ PIL/TiffTags.py | 4 ++-- PIL/WmfImagePlugin.py | 2 +- Scripts/explode.py | 2 +- Scripts/gifmaker.py | 2 +- Scripts/pildriver.py | 6 +++--- Scripts/pilfile.py | 2 +- Tests/run.py | 4 ++-- Tests/test_image_transform.py | 4 ++-- Tests/test_imagesequence.py | 2 +- 35 files changed, 69 insertions(+), 75 deletions(-) diff --git a/PIL/ArgImagePlugin.py b/PIL/ArgImagePlugin.py index df5ff2625..7fc167c60 100644 --- a/PIL/ArgImagePlugin.py +++ b/PIL/ArgImagePlugin.py @@ -370,7 +370,7 @@ class ArgStream(ChunkStream): im1 = im1.chop_add_modulo(im0.crop(bbox)) im0.paste(im1, bbox) - self.count = self.count - 1 + self.count -= 1 if self.count == 0 and self.show: self.im = self.images[self.id] diff --git a/PIL/BdfFontFile.py b/PIL/BdfFontFile.py index 3be80d602..3a41848d8 100644 --- a/PIL/BdfFontFile.py +++ b/PIL/BdfFontFile.py @@ -128,5 +128,5 @@ class BdfFontFile(FontFile.FontFile): if not c: break id, ch, (xy, dst, src), im = c - if ch >= 0 and ch < len(self.glyph): + if 0 <= ch < len(self.glyph): self.glyph[ch] = xy, dst, src, im diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 4d19c1f20..5e44e6fe5 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -93,7 +93,7 @@ def Ghostscript(tile, size, fp, scale=1): s = fp.read(100*1024) if not s: break - length = length - len(s) + length -= len(s) f.write(s) # Build ghostscript command @@ -148,7 +148,7 @@ class PSFile: def tell(self): pos = self.fp.tell() if self.char: - pos = pos - 1 + pos -= 1 return pos def readline(self): s = b"" diff --git a/PIL/ExifTags.py b/PIL/ExifTags.py index 16473f930..25cd08068 100644 --- a/PIL/ExifTags.py +++ b/PIL/ExifTags.py @@ -63,15 +63,12 @@ TAGS = { 0x0201: "JpegIFOffset", 0x0202: "JpegIFByteCount", 0x0211: "YCbCrCoefficients", - 0x0211: "YCbCrCoefficients", 0x0212: "YCbCrSubSampling", 0x0213: "YCbCrPositioning", - 0x0213: "YCbCrPositioning", - 0x0214: "ReferenceBlackWhite", 0x0214: "ReferenceBlackWhite", 0x1000: "RelatedImageFileFormat", - 0x1001: "RelatedImageLength", - 0x1001: "RelatedImageWidth", + 0x1001: "RelatedImageLength", # FIXME / Dictionary contains duplicate keys + 0x1001: "RelatedImageWidth", # FIXME \ Dictionary contains duplicate keys 0x828d: "CFARepeatPatternDim", 0x828e: "CFAPattern", 0x828f: "BatteryLevel", diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index bef9b722e..c9a29051e 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -105,7 +105,7 @@ class FliImageFile(ImageFile.ImageFile): g = i8(s[n+1]) << shift b = i8(s[n+2]) << shift palette[i] = (r, g, b) - i = i + 1 + i += 1 def seek(self, frame): diff --git a/PIL/FontFile.py b/PIL/FontFile.py index 4dce0a292..7c5704c9d 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -30,7 +30,7 @@ def puti16(fp, values): # write network order (big-endian) 16-bit sequence for v in values: if v < 0: - v = v + 65536 + v += 65536 fp.write(_binary.o16be(v)) ## @@ -63,7 +63,7 @@ class FontFile: h = max(h, src[3] - src[1]) w = w + (src[2] - src[0]) if w > WIDTH: - lines = lines + 1 + lines += 1 w = (src[2] - src[0]) maxwidth = max(maxwidth, w) diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index b712557d7..64c7b1568 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -84,7 +84,7 @@ class FpxImageFile(ImageFile.ImageFile): i = 1 while size > 64: size = size / 2 - i = i + 1 + i += 1 self.maxid = i - 1 # mode. instead of using a single field for this, flashpix diff --git a/PIL/GimpGradientFile.py b/PIL/GimpGradientFile.py index 4ae727773..7c88addae 100644 --- a/PIL/GimpGradientFile.py +++ b/PIL/GimpGradientFile.py @@ -68,7 +68,7 @@ class GradientFile: x = i / float(entries-1) while x1 < x: - ix = ix + 1 + ix += 1 x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] w = x1 - x0 diff --git a/PIL/GimpPaletteFile.py b/PIL/GimpPaletteFile.py index c271b964f..6f71ec678 100644 --- a/PIL/GimpPaletteFile.py +++ b/PIL/GimpPaletteFile.py @@ -52,7 +52,7 @@ class GimpPaletteFile: if 0 <= i <= 255: self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - i = i + 1 + i += 1 self.palette = b"".join(self.palette) diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index 9a0864bad..6951c9325 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -70,7 +70,7 @@ def read_32(fobj, start_length, size): else: blocksize = byte + 1 data.append(fobj.read(blocksize)) - bytesleft = bytesleft - blocksize + bytesleft -= blocksize if bytesleft <= 0: break if bytesleft != 0: @@ -179,11 +179,11 @@ class IcnsFile: i = HEADERSIZE while i < filesize: sig, blocksize = nextheader(fobj) - i = i + HEADERSIZE - blocksize = blocksize - HEADERSIZE + i += HEADERSIZE + blocksize -= HEADERSIZE dct[sig] = (i, blocksize) fobj.seek(blocksize, 1) - i = i + blocksize + i += blocksize def itersizes(self): sizes = [] diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index 1f8f011dc..a5eeef76a 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -182,7 +182,7 @@ class ImImageFile(ImageFile.ImageFile): self.info[k] = v if k in TAGS: - n = n + 1 + n += 1 else: diff --git a/PIL/Image.py b/PIL/Image.py index 333397701..e481e664a 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -434,9 +434,9 @@ def _getscaleoffset(expr): data = expr(_E(stub)).data try: (a, b, c) = data # simplified syntax - if (a is stub and b == "__mul__" and isinstance(c, numbers.Number)): + if a is stub and b == "__mul__" and isinstance(c, numbers.Number): return c, 0.0 - if (a is stub and b == "__add__" and isinstance(c, numbers.Number)): + if a is stub and b == "__add__" and isinstance(c, numbers.Number): return 1.0, c except TypeError: pass try: @@ -2002,7 +2002,6 @@ def frombuffer(mode, size, data, decoder_name="raw", *args): .. versionadded:: 1.1.4 """ - "Load image from bytes or buffer" # may pass tuple instead of argument list if len(args) == 1 and isinstance(args[0], tuple): diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 501e16b00..adb27f2bd 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -502,5 +502,5 @@ def _safe_read(fp, size): if not block: break data.append(block) - size = size - len(block) + size -= len(block) return b"".join(data) diff --git a/PIL/ImageMath.py b/PIL/ImageMath.py index b2355ed1d..adfcc4f6f 100644 --- a/PIL/ImageMath.py +++ b/PIL/ImageMath.py @@ -17,7 +17,6 @@ from PIL import Image from PIL import _imagingmath -import sys try: import builtins diff --git a/PIL/ImageOps.py b/PIL/ImageOps.py index 0d22f8c64..64c35cca1 100644 --- a/PIL/ImageOps.py +++ b/PIL/ImageOps.py @@ -94,7 +94,7 @@ def autocontrast(image, cutoff=0, ignore=None): cut = cut - h[lo] h[lo] = 0 else: - h[lo] = h[lo] - cut + h[lo] -= cut cut = 0 if cut <= 0: break @@ -105,7 +105,7 @@ def autocontrast(image, cutoff=0, ignore=None): cut = cut - h[hi] h[hi] = 0 else: - h[hi] = h[hi] - cut + h[hi] -= cut cut = 0 if cut <= 0: break diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index e81866bac..40fe629d9 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -17,7 +17,7 @@ from __future__ import print_function from PIL import Image import os, sys -if(sys.version_info >= (3, 3)): +if sys.version_info >= (3, 3): from shlex import quote else: from pipes import quote @@ -160,7 +160,7 @@ else: # imagemagick's display command instead. command = executable = "xv" if title: - command = command + " -name %s" % quote(title) + command += " -name %s" % quote(title) return command, executable if which("xv"): diff --git a/PIL/ImageStat.py b/PIL/ImageStat.py index ef63b7857..d84e2cbf1 100644 --- a/PIL/ImageStat.py +++ b/PIL/ImageStat.py @@ -21,7 +21,6 @@ # See the README file for information on usage and redistribution. # -from PIL import Image import operator, math from functools import reduce @@ -81,7 +80,7 @@ class Stat: for i in range(0, len(self.h), 256): sum = 0.0 for j in range(256): - sum = sum + j * self.h[i+j] + sum += j * self.h[i + j] v.append(sum) return v @@ -92,7 +91,7 @@ class Stat: for i in range(0, len(self.h), 256): sum2 = 0.0 for j in range(256): - sum2 = sum2 + (j ** 2) * float(self.h[i+j]) + sum2 += (j ** 2) * float(self.h[i + j]) v.append(sum2) return v diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index 104153002..85575612c 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -103,7 +103,7 @@ class IptcImageFile(ImageFile.ImageFile): break if s != sz: return 0 - y = y + 1 + y += 1 return y == size[1] def _open(self): @@ -187,7 +187,7 @@ class IptcImageFile(ImageFile.ImageFile): if not s: break o.write(s) - size = size - len(s) + size -= len(s) o.close() try: @@ -235,26 +235,26 @@ def getiptcinfo(im): # parse the image resource block offset = 0 while app[offset:offset+4] == "8BIM": - offset = offset + 4 + offset += 4 # resource code code = JpegImagePlugin.i16(app, offset) - offset = offset + 2 + offset += 2 # resource name (usually empty) name_len = i8(app[offset]) name = app[offset+1:offset+1+name_len] offset = 1 + offset + name_len if offset & 1: - offset = offset + 1 + offset += 1 # resource data block size = JpegImagePlugin.i32(app, offset) - offset = offset + 4 + offset += 4 if code == 0x0404: # 0x0404 contains IPTC/NAA data data = app[offset:offset+size] break offset = offset + size if offset & 1: - offset = offset + 1 + offset += 1 except (AttributeError, KeyError): pass diff --git a/PIL/Jpeg2KImagePlugin.py b/PIL/Jpeg2KImagePlugin.py index 128248512..632aff0e5 100644 --- a/PIL/Jpeg2KImagePlugin.py +++ b/PIL/Jpeg2KImagePlugin.py @@ -15,7 +15,7 @@ __version__ = "0.1" -from PIL import Image, ImageFile, _binary +from PIL import Image, ImageFile import struct import os import io diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index da52006ca..39fb8fe9e 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -543,8 +543,8 @@ def _save(im, fp, filename): i = 1 for marker in markers: size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) - extra = extra + (b"\xFF\xE2" + size + b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) + marker) - i = i + 1 + extra += b"\xFF\xE2" + size + b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) + marker + i += 1 # get keyword arguments im.encoderconfig = ( diff --git a/PIL/MpegImagePlugin.py b/PIL/MpegImagePlugin.py index 9d7a0ea7a..02e6adc00 100644 --- a/PIL/MpegImagePlugin.py +++ b/PIL/MpegImagePlugin.py @@ -38,13 +38,13 @@ class BitStream: self.bits = 0 continue self.bitbuffer = (self.bitbuffer << 8) + c - self.bits = self.bits + 8 + self.bits += 8 return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 def skip(self, bits): while self.bits < bits: self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) - self.bits = self.bits + 8 + self.bits += 8 self.bits = self.bits - bits def read(self, bits): diff --git a/PIL/PalmImagePlugin.py b/PIL/PalmImagePlugin.py index 89f42bffc..203a6d9f6 100644 --- a/PIL/PalmImagePlugin.py +++ b/PIL/PalmImagePlugin.py @@ -172,21 +172,21 @@ def _save(im, fp, filename, check=0): cols = im.size[0] rows = im.size[1] - rowbytes = ((cols + (16//bpp - 1)) / (16 // bpp)) * 2; + rowbytes = ((cols + (16//bpp - 1)) / (16 // bpp)) * 2 transparent_index = 0 compression_type = _COMPRESSION_TYPES["none"] - flags = 0; + flags = 0 if im.mode == "P" and "custom-colormap" in im.info: flags = flags & _FLAGS["custom-colormap"] - colormapsize = 4 * 256 + 2; + colormapsize = 4 * 256 + 2 colormapmode = im.palette.mode colormap = im.getdata().getpalette() else: colormapsize = 0 if "offset" in im.info: - offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4; + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 else: offset = 0 diff --git a/PIL/PcxImagePlugin.py b/PIL/PcxImagePlugin.py index 2496af676..4f6d5a3e5 100644 --- a/PIL/PcxImagePlugin.py +++ b/PIL/PcxImagePlugin.py @@ -135,7 +135,7 @@ def _save(im, fp, filename, check=0): # bytes per plane stride = (im.size[0] * bits + 7) // 8 # stride should be even - stride = stride + (stride % 2) + stride += stride % 2 # Stride needs to be kept in sync with the PcxEncode.c version. # Ideally it should be passed in in the state, but the bytes value # gets overwritten. diff --git a/PIL/PdfImagePlugin.py b/PIL/PdfImagePlugin.py index 725f22ecf..f7f98d99b 100644 --- a/PIL/PdfImagePlugin.py +++ b/PIL/PdfImagePlugin.py @@ -104,8 +104,8 @@ def _save(im, fp, filename): r = i8(palette[i*3]) g = i8(palette[i*3+1]) b = i8(palette[i*3+2]) - colorspace = colorspace + "%02x%02x%02x " % (r, g, b) - colorspace = colorspace + b"> ]" + colorspace += "%02x%02x%02x " % (r, g, b) + colorspace += b"> ]" procset = "/ImageI" # indexed color elif im.mode == "RGB": filter = "/DCTDecode" diff --git a/PIL/PsdImagePlugin.py b/PIL/PsdImagePlugin.py index f6aefe9c9..9e64e7c90 100644 --- a/PIL/PsdImagePlugin.py +++ b/PIL/PsdImagePlugin.py @@ -235,7 +235,7 @@ def _layerinfo(file): if t: tile.extend(t) layers[i] = name, mode, bbox, tile - i = i + 1 + i += 1 return layers @@ -258,7 +258,7 @@ def _maketile(file, mode, bbox, channels): for channel in range(channels): layer = mode[channel] if mode == "CMYK": - layer = layer + ";I" + layer += ";I" tile.append(("raw", bbox, offset, layer)) offset = offset + xsize*ysize @@ -272,13 +272,13 @@ def _maketile(file, mode, bbox, channels): for channel in range(channels): layer = mode[channel] if mode == "CMYK": - layer = layer + ";I" + layer += ";I" tile.append( ("packbits", bbox, offset, layer) ) for y in range(ysize): offset = offset + i16(bytecount[i:i+2]) - i = i + 2 + i += 2 file.seek(offset) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index fe658d22c..2d6cbf7dc 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -558,9 +558,9 @@ class ImageFileDirectory(collections.MutableMapping): count = count // 2 # adjust for rational data field append((tag, typ, count, o32(offset), data)) - offset = offset + len(data) + offset += len(data) if offset & 1: - offset = offset + 1 # word padding + offset += 1 # word padding # update strip offset data to point beyond auxiliary data if stripoffsets is not None: @@ -644,7 +644,7 @@ class TiffImageFile(ImageFile.ImageFile): self.fp.seek(self.__next) self.tag.load(self.fp) self.__next = self.tag.next - self.__frame = self.__frame + 1 + self.__frame += 1 self._setup() def _tell(self): @@ -900,7 +900,7 @@ class TiffImageFile(ImageFile.ImageFile): y = y + h if y >= self.size[1]: x = y = 0 - l = l + 1 + l += 1 a = None elif TILEOFFSETS in self.tag: # tiled image @@ -921,7 +921,7 @@ class TiffImageFile(ImageFile.ImageFile): x, y = 0, y + h if y >= self.size[1]: x = y = 0 - l = l + 1 + l += 1 a = None else: if Image.DEBUG: @@ -1093,7 +1093,7 @@ def _save(im, fp, filename): fp.seek(0) _fp = os.dup(fp.fileno()) - blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, ROWSPERSTRIP, ICCPROFILE] # ICC Profile crashes. + blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, ROWSPERSTRIP, ICCPROFILE] # ICC Profile crashes. atts={} # bits per sample is a single short in the tiff directory, not a list. atts[BITSPERSAMPLE] = bits[0] diff --git a/PIL/TiffTags.py b/PIL/TiffTags.py index 9d4530051..92a4b5afc 100644 --- a/PIL/TiffTags.py +++ b/PIL/TiffTags.py @@ -161,7 +161,7 @@ TAGS = { 50716: "BlackLevelDeltaV", 50717: "WhiteLevel", 50718: "DefaultScale", - 50741: "BestQualityScale", + 50741: "BestQualityScale", # FIXME! Dictionary contains duplicate keys 50741 50719: "DefaultCropOrigin", 50720: "DefaultCropSize", 50778: "CalibrationIlluminant1", @@ -185,7 +185,7 @@ TAGS = { 50737: "ChromaBlurRadius", 50738: "AntiAliasStrength", 50740: "DNGPrivateData", - 50741: "MakerNoteSafety", + 50741: "MakerNoteSafety", # FIXME! Dictionary contains duplicate keys 50741 #ImageJ 50838: "ImageJMetaDataByteCounts", # private tag registered with Adobe diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 9a95a0713..40b2037ab 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -59,7 +59,7 @@ word = _binary.i16le def short(c, o=0): v = word(c, o) if v >= 32768: - v = v - 65536 + v -= 65536 return v dword = _binary.i32le diff --git a/Scripts/explode.py b/Scripts/explode.py index 90084a464..b8680f631 100644 --- a/Scripts/explode.py +++ b/Scripts/explode.py @@ -104,7 +104,7 @@ while True: except EOFError: break - ix = ix + 1 + ix += 1 if html: html.write("\n\n") diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py index 9964f77b1..9fa5e71a4 100644 --- a/Scripts/gifmaker.py +++ b/Scripts/gifmaker.py @@ -100,7 +100,7 @@ def makedelta(fp, sequence): previous = im.copy() - frames = frames + 1 + frames += 1 fp.write(";") diff --git a/Scripts/pildriver.py b/Scripts/pildriver.py index 98708c897..e45b05008 100644 --- a/Scripts/pildriver.py +++ b/Scripts/pildriver.py @@ -486,7 +486,7 @@ class PILDriver: print("Stack: " + repr(self.stack)) top = self.top() if not isinstance(top, str): - continue; + continue funcname = "do_" + top if not hasattr(self, funcname): continue @@ -513,9 +513,9 @@ if __name__ == '__main__': while True: try: if sys.version_info[0] >= 3: - line = input('pildriver> '); + line = input('pildriver> ') else: - line = raw_input('pildriver> '); + line = raw_input('pildriver> ') except EOFError: print("\nPILDriver says goodbye.") break diff --git a/Scripts/pilfile.py b/Scripts/pilfile.py index 48514e88b..1b77b0e78 100644 --- a/Scripts/pilfile.py +++ b/Scripts/pilfile.py @@ -57,7 +57,7 @@ for o, a in opt: elif o == "-v": verify = 1 elif o == "-D": - Image.DEBUG = Image.DEBUG + 1 + Image.DEBUG += 1 def globfix(files): # expand wildcards where necessary diff --git a/Tests/run.py b/Tests/run.py index 758923f0f..82e1b94dc 100644 --- a/Tests/run.py +++ b/Tests/run.py @@ -72,7 +72,7 @@ for file in files: if not p.startswith('^'): p = '^' + p if not p.endswith('$'): - p = p + '$' + p += '$' return p ignore_res = [re.compile(fix_re(p), re.MULTILINE) for p in ignore_pats] @@ -104,7 +104,7 @@ for file in files: print(result) failed.append(test) else: - success = success + 1 + success += 1 print("-"*68) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index fdee6072f..2176d2ea1 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -61,8 +61,8 @@ def _test_alpha_premult(op): # create image with half white, half black, with the black half transparent. # do op, # there should be no darkness in the white section. - im = Image.new('RGBA', (10,10), (0,0,0,0)); - im2 = Image.new('RGBA', (5,10), (255,255,255,255)); + im = Image.new('RGBA', (10,10), (0,0,0,0)) + im2 = Image.new('RGBA', (5,10), (255,255,255,255)) im.paste(im2, (0,0)) im = op(im, (40,10)) diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 3329b1a05..bf98f767d 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -16,7 +16,7 @@ def test_sanity(): for frame in seq: assert_image_equal(im, frame) assert_equal(im.tell(), index) - index = index + 1 + index += 1 assert_equal(index, 1)