def test_do_first(self): m = IIIFManipulatorPIL() # no image self.assertRaises( IIIFError, m.do_first ) # add image, get size m.srcfile = 'testimages/test1.png' self.assertEqual( m.do_first(), None ) self.assertEqual( m.width, 175 ) self.assertEqual( m.height, 131 )
def generate(self, src=None, identifier=None): """Generate static files for one source image.""" self.src=src self.identifier=identifier # Get image details and calculate tiles im=IIIFManipulatorPIL() im.srcfile = self.src im.do_first() width = im.width height = im.height #print "w=%d h=%d ts=%d" % (im.width,im.height,tilesize) xtiles = int(width/self.tilesize) ytiles = int(height/self.tilesize) max_tiles = xtiles if (xtiles>ytiles) else ytiles scale_factors = [ 1 ] factor = 1 for n in range(10): if (factor >= max_tiles): break factor = factor+factor scale_factors.append(factor) # Setup destination and IIIF identifier self.setup_destination() # Write out images for (region,size) in static_partial_tile_sizes(width,height,self.tilesize,scale_factors): self.generate_tile(region,size) sizes = [] for (size) in static_full_sizes(width,height,self.tilesize): #FIXME - see https://github.com/zimeon/iiif/issues/9 #sizes.append({'width': size[0], 'height': size[1]}) self.generate_tile('full',size) # Write info.json qualities = ['default'] if (self.api_version>'1.1') else ['native'] info=IIIFInfo(level=0, server_and_prefix=self.prefix, identifier=self.identifier, width=width, height=height, scale_factors=scale_factors, tile_width=self.tilesize, tile_height=self.tilesize, formats=['jpg'], qualities=qualities, sizes=sizes, api_version=self.api_version) json_file = os.path.join(self.dst,self.identifier,'info.json') if (self.dryrun): print "dryrun mode, would write the following files:" print "%s / %s/%s" % (self.dst, self.identifier, 'info.json') self.logger.info(info.as_json()) else: with open(json_file,'w') as f: f.write(info.as_json()) f.close() self.logger.info("Written %s"%(json_file)) print
def test02_max_image_pizels(self): """Check function for setting max number of pixels.""" m = IIIFManipulatorPIL() orig = Image.MAX_IMAGE_PIXELS m.set_max_image_pixels(12345) self.assertTrue(Image.MAX_IMAGE_PIXELS, 12345) m.set_max_image_pixels(0) self.assertTrue(Image.MAX_IMAGE_PIXELS, 12345) # check error raise with test image m.srcfile = 'testimages/test1.png' self.assertRaises(IIIFError, m.do_first) # back to normal m.set_max_image_pixels(orig)
def generate_tile(self,region,size): """Generate one tile for this given region,size of this region.""" r = IIIFRequest(identifier=self.identifier,api_version=self.api_version) if (region == 'full'): r.region_full = True else: r.region_xywh = region # [rx,ry,rw,rh] r.size_wh = [size[0],None] # [sw,sh] -> [sw,] canonical form r.format = 'jpg' path = r.url() # Generate... if (self.dryrun): print "%s / %s" % (self.dst,path) else: m = IIIFManipulatorPIL(api_version=self.api_version) try: m.derive(srcfile=self.src, request=r, outfile=os.path.join(self.dst,path)) print "%s / %s" % (self.dst,path) except IIIFZeroSizeError as e: print "%s / %s - zero size, skipped" % (self.dst,path)
def test09_cleanup(self): """Test cleanup.""" with LogCapture('iiif.manipulator') as lc: m = IIIFManipulatorPIL() m.outtmp = None self.assertEqual(m.cleanup(), None) m.outtmp = '/this_will_not_exist_really_I_hope' self.assertEqual(m.cleanup(), None) self.assertEqual(lc.records[-1].msg, 'Failed to cleanup tmp output file /this_will_not_exist_really_I_hope')
def test05_do_size(self): """Test size selection.""" m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' m.do_first() # noop self.assertEqual(m.do_size(None, None), None) self.assertEqual(m.image.size, (175, 131)) self.assertEqual(m.width, 175) self.assertEqual(m.height, 131) # scale to 50% self.assertEqual(m.do_size(88, 66), None) self.assertEqual(m.image.size, (88, 66)) self.assertEqual(m.width, 88) self.assertEqual(m.height, 66)
def test_do_size(self): m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' m.do_first() # noop self.assertEqual( m.do_size(None,None), None ) self.assertEqual( m.image.size, (175,131) ) self.assertEqual( m.width, 175 ) self.assertEqual( m.height, 131 ) # scale to 50% self.assertEqual( m.do_size(88,66), None ) self.assertEqual( m.image.size, (88,66) ) self.assertEqual( m.width, 88 ) self.assertEqual( m.height, 66 )
def test04_do_region(self): """Test region selection.""" m = IIIFManipulatorPIL() # m.request = IIIFRequest() # m.request.region_full=True m.srcfile = 'testimages/test1.png' m.do_first() self.assertEqual(m.do_region(None, None, None, None), None) # noop, same w,h self.assertEqual(m.image.size, (175, 131)) self.assertEqual(m.width, 175) self.assertEqual(m.height, 131) # select 100,50 # m.request.region_full=False # m.request.region_xywh=(0,0,100,50) self.assertEqual(m.do_region(0, 0, 100, 50), None) self.assertEqual(m.width, 100) self.assertEqual(m.height, 50)
def test_do_region(self): m = IIIFManipulatorPIL() #m.request = IIIFRequest() #m.request.region_full=True m.srcfile = 'testimages/test1.png' m.do_first() self.assertEqual( m.do_region(None,None,None,None), None ) # noop, same w,h self.assertEqual( m.image.size, (175,131) ) self.assertEqual( m.width, 175 ) self.assertEqual( m.height, 131 ) # select 100,50 #m.request.region_full=False #m.request.region_xywh=(0,0,100,50) self.assertEqual( m.do_region(0,0,100,50), None ) self.assertEqual( m.width, 100 ) self.assertEqual( m.height, 50 )
def test03_do_first(self): """Test first step.""" m = IIIFManipulatorPIL() # no image self.assertRaises(IIIFError, m.do_first) # add image, get size m.srcfile = 'testimages/test1.png' self.assertEqual(m.do_first(), None) self.assertEqual(m.width, 175) self.assertEqual(m.height, 131) # Errors # cannot do PDF # FIXME - for some reason this test causes coverage to segfault on py3.3 so # FIXME - skip it there. See https://github.com/zimeon/iiif/issues/22 if (sys.version_info[0:2] == (3, 3)): return m.srcfile = 'testimages/bad/pdf_example.pdf' try: # could use assertRaisesRegexp in 2.7 m.do_first() except IIIFError as e: self.assertTrue(re.match(r'''Failed to read image''', str(e))) self.assertTrue(re.search(r'''PIL: cannot identify image file''', str(e)))
def test01_init(self): """Initialize.""" m = IIIFManipulatorPIL() self.assertTrue(m.api_version) m = IIIFManipulatorPIL(api_version='2.0') self.assertEqual(m.api_version, '2.0')
def test08_do_format(self): """Test format selection.""" m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # default is jpeg m.do_first() self.assertEqual(m.do_format(None), None) img = Image.open(m.outfile) self.assertEqual(img.format, 'JPEG') m.cleanup() # request jpeg m.do_first() self.assertEqual(m.do_format('jpg'), None) img = Image.open(m.outfile) self.assertEqual(img.format, 'JPEG') m.cleanup() # request png m.do_first() self.assertEqual(m.do_format('png'), None) img = Image.open(m.outfile) self.assertEqual(img.format, 'PNG') m.cleanup() # request webp m.do_first() self.assertEqual(m.do_format('webp'), None) img = Image.open(m.outfile) self.assertEqual(img.format, 'WEBP') m.cleanup() # request tiff, not supported m.do_first() self.assertRaises(IIIFError, m.do_format, 'tif') # request jp2, not supported m.do_first() self.assertRaises(IIIFError, m.do_format, 'jp2') # request other, not supported m.do_first() self.assertRaises(IIIFError, m.do_format, 'other') # save to specific location m.outfile = tempfile.NamedTemporaryFile(delete=True).name self.assertFalse(os.path.exists(m.outfile)) # check setup m.do_first() self.assertEqual(m.do_format(None), None) self.assertTrue(os.path.exists(m.outfile))
def test07_do_quality(self): """Test quality selection.""" m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # noop, no change m.do_first() self.assertEqual(m.do_quality(None), None) self.assertEqual(m.image.mode, 'RGB') # color is also no change m.do_first() self.assertEqual(m.do_quality('color'), None) self.assertEqual(m.image.mode, 'RGB') # grey and gray m.do_first() self.assertEqual(m.do_quality('grey'), None) self.assertEqual(m.image.mode, 'L') m.do_first() self.assertEqual(m.do_quality('gray'), None) self.assertEqual(m.image.mode, 'L') # bitonal m.do_first() self.assertEqual(m.do_quality('bitonal'), None) self.assertEqual(m.image.mode, '1') # test with image with palette (mode P in PIL) m = IIIFManipulatorPIL() m.srcfile = 'testimages/robot_palette_320x200.gif' m.do_first() self.assertEqual(m.do_quality('color'), None) self.assertEqual(m.image.mode, 'RGB')
def test01_init(self): m = IIIFManipulatorPIL() self.assertEqual( m.api_version, '2.0' )
def test_do_format(self): m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # default is jpeg m.do_first() self.assertEqual( m.do_format(None), None ) img = Image.open(m.outfile) self.assertEqual( img.format, 'JPEG' ) m.cleanup() # request jpeg self.assertEqual( m.do_format('jpg'), None ) img = Image.open(m.outfile) self.assertEqual( img.format, 'JPEG' ) m.cleanup() # request png self.assertEqual( m.do_format('png'), None ) img = Image.open(m.outfile) self.assertEqual( img.format, 'PNG' ) m.cleanup() # request webp self.assertEqual( m.do_format('webp'), None ) img = Image.open(m.outfile) self.assertEqual( img.format, 'WEBP' ) m.cleanup() # request tiff, not supported self.assertRaises( IIIFError, m.do_format, 'tif' ) # request jp2, not supported self.assertRaises( IIIFError, m.do_format, 'jp2' ) # request other, not supported self.assertRaises( IIIFError, m.do_format, 'other' ) # save to specific location m.outfile = tempfile.NamedTemporaryFile(delete=True).name self.assertFalse( os.path.exists(m.outfile) ) #check setup m.do_first() self.assertEqual( m.do_format(None), None ) self.assertTrue( os.path.exists(m.outfile) )
def test_cleanup(self): m = IIIFManipulatorPIL() m.outtmp = None self.assertEqual( m.cleanup(), None ) m.outtmp = '/this_will_not_exits_really_I_hope' self.assertEqual( m.cleanup(), None )
def test_do_rotation(self): m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # noop, no rotation m.do_first() self.assertEqual( m.do_rotation(False,0.0), None ) self.assertEqual( m.image.size, (175,131) ) # mirror - FIXME - tests only run, not image m.do_first() self.assertEqual( m.do_rotation(True,0.0), None ) self.assertEqual( m.image.size, (175,131) ) # rotate m.do_first() self.assertEqual( m.do_rotation(False, 30.0), None ) self.assertEqual( m.image.size, (218, 202) )
def test_do_quality(self): m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # noop, no change m.do_first() self.assertEqual( m.do_quality(None), None ) self.assertEqual( m.image.mode, 'RGB' ) # color is also no change m.do_first() self.assertEqual( m.do_quality('color'), None ) self.assertEqual( m.image.mode, 'RGB' ) # grey and gray m.do_first() self.assertEqual( m.do_quality('grey'), None ) self.assertEqual( m.image.mode, 'L' ) m.do_first() self.assertEqual( m.do_quality('gray'), None ) self.assertEqual( m.image.mode, 'L' ) # bitonal m.do_first() self.assertEqual( m.do_quality('bitonal'), None ) self.assertEqual( m.image.mode, '1' )
def test06_do_rotation(self): """Test rotation.""" m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # noop, no rotation m.do_first() self.assertEqual(m.do_rotation(False, 0.0), None) self.assertEqual(m.image.size, (175, 131)) # mirror - FIXME - tests only run, not image m.do_first() self.assertEqual(m.do_rotation(True, 0.0), None) self.assertEqual(m.image.size, (175, 131)) # rotate m.do_first() self.assertEqual(m.do_rotation(False, 30.0), None) self.assertEqual(m.image.size, (218, 202))
def test06_do_rotation(self): """Test rotation.""" m = IIIFManipulatorPIL() m.srcfile = 'testimages/test1.png' # noop, no rotation m.do_first() self.assertEqual(m.do_rotation(False, 0.0), None) self.assertEqual(m.image.size, (175, 131)) # mirror - FIXME - tests only run, not image m.do_first() self.assertEqual(m.do_rotation(True, 0.0), None) self.assertEqual(m.image.size, (175, 131)) # rotate m.do_first() self.assertEqual(m.do_rotation(False, 30.0), None) # there is variability between Pillow 4 & 5 py2/3, # so allow some variation (w, h) = m.image.size self.assertIn(w, (218, 219)) self.assertIn(h, (201, 202))