使用cImag旋转图像

2024-09-27 23:18:06 发布

您现在位置: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()):
        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)

不幸的是,当我加载函数时,它只给我一个完全黑色的图像。有人能告诉我我的代码有什么问题吗?:[谢谢。在


Tags: in图像forrangecolumnrowappendimagefile
1条回答
网友
1楼 · 发布于 2024-09-27 23:18:06

我用mapzip来基本上转移你的列表:

从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_)

我得到的是:

enter image description here

由于您将列表命名为bigLists,所以我假设您希望加载巨大的图像。所以您应该考虑修改我的示例代码,因为(如代码注释中所述)我做了一些复制。在

PS:坦白地说,我个人并不介意使用不能进行基本转换的图像“库”。我看了cImage.py里面,似乎它使用了PILImage作为基础。PIL本身确实提供了开箱即用的旋转(以及其他类似的基本功能)(如果我记得正确的话)(我更喜欢OpenCV),尽管我不知道cImage自定义图像格式是否与PIL的图像处理工具兼容。在

相关问题 更多 >

    热门问题