Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用cImage旋转图像_Python - Fatal编程技术网

Python 使用cImage旋转图像

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())

我正在尝试使用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()):
        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-请不要使用评论区域提供重要信息。编辑您的原始帖子。