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()
importing all PIL things directly from PIL should always work. However, if you mix imports, as such,
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,
I.e. be specific about which package to use.
Also happens for me on OSX 10.6.8, Python 2.6.5. I think some class is getting dynamically imported twice.
Try changing
to
That worked for me.
In my case it solved the situation to also import ImageDraw from PIL