def print_image_sizes(dir=os.curdir): """Calculate image sizes. """ import ImageH, glob os.chdir(dir) filelist = [] suffixlist = ('*.gif','*.GIF','*.jpg','*.JPG','*.jpeg','*.JPEG','*.png','*.PNG') for suffix in suffixlist: filelist = filelist + glob.glob1('', suffix) for file in filelist: (width, height) = ImageH.open(file).size print "('%s', %d, %d)" % (file, width, height)
def _save(im, fp, tile): "Helper to save image based on tile list" im.load() if not hasattr(im, "encoderconfig"): im.encoderconfig = () tile.sort(_tilesort) bufsize = max(MAXBLOCK, im.size[0] * 4) # see RawEncode.c try: fh = fp.fileno() fp.flush() except AttributeError: # compress to Python file-compatible object for e, b, o, a in tile: e = ImageH._getencoder(im.mode, e, a, im.encoderconfig) if o > 0: fp.seek(o, 0) e.setimage(im.im, b) while 1: l, s, d = e.encode(bufsize) fp.write(d) if s: break if s < 0: raise IOError, "encoder error %d when writing image file" % s else: # slight speedup: compress to real file object for e, b, o, a in tile: e = ImageH._getencoder(im.mode, e, a, im.encoderconfig) if o > 0: fp.seek(o, 0) e.setimage(im.im, b) s = e.encode_to_file(fh, bufsize) if s < 0: raise IOError, "encoder error %d when writing image file" % s try: fp.flush() except: pass
def print_image_sizes(dir=os.curdir): """Calculate image sizes. """ import ImageH, glob os.chdir(dir) filelist = [] suffixlist = ('*.gif', '*.GIF', '*.jpg', '*.JPG', '*.jpeg', '*.JPEG', '*.png', '*.PNG') for suffix in suffixlist: filelist = filelist + glob.glob1('', suffix) for file in filelist: (width, height) = ImageH.open(file).size print "('%s', %d, %d)" % (file, width, height)
except KeyError: raise IOError, "cannot write mode %s as JPEG" % im.mode # get keyword arguments im.encoderconfig = (_fetch(im.encoderinfo, "quality", 0), im.encoderinfo.has_key("progressive"), _fetch(im.encoderinfo, "smooth", 0), im.encoderinfo.has_key("optimize"), _fetch(im.encoderinfo, "streamtype", 0)) ImageFileH._save(im, fp, [("jpeg", (0,0)+im.size, 0, rawmode)]) def _save_hack(im, fp, filename): # ALTERNATIVE: handle JPEGs via the IJG command line utilities. import os file = im._dump() os.system("cjpeg %s >%s" % (file, filename)) try: os.unlink(file) except: pass # -------------------------------------------------------------------q- # Registry stuff ImageH.register_open("JPEG", JpegImageFile, _accept) ImageH.register_save("JPEG", _save) ImageH.register_extension("JPEG", ".jfif") ImageH.register_extension("JPEG", ".jpe") ImageH.register_extension("JPEG", ".jpg") ImageH.register_extension("JPEG", ".jpeg") ImageH.register_mime("JPEG", "image/jpeg")
def load(self): "Load image data based on tile list" ImageH.Image.load(self) if self.tile == None: raise IOError, "cannot load this image" if not self.tile: return # ------------------------------------------------------------ # memory mapping. self.map = None if self.filename and len(self.tile) == 1: d, e, o, a = self.tile[0] if d == "raw" and a[0] in ("L", "P", "RGBX", "RGBA"): # FIXME: add support for "F" and "I" too try: self.map = ImageH.core.map(self.filename) self.map.seek(o) self.im = self.map.readimage(self.mode, self.size, a[1], a[2]) except (AttributeError, IOError): self.map = None # create image if necessary if not self.im or\ self.im.mode != self.mode or self.im.size != self.size: self.im = ImageH.core.new(self.mode, self.size) # create palette (optional) if self.mode == "P": ImageH.Image.load(self) if not self.map: # process tiles in file order self.tile.sort(_tilesort) for d, e, o, a in self.tile: d = ImageH._getdecoder(d, e, a, self.decoderconfig) self.load_seek(o) try: d.setimage(self.im, e) except ValueError: continue try: # FIXME: This is a hack to handle TIFF's JpegTables tag. b = self.tile_prefix except AttributeError: b = "" t = len(b) while 1: s = self.load_read(self.decodermaxblock) if not s: self.tile = [] raise IOError, "image file is truncated, %d bytes left" % len( b) b = b + s n, e = d.decode(b) if n < 0: break b = b[n:] t = t + n self.tile = [] self.fp = None # might be shared if not self.map and e < 0: raise IOError, "decoder error %d when reading image file" % e # post processing if hasattr(self, "tile_post_rotate"): # FIXME: This is a hack to handle rotated PCD's self.im = self.im.rotate(self.tile_post_rotate) self.size = self.im.size self.load_end()
def load(self): "Load image data based on tile list" ImageH.Image.load(self) if self.tile == None: raise IOError, "cannot load this image" if not self.tile: return # ------------------------------------------------------------ # memory mapping. self.map = None if self.filename and len(self.tile) == 1: d, e, o, a = self.tile[0] if d == "raw" and a[0] in ("L", "P", "RGBX", "RGBA"): # FIXME: add support for "F" and "I" too try: self.map = ImageH.core.map(self.filename) self.map.seek(o) self.im = self.map.readimage( self.mode, self.size, a[1], a[2] ) except (AttributeError, IOError): self.map = None # create image if necessary if not self.im or\ self.im.mode != self.mode or self.im.size != self.size: self.im = ImageH.core.new(self.mode, self.size) # create palette (optional) if self.mode == "P": ImageH.Image.load(self) if not self.map: # process tiles in file order self.tile.sort(_tilesort) for d, e, o, a in self.tile: d = ImageH._getdecoder(d, e, a, self.decoderconfig) self.load_seek(o) try: d.setimage(self.im, e) except ValueError: continue try: # FIXME: This is a hack to handle TIFF's JpegTables tag. b = self.tile_prefix except AttributeError: b = "" t = len(b) while 1: s = self.load_read(self.decodermaxblock) if not s: self.tile = [] raise IOError, "image file is truncated, %d bytes left" % len(b) b = b + s n, e = d.decode(b) if n < 0: break b = b[n:] t = t + n self.tile = [] self.fp = None # might be shared if not self.map and e < 0: raise IOError, "decoder error %d when reading image file" % e # post processing if hasattr(self, "tile_post_rotate"): # FIXME: This is a hack to handle rotated PCD's self.im = self.im.rotate(self.tile_post_rotate) self.size = self.im.size self.load_end()
o16(offset[0]) + # offset o16(offset[1]) + o16(im.size[0]) + # size o16(im.size[1]) + chr(0) + # flags chr(8)) # bits ImageFileH._save(im, fp, [("gif", (0,0)+im.size, 0, RAWMODE[im.mode])]) fp.write("\0") # end of image data finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry ImageH.register_open(GifImageFile.format, GifImageFile, _accept) ImageH.register_save(GifImageFile.format, _save) ImageH.register_extension(GifImageFile.format, ".gif") ImageH.register_mime(GifImageFile.format, "image/gif") # # Uncomment the following line if you wish to use NETPBM/PBMPLUS # instead of the built-in "uncompressed" GIF encoder # Image.register_save(GifImageFile.format, _save_netpbm)
# local image header fp.write("," + o16(offset[0]) + # offset o16(offset[1]) + o16(im.size[0]) + # size o16(im.size[1]) + chr(0) + # flags chr(8)) # bits ImageFileH._save(im, fp, [("gif", (0, 0) + im.size, 0, RAWMODE[im.mode])]) fp.write("\0") # end of image data finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry ImageH.register_open(GifImageFile.format, GifImageFile, _accept) ImageH.register_save(GifImageFile.format, _save) ImageH.register_extension(GifImageFile.format, ".gif") ImageH.register_mime(GifImageFile.format, "image/gif") # # Uncomment the following line if you wish to use NETPBM/PBMPLUS # instead of the built-in "uncompressed" GIF encoder # Image.register_save(GifImageFile.format, _save_netpbm)
pass def append(self, chunk): self.data.append(chunk) def append(fp, cid, *data): data = string.join(data, "") hi, lo = ImageH.core.crc32(data, ImageH.core.crc32(cid)) crc = o16(hi) + o16(lo) fp.append((cid, data, crc)) fp = collector() try: im.encoderinfo = params _save(im, fp, None, append) finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry ImageH.register_open("PNG", PngImageFile, _accept) ImageH.register_save("PNG", _save) ImageH.register_extension("PNG", ".png") ImageH.register_mime("PNG", "image/png")
def append(self, chunk): self.data.append(chunk) def append(fp, cid, *data): data = string.join(data, "") hi, lo = ImageH.core.crc32(data, ImageH.core.crc32(cid)) crc = o16(hi) + o16(lo) fp.append((cid, data, crc)) fp = collector() try: im.encoderinfo = params _save(im, fp, None, append) finally: del im.encoderinfo return fp.data # -------------------------------------------------------------------- # Registry ImageH.register_open("PNG", PngImageFile, _accept) ImageH.register_save("PNG", _save) ImageH.register_extension("PNG", ".png") ImageH.register_mime("PNG", "image/png")