TypeError: argument 1 must be ImagingCore, not Ima

2019-07-18 06:11发布

Under the Windows I get this error. How to fix PIL?

This is error: TypeError: argument 1 must be ImagingCore, not ImagingCore

#!/usr/bin/python
## -*- coding: utf-8 -*-

from PIL import Image, ImageFont
import ImageDraw, StringIO, string
from random import *
from math import *

import os
SITE_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))

class Captcha3d(object):

    _hypot = 4
    _xx, _yy = 35, 70
    _CIMAGE = None
    _CHARS = string.ascii_lowercase + string.ascii_uppercase + string.digits
    _TEXT = ''

    def __init__(self):
        self._CIMAGE = Image.new("RGB", (self._yy * self._hypot, self._xx * self._hypot), (255,255,255))
        self.generateCode()
        self.render()

    def imageColorAllocate(self, r,g,b):
        hexchars = "0123456789ABCDEF"
        hexcolor = hexchars[r / 16] + hexchars[r % 16] + hexchars[g / 16] + hexchars[g % 16] + hexchars[b / 16] + hexchars[b % 16]
        return int(hexcolor, 16)

    def generateCode(self):
        chars = self._CHARS
        self._TEXT = "".join(choice(chars) for x in range(randint(3, 3)))

    def getText(self):
        return self._TEXT

    def getProection(self, x1,y1,z1):
        x = x1 * self._hypot
        y = z1 * self._hypot
        z = -y1 * self._hypot

        xx = 0.707106781187
        xy = 0
        xz = -0.707106781187

        yx = 0.408248290464
        yy = 0.816496580928
        yz = 0.408248290464 # 1/sqrt(6)

        cx = xx*x + xy*y + xz*z
        cy = yx*x + yy*y + yz*z + 20*self._hypot

        return [cx, cy]

    def zFunction(self, x,y):
        z = 2.6
        if self._CIMAGE.getpixel((y/2,x/2)) == (0,0,0):
            z = 0
        if z != 0:
            z += float(randint(0,60))/100
        z += 1.4 * sin((x+self.startX)*pi/15) * sin((y+self.startY)*pi/15)
        return z

    def render(self):
        fontSans = ImageFont.truetype(os.path.join(SITE_PATH, "data", "fonts", "FreeSans.ttf"), 14)

        draw = ImageDraw.Draw(self._CIMAGE)

        whiteColor = 'white'
        draw.rectangle([0, 0, self._yy * self._hypot, self._xx * self._hypot], fill=whiteColor)

        #textColor = 'black'
        #imgtext = Image.open("i8n.png")
        #self._CIMAGE.paste(imgtext, (0,0))
        imgtext = Image.new("1", (self._yy * self._hypot, self._xx * self._hypot), (1))
        drawtext = ImageDraw.Draw(imgtext)
        drawtext.text((1,0), self._TEXT, font=fontSans, fill=0)
        self._CIMAGE.paste(imgtext, (0,0))

        #draw.text((2,0), self.text, font=fontSans, fill=textColor)

        self.startX = randint(0,self._xx)
        self.startY = randint(0,self._yy)

        crd = {}

        x = 0
        while x < (self._xx+1):
            y = 0
            while y < (self._yy+1):
                crd[str(x) + '&' + str(y)] = self.getProection(x,y,self.zFunction(x,y))
                y += 1
            x += 1

        x = 0
        while x < self._xx:
            y = 0
            while y < self._yy:
                coord = []
                coord.append((int(crd[str(x) + '&' + str(y)][0]),int(crd[str(x) + '&' + str(y)][1])))
                coord.append((int(crd[str(x+1) + '&' + str(y)][0]),int(crd[str(x+1) + '&' + str(y)][1])))
                coord.append((int(crd[str(x+1) + '&' + str(y+1)][0]),int(crd[str(x+1) + '&' + str(y+1)][1])))
                coord.append((int(crd[str(x) + '&' + str(y+1)][0]),int(crd[str(x) + '&' + str(y+1)][1])))

                c = int(self.zFunction(x,y)*32)
                linesColor = (c,c,c)
                draw.polygon(coord, fill=whiteColor, outline=linesColor)
                #draw.polygon(coord, fill=whiteColor)
                y += 1
            x += 1

        draw.rectangle([0, 0, self._xx, self._yy], fill=whiteColor)

        #draw.text((2,0), self.text, font=fontSans, fill=textColor)
        #imageString($this->image, 1, 3, 0, (microtime(true)-$this->time), $textColor);

        del draw
        #self._CIMAGE.save("image.png", "PNG")
        return [self._CIMAGE, self._TEXT]

def main():
    a = Captcha3d()
    print a.getText()

if __name__ == '__main__':
    main()

3条回答
成全新的幸福
2楼-- · 2019-07-18 06:28

importing all PIL things directly from PIL should always work. However, if you mix imports, as such,

from PIL import Image
import ImageDraw

This can lead to conflict between two un-identical PIL libraries. This can happen if you have installed both PIL and Pillow

We should really always do,

from PIL import Image
from PIL import ImageDraw
etc.

I.e. be specific about which package to use.

查看更多
淡お忘
3楼-- · 2019-07-18 06:34

Also happens for me on OSX 10.6.8, Python 2.6.5. I think some class is getting dynamically imported twice.

Try changing

from PIL import Image, ImageFont

to

import Image, ImageFont

That worked for me.

查看更多
神经病院院长
4楼-- · 2019-07-18 06:36

In my case it solved the situation to also import ImageDraw from PIL

from PIL import ImageDraw
查看更多
登录 后发表回答