Exemplo n.º 1
0
 def __fixup(self, im1):
     # convert image to suitable mode
     if isinstance(im1, _Operand):
         # argument was an image.
         if im1.im.mode in ("1", "L"):
             return im1.im.convert("I")
         elif im1.im.mode in ("I", "F"):
             return im1.im
         else:
             raise ValueError, "unsupported mode: %s" % im1.im.mode
     else:
         # argument was a constant
         if _isconstant(im1) and self.im.mode in ("1", "L", "I"):
             return Image.new("I", self.im.size, im1)
         else:
             return Image.new("F", self.im.size, im1)
Exemplo n.º 2
0
 def __fixup(self, im1):
     # convert image to suitable mode
     if isinstance(im1, _Operand):
         # argument was an image.
         if im1.im.mode in ("1", "L"):
             return im1.im.convert("I")
         elif im1.im.mode in ("I", "F"):
             return im1.im
         else:
             raise ValueError, "unsupported mode: %s" % im1.im.mode
     else:
         # argument was a constant
         if _isconstant(im1) and self.im.mode in ("1", "L", "I"):
             return Image.new("I", self.im.size, im1)
         else:
             return Image.new("F", self.im.size, im1)
Exemplo n.º 3
0
def expand(image, border=0, fill=0):
    "Add border to image"
    left, top, right, bottom = _border(border)
    width = left + image.size[0] + right
    height = top + image.size[1] + bottom
    out = Image.new(image.mode, (width, height), _color(fill, image.mode))
    out.paste(image, (left, top))
    return out
Exemplo n.º 4
0
def expand(image, border=0, fill=0):
    "Add border to image"
    left, top, right, bottom = _border(border)
    width = left + image.size[0] + right
    height = top + image.size[1] + bottom
    out = Image.new(image.mode, (width, height), _color(fill, image.mode))
    out.paste(image, (left, top))
    return out
Exemplo n.º 5
0
def build_prototype_image():
    image = Image.new("L", (1,len(_Palm8BitColormapValues),))
    image.putdata(range(len(_Palm8BitColormapValues)))
    palettedata = ()
    for i in range(len(_Palm8BitColormapValues)):
        palettedata = palettedata + _Palm8BitColormapValues[i]
    for i in range(256 - len(_Palm8BitColormapValues)):
        palettedata = palettedata + (0, 0, 0)
    image.putpalette(palettedata)
    return image
Exemplo n.º 6
0
def build_prototype_image():
    image = Image.new("L", (
        1,
        len(_Palm8BitColormapValues),
    ))
    image.putdata(range(len(_Palm8BitColormapValues)))
    palettedata = ()
    for i in range(len(_Palm8BitColormapValues)):
        palettedata = palettedata + _Palm8BitColormapValues[i]
    for i in range(256 - len(_Palm8BitColormapValues)):
        palettedata = palettedata + (0, 0, 0)
    image.putpalette(palettedata)
    return image
Exemplo n.º 7
0
 def apply(self, op, im1, im2=None, mode=None):
     im1 = self.__fixup(im1)
     if im2 is None:
         # unary operation
         out = Image.new(mode or im1.mode, im1.size, None)
         im1.load()
         try:
             op = getattr(_imagingmath, op + "_" + im1.mode)
         except AttributeError:
             raise TypeError, "bad operand type for '%s'" % op
         _imagingmath.unop(op, out.im.id, im1.im.id)
     else:
         # binary operation
         im2 = self.__fixup(im2)
         if im1.mode != im2.mode:
             # convert both arguments to floating point
             if im1.mode != "F": im1 = im1.convert("F")
             if im2.mode != "F": im2 = im2.convert("F")
             if im1.mode != im2.mode:
                 raise ValueError, "mode mismatch"
         if im1.size != im2.size:
             # crop both arguments to a common size
             size = (min(im1.size[0],
                         im2.size[0]), min(im1.size[1], im2.size[1]))
             if im1.size != size: im1 = im1.crop((0, 0) + size)
             if im2.size != size: im2 = im2.crop((0, 0) + size)
             out = Image.new(mode or im1.mode, size, None)
         else:
             out = Image.new(mode or im1.mode, im1.size, None)
         im1.load()
         im2.load()
         try:
             op = getattr(_imagingmath, op + "_" + im1.mode)
         except AttributeError:
             raise TypeError, "bad operand type for '%s'" % op
         _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id)
     return _Operand(out)
Exemplo n.º 8
0
 def apply(self, op, im1, im2=None, mode=None):
     im1 = self.__fixup(im1)
     if im2 is None:
         # unary operation
         out = Image.new(mode or im1.mode, im1.size, None)
         im1.load()
         try:
             op = getattr(_imagingmath, op+"_"+im1.mode)
         except AttributeError:
             raise TypeError, "bad operand type for '%s'" % op
         _imagingmath.unop(op, out.im.id, im1.im.id)
     else:
         # binary operation
         im2 = self.__fixup(im2)
         if im1.mode != im2.mode:
             # convert both arguments to floating point
             if im1.mode != "F": im1 = im1.convert("F")
             if im2.mode != "F": im2 = im2.convert("F")
             if im1.mode != im2.mode:
                 raise ValueError, "mode mismatch"
         if im1.size != im2.size:
             # crop both arguments to a common size
             size = (min(im1.size[0], im2.size[0]),
                     min(im1.size[1], im2.size[1]))
             if im1.size != size: im1 = im1.crop((0, 0) + size)
             if im2.size != size: im2 = im2.crop((0, 0) + size)
             out = Image.new(mode or im1.mode, size, None)
         else:
             out = Image.new(mode or im1.mode, im1.size, None)
         im1.load(); im2.load()
         try:
             op = getattr(_imagingmath, op+"_"+im1.mode)
         except AttributeError:
             raise TypeError, "bad operand type for '%s'" % op
         _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id)
     return _Operand(out)
Exemplo n.º 9
0
    def compile(self):
        "Create metrics and bitmap"

        if self.bitmap:
            return

        # create bitmap large enough to hold all data
        h = w = maxwidth = 0
        lines = 1
        for glyph in self:
            if glyph:
                d, dst, src, im = glyph
                h = max(h, src[3] - src[1])
                w = w + (src[2] - src[0])
                if w > WIDTH:
                    lines = lines + 1
                    w = (src[2] - src[0])
                maxwidth = max(maxwidth, w)

        xsize = maxwidth
        ysize = lines * h

        if xsize == 0 and ysize == 0:
            return ""

        self.ysize = h

        # paste glyphs into bitmap
        self.bitmap = Image.new("1", (xsize, ysize))
        self.metrics = [None] * 256
        x = y = 0
        for i in range(256):
            glyph = self[i]
            if glyph:
                d, dst, src, im = glyph
                xx, yy = src[2] - src[0], src[3] - src[1]
                x0, y0 = x, y
                x = x + xx
                if x > WIDTH:
                    x, y = 0, y + h
                    x0, y0 = x, y
                    x = xx
                s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0
                self.bitmap.paste(im.crop(src), s)
                # print chr(i), dst, s
                self.metrics[i] = d, dst, s
Exemplo n.º 10
0
def bdf_char(f):

    # skip to STARTCHAR
    while 1:
        s = f.readline()
        if not s:
            return None
        if s[:9] == "STARTCHAR":
            break
    id = string.strip(s[9:])

    # load symbol properties
    props = {}
    while 1:
        s = f.readline()
        if not s or s[:6] == "BITMAP":
            break
        i = string.find(s, " ")
        props[s[:i]] = s[i + 1:-1]

    # load bitmap
    bitmap = []
    while 1:
        s = f.readline()
        if not s or s[:7] == "ENDCHAR":
            break
        bitmap.append(s[:-1])
    bitmap = string.join(bitmap, "")

    [x, y, l, d] = map(int, string.split(props["BBX"]))
    [dx, dy] = map(int, string.split(props["DWIDTH"]))

    bbox = (dx, dy), (l, -d - y, x + l, -d), (0, 0, x, y)

    try:
        im = Image.fromstring("1", (x, y), bitmap, "hex", "1")
    except ValueError:
        # deal with zero-width characters
        im = Image.new("1", (x, y))

    return id, int(props["ENCODING"]), bbox, im
Exemplo n.º 11
0
def bdf_char(f):

    # skip to STARTCHAR
    while 1:
        s = f.readline()
        if not s:
            return None
        if s[:9] == "STARTCHAR":
            break
    id = string.strip(s[9:])

    # load symbol properties
    props = {}
    while 1:
        s = f.readline()
        if not s or s[:6] == "BITMAP":
            break
        i = string.find(s, " ")
        props[s[:i]] = s[i+1:-1]

    # load bitmap
    bitmap = []
    while 1:
        s = f.readline()
        if not s or s[:7] == "ENDCHAR":
            break
        bitmap.append(s[:-1])
    bitmap = string.join(bitmap, "")

    [x, y, l, d] = map(int, string.split(props["BBX"]))
    [dx, dy] = map(int, string.split(props["DWIDTH"]))

    bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y)

    try:
        im = Image.fromstring("1", (x, y), bitmap, "hex", "1")
    except ValueError:
        # deal with zero-width characters
        im = Image.new("1", (x, y))

    return id, int(props["ENCODING"]), bbox, im
Exemplo n.º 12
0
    return read_32(fobj, (start + 4, length - 4), (width, height))

def read_32(fobj, (start, length), size):
    """
    Read a 32bit RGB icon resource.  Seems to be either uncompressed or
    an RLE packbits-like scheme.
    """
    fobj.seek(start)
    sizesq = size[0] * size[1]
    if length == sizesq * 3:
        # uncompressed ("RGBRGBGB")
        indata = fobj.read(length)
        im = Image.frombuffer("RGB", size, indata, "raw", "RGB", 0, 1)
    else:
        # decode image
        im = Image.new("RGB", size, None)
        for band_ix in range(3):
            data = []
            bytesleft = sizesq
            while bytesleft > 0:
                byte = fobj.read(1)
                if not byte:
                    break
                byte = ord(byte)
                if byte & 0x80:
                    blocksize = byte - 125
                    byte = fobj.read(1)
                    for i in range(blocksize):
                        data.append(byte)
                else:
                    blocksize = byte + 1
Exemplo n.º 13
0
 def __init__(self, image, size=None, color=None):
     if not hasattr(image, "im"):
         image = Image.new(image, size, color)
     self.draw = ImageDraw.Draw(image)
     self.image = image
     self.transform = None
Exemplo n.º 14
0
 def __init__(self, image):
     self.image = image
     self.degenerate = Image.new(image.mode, image.size, 0)
Exemplo n.º 15
0
 def __init__(self, image):
     self.image = image
     mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5)
     self.degenerate = Image.new("L", image.size, mean).convert(image.mode)
Exemplo n.º 16
0
def _save(im, fp, filename):
    resolution = im.encoderinfo.get("resolution", 72.0)

    #
    # make sure image data is available
    im.load()

    xref = [0] * (5 + 1)  # placeholders

    fp.write("%PDF-1.2\n")
    fp.write("% created by PIL PDF driver " + __version__ + "\n")

    #
    # Get image characteristics

    width, height = im.size

    # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits)
    # or LZWDecode (tiff/lzw compression).  Note that PDF 1.2 also supports
    # Flatedecode (zip compression).

    bits = 8
    params = None

    if im.mode == "1":
        filter = "/ASCIIHexDecode"
        colorspace = "/DeviceGray"
        procset = "/ImageB"  # grayscale
        bits = 1
    elif im.mode == "L":
        filter = "/DCTDecode"
        # params = "<< /Predictor 15 /Columns %d >>" % (width-2)
        colorspace = "/DeviceGray"
        procset = "/ImageB"  # grayscale
    elif im.mode == "P":
        filter = "/ASCIIHexDecode"
        colorspace = "[ /Indexed /DeviceRGB 255 <"
        palette = im.im.getpalette("RGB")
        for i in range(256):
            r = ord(palette[i * 3])
            g = ord(palette[i * 3 + 1])
            b = ord(palette[i * 3 + 2])
            colorspace = colorspace + "%02x%02x%02x " % (r, g, b)
        colorspace = colorspace + "> ]"
        procset = "/ImageI"  # indexed color
    elif im.mode == "RGB":
        filter = "/DCTDecode"
        colorspace = "/DeviceRGB"
        procset = "/ImageC"  # color images
    elif im.mode == "CMYK":
        filter = "/DCTDecode"
        colorspace = "/DeviceCMYK"
        procset = "/ImageC"  # color images
    else:
        raise ValueError("cannot save mode %s" % im.mode)

    #
    # catalogue

    xref[1] = fp.tell()
    _obj(fp, 1, Type="/Catalog", Pages="2 0 R")
    _endobj(fp)

    #
    # pages

    xref[2] = fp.tell()
    _obj(fp, 2, Type="/Pages", Count=1, Kids="[4 0 R]")
    _endobj(fp)

    #
    # image

    op = StringIO.StringIO()

    if filter == "/ASCIIHexDecode":
        if bits == 1:
            # FIXME: the hex encoder doesn't support packed 1-bit
            # images; do things the hard way...
            data = im.tostring("raw", "1")
            im = Image.new("L", (len(data), 1), None)
            im.putdata(data)
        ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)])
    elif filter == "/DCTDecode":
        ImageFile._save(im, op, [("jpeg", (0, 0) + im.size, 0, im.mode)])
    elif filter == "/FlateDecode":
        ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)])
    elif filter == "/RunLengthDecode":
        ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)])
    else:
        raise ValueError("unsupported PDF filter (%s)" % filter)

    xref[3] = fp.tell()
    _obj(
        fp,
        3,
        Type="/XObject",
        Subtype="/Image",
        Width=width,  # * 72.0 / resolution,
        Height=height,  # * 72.0 / resolution,
        Length=len(op.getvalue()),
        Filter=filter,
        BitsPerComponent=bits,
        DecodeParams=params,
        ColorSpace=colorspace,
    )

    fp.write("stream\n")
    fp.write(op.getvalue())
    fp.write("\nendstream\n")

    _endobj(fp)

    #
    # page

    xref[4] = fp.tell()
    _obj(fp, 4)
    fp.write(
        "<<\n/Type /Page\n/Parent 2 0 R\n"
        "/Resources <<\n/ProcSet [ /PDF %s ]\n"
        "/XObject << /image 3 0 R >>\n>>\n"
        "/MediaBox [ 0 0 %d %d ]\n/Contents 5 0 R\n>>\n"
        % (procset, int(width * 72.0 / resolution), int(height * 72.0 / resolution))
    )
    _endobj(fp)

    #
    # page contents

    op = StringIO.StringIO()

    op.write("q %d 0 0 %d 0 0 cm /image Do Q\n" % (int(width * 72.0 / resolution), int(height * 72.0 / resolution)))

    xref[5] = fp.tell()
    _obj(fp, 5, Length=len(op.getvalue()))

    fp.write("stream\n")
    fp.write(op.getvalue())
    fp.write("\nendstream\n")

    _endobj(fp)

    #
    # trailer
    startxref = fp.tell()
    fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref))
    for x in xref[1:]:
        fp.write("%010d 00000 n \n" % x)
    fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref))
    fp.write("startxref\n%d\n%%%%EOF\n" % startxref)
    fp.flush()
Exemplo n.º 17
0
def _save(im, fp, filename):
    resolution = im.encoderinfo.get("resolution", 72.0)

    #
    # make sure image data is available
    im.load()

    xref = [0] * (5 + 1)  # placeholders

    fp.write("%PDF-1.2\n")
    fp.write("% created by PIL PDF driver " + __version__ + "\n")

    #
    # Get image characteristics

    width, height = im.size

    # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits)
    # or LZWDecode (tiff/lzw compression).  Note that PDF 1.2 also supports
    # Flatedecode (zip compression).

    bits = 8
    params = None

    if im.mode == "1":
        filter = "/ASCIIHexDecode"
        colorspace = "/DeviceGray"
        procset = "/ImageB"  # grayscale
        bits = 1
    elif im.mode == "L":
        filter = "/DCTDecode"
        # params = "<< /Predictor 15 /Columns %d >>" % (width-2)
        colorspace = "/DeviceGray"
        procset = "/ImageB"  # grayscale
    elif im.mode == "P":
        filter = "/ASCIIHexDecode"
        colorspace = "[ /Indexed /DeviceRGB 255 <"
        palette = im.im.getpalette("RGB")
        for i in range(256):
            r = ord(palette[i * 3])
            g = ord(palette[i * 3 + 1])
            b = ord(palette[i * 3 + 2])
            colorspace = colorspace + "%02x%02x%02x " % (r, g, b)
        colorspace = colorspace + "> ]"
        procset = "/ImageI"  # indexed color
    elif im.mode == "RGB":
        filter = "/DCTDecode"
        colorspace = "/DeviceRGB"
        procset = "/ImageC"  # color images
    elif im.mode == "CMYK":
        filter = "/DCTDecode"
        colorspace = "/DeviceCMYK"
        procset = "/ImageC"  # color images
    else:
        raise ValueError("cannot save mode %s" % im.mode)

    #
    # catalogue

    xref[1] = fp.tell()
    _obj(fp, 1, Type="/Catalog", Pages="2 0 R")
    _endobj(fp)

    #
    # pages

    xref[2] = fp.tell()
    _obj(fp, 2, Type="/Pages", Count=1, Kids="[4 0 R]")
    _endobj(fp)

    #
    # image

    op = StringIO.StringIO()

    if filter == "/ASCIIHexDecode":
        if bits == 1:
            # FIXME: the hex encoder doesn't support packed 1-bit
            # images; do things the hard way...
            data = im.tostring("raw", "1")
            im = Image.new("L", (len(data), 1), None)
            im.putdata(data)
        ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)])
    elif filter == "/DCTDecode":
        ImageFile._save(im, op, [("jpeg", (0, 0) + im.size, 0, im.mode)])
    elif filter == "/FlateDecode":
        ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)])
    elif filter == "/RunLengthDecode":
        ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)])
    else:
        raise ValueError("unsupported PDF filter (%s)" % filter)

    xref[3] = fp.tell()
    _obj(
        fp,
        3,
        Type="/XObject",
        Subtype="/Image",
        Width=width,  # * 72.0 / resolution,
        Height=height,  # * 72.0 / resolution,
        Length=len(op.getvalue()),
        Filter=filter,
        BitsPerComponent=bits,
        DecodeParams=params,
        ColorSpace=colorspace)

    fp.write("stream\n")
    fp.write(op.getvalue())
    fp.write("\nendstream\n")

    _endobj(fp)

    #
    # page

    xref[4] = fp.tell()
    _obj(fp, 4)
    fp.write("<<\n/Type /Page\n/Parent 2 0 R\n"\
             "/Resources <<\n/ProcSet [ /PDF %s ]\n"\
             "/XObject << /image 3 0 R >>\n>>\n"\
             "/MediaBox [ 0 0 %d %d ]\n/Contents 5 0 R\n>>\n" %\
             (procset, int(width * 72.0 /resolution) , int(height * 72.0 / resolution)))
    _endobj(fp)

    #
    # page contents

    op = StringIO.StringIO()

    op.write("q %d 0 0 %d 0 0 cm /image Do Q\n" %
             (int(width * 72.0 / resolution), int(height * 72.0 / resolution)))

    xref[5] = fp.tell()
    _obj(fp, 5, Length=len(op.getvalue()))

    fp.write("stream\n")
    fp.write(op.getvalue())
    fp.write("\nendstream\n")

    _endobj(fp)

    #
    # trailer
    startxref = fp.tell()
    fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref))
    for x in xref[1:]:
        fp.write("%010d 00000 n \n" % x)
    fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref))
    fp.write("startxref\n%d\n%%%%EOF\n" % startxref)
    fp.flush()
Exemplo n.º 18
0
 def apply(self, im, imOut=None):
     im.load()
     if imOut is None:
         imOut = Image.new(self.output_mode, im.size, None)
     result = self.transform.apply(im.im.id, imOut.im.id)
     return imOut
Exemplo n.º 19
0
def constant(image, value):
    "Fill a channel with a given grey level"

    return Image.new("L", image.size, value)
Exemplo n.º 20
0
 def __init__(self, image, size=None, color=None):
     if not hasattr(image, "im"):
         image = Image.new(image, size, color)
     self.draw = ImageDraw.Draw(image)
     self.image = image
     self.transform = None