From 268c419d7c2beeb2fdbfdbdee27b7f4026778522 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 26 May 2014 20:09:12 +0300 Subject: [PATCH 1/5] Simple spider test. Test image created with Pillow. --- Tests/images/lena.spider | Bin 0 -> 66560 bytes Tests/test_file_spider.py | 15 +++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 Tests/images/lena.spider create mode 100644 Tests/test_file_spider.py diff --git a/Tests/images/lena.spider b/Tests/images/lena.spider new file mode 100644 index 0000000000000000000000000000000000000000..df963c1c3cfa6b95f7337611c7b932edaa57b4a4 GIT binary patch literal 66560 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 Oh5uaG?`2CbM*kmXvmjIe literal 0 HcmV?d00001 diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py new file mode 100644 index 00000000000..9c15de804cd --- /dev/null +++ b/Tests/test_file_spider.py @@ -0,0 +1,15 @@ +from tester import * + +from PIL import Image + +test_file = "Tests/images/lena.spider" + + +def test_sanity(): + im = Image.open(test_file) + im.load() + assert_equal(im.mode, "F") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "SPIDER") + +# End of file From 5f9cad1a8eea23254889788222c92cf20a28d829 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 26 May 2014 20:15:48 +0300 Subject: [PATCH 2/5] pyflakes --- PIL/SpiderImagePlugin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index cd97c524d33..ec8267f2286 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -74,11 +74,9 @@ def isSpiderImage(filename): fp = open(filename,'rb') f = fp.read(92) # read 23 * 4 bytes fp.close() - bigendian = 1 t = struct.unpack('>23f',f) # try big-endian first hdrlen = isSpiderHeader(t) if hdrlen == 0: - bigendian = 0 t = struct.unpack('<23f',f) # little-endian hdrlen = isSpiderHeader(t) return hdrlen From 14c8d8afe4d01275d2d8973e53c7ab4e32fd3d31 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 26 May 2014 21:00:20 +0300 Subject: [PATCH 3/5] More spider tests --- Tests/test_file_spider.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 9c15de804cd..d93724492f0 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -1,6 +1,7 @@ from tester import * from PIL import Image +from PIL import SpiderImagePlugin test_file = "Tests/images/lena.spider" @@ -12,4 +13,24 @@ def test_sanity(): assert_equal(im.size, (128, 128)) assert_equal(im.format, "SPIDER") + +def test_save(): + # Arrange + temp = tempfile('temp.spider') + im = lena() + + # Act + im.save(temp, "SPIDER") + + # Assert + im2 = Image.open(temp) + assert_equal(im2.mode, "F") + assert_equal(im2.size, (128, 128)) + assert_equal(im2.format, "SPIDER") + + +def test_isSpiderImage(): + assert_true(SpiderImagePlugin.isSpiderImage(test_file)) + + # End of file From 5217a523d677067cf3d268b1941f0fb47ca75de3 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 26 May 2014 21:18:48 +0300 Subject: [PATCH 4/5] Make sure nvalues is int and not float for Python 3 --- PIL/SpiderImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index ec8267f2286..0810b929eb6 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -208,7 +208,7 @@ def makeSpiderHeader(im): if 1024%lenbyt != 0: labrec += 1 labbyt = labrec * lenbyt hdr = [] - nvalues = labbyt / 4 + nvalues = int(labbyt / 4) for i in range(nvalues): hdr.append(0.0) From eacbd7b04abac95a2f84a3f091642530910f450f Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 26 May 2014 21:56:40 +0300 Subject: [PATCH 5/5] pep8/pyflakes --- PIL/SpiderImagePlugin.py | 80 ++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index 0810b929eb6..306b348bc40 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -36,17 +36,23 @@ from __future__ import print_function from PIL import Image, ImageFile -import os, struct, sys +import os +import struct +import sys + def isInt(f): try: i = int(f) - if f-i == 0: return 1 - else: return 0 + if f-i == 0: + return 1 + else: + return 0 except: return 0 -iforms = [1,3,-11,-12,-21,-22] +iforms = [1, 3, -11, -12, -21, -22] + # There is no magic number to identify Spider files, so just check a # series of header locations to see if they have reasonable values. @@ -56,28 +62,32 @@ def isInt(f): def isSpiderHeader(t): h = (99,) + t # add 1 value so can use spider header index start=1 # header values 1,2,5,12,13,22,23 should be integers - for i in [1,2,5,12,13,22,23]: - if not isInt(h[i]): return 0 + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 # check iform iform = int(h[5]) - if not iform in iforms: return 0 + if iform not in iforms: + return 0 # check other header values labrec = int(h[13]) # no. records in file header labbyt = int(h[22]) # total no. of bytes in header lenbyt = int(h[23]) # record length in bytes - #print "labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt) - if labbyt != (labrec * lenbyt): return 0 + # print "labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt) + if labbyt != (labrec * lenbyt): + return 0 # looks like a valid header return labbyt + def isSpiderImage(filename): - fp = open(filename,'rb') + fp = open(filename, 'rb') f = fp.read(92) # read 23 * 4 bytes fp.close() - t = struct.unpack('>23f',f) # try big-endian first + t = struct.unpack('>23f', f) # try big-endian first hdrlen = isSpiderHeader(t) if hdrlen == 0: - t = struct.unpack('<23f',f) # little-endian + t = struct.unpack('<23f', f) # little-endian hdrlen = isSpiderHeader(t) return hdrlen @@ -94,11 +104,11 @@ def _open(self): try: self.bigendian = 1 - t = struct.unpack('>27f',f) # try big-endian first + t = struct.unpack('>27f', f) # try big-endian first hdrlen = isSpiderHeader(t) if hdrlen == 0: self.bigendian = 0 - t = struct.unpack('<27f',f) # little-endian + t = struct.unpack('<27f', f) # little-endian hdrlen = isSpiderHeader(t) if hdrlen == 0: raise SyntaxError("not a valid Spider file") @@ -110,7 +120,7 @@ def _open(self): if iform != 1: raise SyntaxError("not a Spider 2D image") - self.size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.size = int(h[12]), int(h[2]) # size in pixels (width, height) self.istack = int(h[24]) self.imgnumber = int(h[27]) @@ -139,9 +149,10 @@ def _open(self): self.rawmode = "F;32F" self.mode = "F" - self.tile = [("raw", (0, 0) + self.size, offset, - (self.rawmode, 0, 1))] - self.__fp = self.fp # FIXME: hack + self.tile = [ + ("raw", (0, 0) + self.size, offset, + (self.rawmode, 0, 1))] + self.__fp = self.fp # FIXME: hack # 1st image index is zero (although SPIDER imgnumber starts at 1) def tell(self): @@ -174,6 +185,7 @@ def tkPhotoImage(self): from PIL import ImageTk return ImageTk.PhotoImage(self.convert2byte(), palette=256) + # -------------------------------------------------------------------- # Image series @@ -198,14 +210,16 @@ def loadImageSeries(filelist=None): imglist.append(im) return imglist + # -------------------------------------------------------------------- # For saving images in Spider format def makeSpiderHeader(im): - nsam,nrow = im.size + nsam, nrow = im.size lenbyt = nsam * 4 # There are labrec records in the header labrec = 1024 / lenbyt - if 1024%lenbyt != 0: labrec += 1 + if 1024 % lenbyt != 0: + labrec += 1 labbyt = labrec * lenbyt hdr = [] nvalues = int(labbyt / 4) @@ -216,13 +230,13 @@ def makeSpiderHeader(im): return [] # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[5] = 1.0 # iform for 2D image - hdr[12] = float(nsam) # number of pixels per line - hdr[13] = float(labrec) # number of records in file header - hdr[22] = float(labbyt) # total number of bytes in header - hdr[23] = float(lenbyt) # record length in bytes + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes # adjust for Fortran indexing hdr = hdr[1:] @@ -230,9 +244,10 @@ def makeSpiderHeader(im): # pack binary data into a string hdrstr = [] for v in hdr: - hdrstr.append(struct.pack('f',v)) + hdrstr.append(struct.pack('f', v)) return hdrstr + def _save(im, fp, filename): if im.mode[0] != "F": im = im.convert('F') @@ -248,11 +263,12 @@ def _save(im, fp, filename): raise IOError("Unable to open %s for writing" % filename) fp.writelines(hdr) - rawmode = "F;32NF" #32-bit native floating point - ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode,0,1))]) + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, 1))]) fp.close() + def _save_spider(im, fp, filename): # get the filename extension and register it with Image fn, ext = os.path.splitext(filename) @@ -290,5 +306,7 @@ def _save_spider(im, fp, filename): if outfile != "": # perform some image operation im = im.transpose(Image.FLIP_LEFT_RIGHT) - print("saving a flipped version of %s as %s " % (os.path.basename(filename), outfile)) + print( + "saving a flipped version of %s as %s " % + (os.path.basename(filename), outfile)) im.save(outfile, "SPIDER")