Python 使用cImage旋转图像
我正在尝试使用cImage(并且仅使用cImage)将Python中的图像旋转90度,以下是我到目前为止得到的结果Python 使用cImage旋转图像,python,Python,我正在尝试使用cImage(并且仅使用cImage)将Python中的图像旋转90度,以下是我到目前为止得到的结果 def rotateImage90CW(imageFile): myWin = ImageWin("90D", 350, 630) oldIm = FileImage(imageFile) newIm = EmptyImage(350, 630) bigList = [] for row in range(oldIm.getHeight())
def rotateImage90CW(imageFile):
myWin = ImageWin("90D", 350, 630)
oldIm = FileImage(imageFile)
newIm = EmptyImage(350, 630)
bigList = []
for row in range(oldIm.getHeight()):
bigList.append([]);
for column in range(oldIm.getWidth()):
x = oldIm.getPixel(column, row)
bigList[row].append(x)
bigList.reverse()
for row in range(newIm.getHeight()):
for column in range(newIm.getWidth()):
newIm.setPixel(column, row, bigList[column][row])
newIm.draw(myWin)
不幸的是,当我加载函数时,它只会给我一个完全黑色的图像。有人能告诉我我的代码有什么问题吗[谢谢。我使用
map
和zip
基本上转换了您的列表:
从cImage导入ImageWin、FileImage、EmptyImage
def rotate90D(img):
'''
Rotate +90deg
'''
assert img != None, 'Image is empty!'
map(list, zip(*img)) # transpose; this can be called multiple times to rotate to 0, 90, 180, 270
def rotate90D_(img):
'''
Rotate -90deg
'''
assert img != None, 'Image is empty!'
img.reverse()
map(list, zip(*img)) # transpose; this can be called multiple times to rotate to 0, 90, 180, 270
def unshared_copy(inList):
'''
Create a copy of a lists of lists
'''
# I use this because of map(list, zip(*img))
if isinstance(inList, list):
return list( map(unshared_copy, inList) )
return inList
# Load image
oldIm = FileImage('/home/USER/Pictures/google doodles/google-doodle-90th-anniversary-of-the-first-demonstration-of-television-6281357497991168.2-hp.jpg')
# Create two empty image (one for +90deg and another for -90deg
newIm90D = EmptyImage(oldIm.height, oldIm.width)
newIm90D_ = EmptyImage(oldIm.height, oldIm.width)
# Create windows for displaying all the images
myWin0D = ImageWin('0Deg', oldIm.width, oldIm.height)
myWin90D = ImageWin('+90Deg', newIm90D.width, newIm90D.height)
myWin90D_ = ImageWin('-90Deg', newIm90D_.width, newIm90D_.height)
# Generate a list of lists from the loaded image
img_to_matrix = []
for row in range(oldIm.getHeight()):
t = [];
for column in range(oldIm.getWidth()):
x = oldIm.getPixel(column, row)
t.append(x)
img_to_matrix.append(t)
# Create a copy of the list of lists so that we can demonstrate rotation in both directions
img_to_matrix2 = unshared_copy(img_to_matrix)
# Rotate +90deg
rotate90D(img_to_matrix)
# Rotate -90deg
rotate90D_(img_to_matrix2)
# Load the pixel data in the respective images
for row in range(newIm90D.getHeight()):
for col in range(newIm90D.getWidth()):
newIm90D.setPixel(col, row, img_to_matrix[col][row])
for row in range(newIm90D_.getHeight()):
for col in range(newIm90D_.getWidth()):
newIm90D_.setPixel(col, row, img_to_matrix2[col][row])
# Display the images
oldIm.draw(myWin0D)
newIm90D.draw(myWin90D)
newIm90D_.draw(myWin90D_)
下面是我得到的:
既然你命名了你的列表“代码> BigStists/Code >,我会假设你要加载巨大的图像。所以你应该考虑修改我的示例代码,因为(如代码注释中提到的)我做了一些复制。
PS:坦白地说,我个人不会费心使用一个不能进行基本转换的图像“库”。我查看了
cImage.py
内部,它似乎使用PIL
的image
作为基础。PIL
本身提供了旋转(以及其他类似的基本功能)如果我没记错的话(我更喜欢OpenCV),尽管我不知道自定义图像格式是否与PIL
的图像处理工具兼容。为什么要使用列表来存储像素数据(并且在其上x=oldIm.getPixel(列,行)
而不是(行、列)
)?就我个人而言,我只需创建一个宽度=old_height,高度=old_width的新图像,然后简单地按正确的顺序迭代,用旧图像中的像素数据填充它。没错,我缩短了它,现在它看起来像这样def rotateImage90CW(imageFile):myWin=ImageWin(“90D”,350630)范围内的行(oldIm.getHeight()):范围内的列(oldIm.getWidth()):x=oldIm.getPixel(列,行)newIm.setPixel(行,列,x)newIm.draw(myWin)
但每当你有更新的代码这样重要的东西时,它仍然会给出一个完整的黑色图像BTW。通常的做法是在你的原始帖子中添加一个编辑,然后简单地放在那里。正如你自己看到的,注释并不适用于多行代码片段。我确实发现了问题,但我仍然不知道如何解决它。如果我使用任何随机图像,我的代码都可以正常工作,但是当使用从cImage保存的图像时,它不起作用。有什么想法吗?再次感谢您的帮助!@voldiemort-请不要使用评论区域提供重要信息。编辑您的原始帖子。