Files
rdkit/Python/utils/PilTools.py

208 lines
5.0 KiB
Python
Executable File

# $Id$
#
# Copyright (C) 2000,2001,2002,2003 greg Landrum and Rational Discovery LLC
# All Rights Reserved
#
""" tools for working with PIL images
"""
#try:
# from wxPython.wx import *
#except ImportError:
# hasWx=0
#else:
# hasWx=1
hasWx=0
try:
from qt import *
except ImportError:
hasQt = 0
else:
hasQt=1
from Numeric import *
from PIL import Image
# these are here to help the Installer work:
import PIL.ImageFile
import PIL.GifImagePlugin
import PIL.PngImagePlugin
import PIL.JpegImagePlugin
import PIL.BmpImagePlugin
import PIL.TiffImagePlugin
import PIL.PpmImagePlugin
def ResizeImage(origImg,newSize,filter=Image.BILINEAR,maintainAspect=0,
priorityX=1):
"""Resizes an image to fit a given space. The new image is returned.
**Arguments**
- origImg: a PIL image
- newSize: the requested size (either a 2-tuple or a list 2 elements long)
- filter: the filter to be used in resizing the image
- maintainAspect: toggles maintaining the aspect ratio of the image
- prioritiyX: (only meaningful when _maintainAspect_ is nonzero)
if nonzero, the X size will be given priority in setting the new size,
otherwise the Y size will take priority
**Returns**
a PIL image
**Notes**
- if maintainAspect is nonzero, the aspect ratio of the image
will not be changed. This implies that the final image may not
actually be the requested size.
"""
if maintainAspect:
if priorityX:
scaleFact = float(origImg.size[0])/newSize[0]
else:
scaleFact = float(origImg.size[1])/newSize[1]
newSize = (int(origImg.size[0]*scaleFact),int(origImg.size[1].scaleFact))
newImg = origImg.resize(newSize,filter)
return newImg
def FitImage(origImg,newSize,filter=Image.BILINEAR,bgColor=(255,255,255)):
"""Fits an image into a box of a particular size.
**Arguments**
- origImg: a PIL image
- newSize: the requested size (either a 2-tuple or a list 2 elements long)
- filter: the filter to be used in resizing the image
- bgColor: the background color to start with
**Returns**
a PIL image
**Notes**
- there may be blank spaces around the original image in the new image,
these will be filled with _bgColor_
"""
tmpImg = origImg.convert('RGB')
newImg = Image.new(tmpImg.mode,newSize,bgColor)
scaleFact = min(float(newSize[0])/origImg.size[0],
float(newSize[1])/origImg.size[1])
if scaleFact < 1:
tImg = origImg.resize((int(origImg.size[0]*scaleFact),int(origImg.size[1]*scaleFact)),filter)
else:
tImg = origImg
xDiff = newSize[0] - tImg.size[0]
if xDiff > 0:
xLoc = xDiff/2
else:
xLoc = 0
yDiff = newSize[1] - tImg.size[1]
if yDiff > 0:
yLoc = yDiff/2
else:
yLoc = 0
newImg.paste(tImg,(xLoc,yLoc))
return newImg.convert(origImg.mode)
def NumericMatrixToImage(data,scaleCols=0,transposeIt=0,
minColor=(0,0,0),maxColor=(255,255,255)):
# copy the data
data = array(data,Float)
if transpose:
data = transpose(data)
#nRows,nCols = data.shape
nRows,nCols = data.shape
if scaleCols:
minIndices = argmin(data,0)
maxIndices = argmax(data,0)
mins = zeros(nCols)
maxs = zeros(nCols)
for i in range(nCols):
mins[i] = data[i][minIndices[i]]
maxs[i] = data[i][maxIndices[i]]
# subtract off the minimum
data -= mins
maxs -= mins
# no zeros here please, we're dividing:
maxs += equal(maxs,0.0)
# and divide:
data /= maxs
# okey dokey, get a three D matrix:
imgMat = ones((nRows,nCols,3),Int)
# start at minColor:
minColor = array(minColor)
maxColor = array(maxColor)
imgMat *= minColor
deltaColor = maxColor-minColor
# and move to maxColor:
for i in range(nRows):
for j in range(nCols):
imgMat[i,j] += (deltaColor*data[i,j]).astype(Int)
d = imgMat.astype('b').tostring()
img = Image.fromstring('RGB',(nCols,nRows),d)
return img
if hasWx:
def PilImgToWxBmp(pilImg):
""" converts a PIL image into a wxPython bitmap
**Arguments**
- pilImg: a PIL image
**Returns**
a wxPython bitmap
"""
wxImg = wxEmptyImage(pilImg.size[0],pilImg.size[1])
wxImg.SetData(pilImg.tostring())
bmp = wxImg.ConvertToBitmap()
return bmp
if hasQt:
def PilImgToQPixmap(pilImg):
from StringIO import StringIO
sio = StringIO()
pilImg.save(sio,format='png')
pm = QPixmap()
pm.loadFromData(sio.getvalue())
return pm
if __name__ == '__main__':
if 0:
boxImg = Image.open('12h.gif').convert('RGB')
img1 = ResizeImage(boxImg,(100,200))
img1.save('test1.gif')
img2 = FitImage(boxImg,(100,200),bgColor=(200,200,200))
img2.save('test2.gif')
img3 = FitImage(boxImg,(50,200),bgColor=(200,200,200))
img3.save('test3.gif')
else:
vs = array([[1.,.5,0,0,0,0],[.5,1,.5,1,0,1],[0,.5,1,0,0,1]])
img = NumericMatrixToImage(vs)
img = img.resize((200,200))
img.save('foo.gif')