小能豆

PyCairo:如何调整图像大小并根据图像中心将其旋转到最终画布

py

PyCairo:如何调整图像大小并根据图像中心将其旋转到最终画布


阅读 17

收藏
2024-12-05

共1个答案

小能豆

在 PyCairo 中,要调整图像大小并根据图像的中心进行旋转,可以按照以下步骤操作:

  1. 加载图像:使用 ImageSurface 加载图像。
  2. 计算旋转的中心:根据图像的宽度和高度来计算其中心位置。
  3. 调整图像大小:使用 Context.scale() 来调整图像大小。
  4. 旋转图像:使用 Context.rotate() 来根据计算出的中心点旋转图像。
  5. 平移图像:根据旋转后的图像位置调整图像的位置,以确保它仍然保持在正确的位置。

以下是一个示例代码,展示如何根据图像的中心调整大小并旋转图像:

示例代码:

import cairo

def resize_and_rotate_image(input_image_path, output_image_path, width_scale, height_scale, angle_degrees):
    # 创建一个图像表面用于输出
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 400, 400)  # 输出画布大小
    ctx = cairo.Context(surface)

    # 加载图像
    img_surface = cairo.ImageSurface.create_from_png(input_image_path)

    # 获取图像的原始宽度和高度
    img_width = img_surface.get_width()
    img_height = img_surface.get_height()

    # 计算旋转中心(图像的中心)
    center_x = img_width / 2
    center_y = img_height / 2

    # 计算缩放后的图像尺寸
    new_width = img_width * width_scale
    new_height = img_height * height_scale

    # 计算图像绘制时的偏移量,使图像的中心对齐
    offset_x = (400 - new_width) / 2  # 偏移量使得旋转后的图像居中
    offset_y = (400 - new_height) / 2  # 偏移量使得旋转后的图像居中

    # 设置旋转的角度(转为弧度)
    angle_radians = angle_degrees * (3.14159 / 180)

    # 平移到图像的中心
    ctx.translate(offset_x + new_width / 2, offset_y + new_height / 2)

    # 旋转
    ctx.rotate(angle_radians)

    # 缩放图像
    ctx.scale(width_scale, height_scale)

    # 绘制图像
    ctx.set_source_surface(img_surface, -center_x, -center_y)  # 使用图像的中心坐标
    ctx.paint()  # 将图像绘制到当前表面

    # 保存最终图像
    surface.write_to_png(output_image_path)
    print(f"Image saved to {output_image_path}")

# 使用示例
resize_and_rotate_image("input_image.png", "output_image.png", 0.5, 0.5, 45)

代码解释:

  1. 加载图像img_surface = cairo.ImageSurface.create_from_png(input_image_path) 将图像加载为 ImageSurface,并从中读取宽度和高度。
  2. 计算旋转的中心:通过 img_width / 2img_height / 2 计算出图像的中心。
  3. 缩放图像:使用 ctx.scale(width_scale, height_scale) 来调整图像大小,这里 width_scaleheight_scale 控制宽度和高度的缩放比例。
  4. 旋转图像:使用 ctx.rotate(angle_radians) 进行旋转。角度需要转换为弧度(angle_radians = angle_degrees * (3.14159 / 180))。
  5. 平移和绘制图像:在旋转前,使用 ctx.translate() 将坐标系移到目标位置,然后绘制调整过的图像。
  6. 保存输出图像:将最终结果保存为 PNG 文件。

结果:

  • 该代码会将输入的图像按比例调整大小,并旋转指定的角度,且图像会在输出画布的中心显示。

注意:

  • 这段代码中的输出画布大小设置为 400x400,如果需要处理更大的图像或调整画布大小,可以根据需要修改这些值。
  • 如果输出的图像比例不同于原始图像,您可以调整 width_scaleheight_scale,分别控制水平和垂直的缩放。
  • 旋转角度是以度为单位,使用 ctx.rotate() 时将其转换为弧度。

希望这能解决您的问题!如果有更多问题或需要进一步的解释,请随时告诉我。

2024-12-05