Пример #1
0
 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 )
Пример #2
0
 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
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
 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)
Пример #6
0
 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')
Пример #7
0
 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)
Пример #8
0
 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 )
Пример #9
0
 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)
Пример #10
0
 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 )
Пример #11
0
 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)))
Пример #12
0
 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')
Пример #13
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))
Пример #14
0
 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')
Пример #15
0
 def test01_init(self):
     m = IIIFManipulatorPIL()
     self.assertEqual( m.api_version, '2.0' )
Пример #16
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) )
Пример #17
0
 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')
Пример #18
0
 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 )
Пример #19
0
 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) )  
Пример #20
0
 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' )
Пример #21
0
 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))
Пример #22
0
 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))