旋转图片 - RotateImage
函数简介
将图片旋转指定的角度。此函数可以将图片按照指定的角度进行旋转,支持任意角度的旋转,并自动调整输出图片的大小以容纳旋转后的内容。旋转时使用高质量的插值算法以保持图像质量,适用于图像预处理、界面设计等场景。
接口名称
RotateImage
DLL调用
long RotateImage(long ola, long image_ptr, double angle)
参数定义:
ola
(长整型数): OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。image_ptr
(长整型数): 要旋转的图片句柄。angle
(双精度浮点数): 旋转角度,单位为度,正值表示顺时针旋转,负值表示逆时针旋转。
示例:
// 加载图片并进行旋转
long image = LoadImage(ola, "D:\\test\\source.png");
if (image != 0) {
// 获取原图尺寸
int width, height;
GetImageSize(ola, image, &width, &height);
printf("原图大小:%d x %d\n", width, height);
// 旋转90度(顺时针)
long rotated90 = RotateImage(ola, image, 90.0f);
if (rotated90 != 0) {
SaveImageFromPtr(ola, rotated90, "D:\\test\\rotated90.png");
printf("90度旋转完成\n");
FreeImagePtr(ola, rotated90);
}
// 旋转180度
long rotated180 = RotateImage(ola, image, 180.0f);
if (rotated180 != 0) {
SaveImageFromPtr(ola, rotated180, "D:\\test\\rotated180.png");
printf("180度旋转完成\n");
FreeImagePtr(ola, rotated180);
}
// 旋转45度(会自动调整输出图片大小)
long rotated45 = RotateImage(ola, image, 45.0f);
if (rotated45 != 0) {
SaveImageFromPtr(ola, rotated45, "D:\\test\\rotated45.png");
printf("45度旋转完成\n");
FreeImagePtr(ola, rotated45);
}
// 逆时针旋转30度
long rotatedMinus30 = RotateImage(ola, image, -30.0f);
if (rotatedMinus30 != 0) {
SaveImageFromPtr(ola, rotatedMinus30, "D:\\test\\rotated_minus30.png");
printf("逆时针30度旋转完成\n");
FreeImagePtr(ola, rotatedMinus30);
}
FreeImagePtr(ola, image);
}
// 批量处理图片旋转的辅助函数
void RotateImages(const char* input_dir, const char* output_dir, float angle) {
char search_path[256];
sprintf(search_path, "%s\\*.png", input_dir);
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile(search_path, &fd);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
char input_path[512], output_path[512];
sprintf(input_path, "%s\\%s", input_dir, fd.cFileName);
sprintf(output_path, "%s\\rotated_%s", output_dir, fd.cFileName);
long image = LoadImage(ola, input_path);
if (image != 0) {
long rotated = RotateImage(ola, image, angle);
if (rotated != 0) {
SaveImageFromPtr(ola, rotated, output_path);
FreeImagePtr(ola, rotated);
}
FreeImagePtr(ola, image);
}
}
} while (FindNextFile(hFind, &fd));
FindClose(hFind);
}
}
COM调用
long RotateImage(long image_ptr, double angle)
参数定义:
image_ptr
(长整型数): 要旋转的图片句柄。angle
(双精度点数): 旋转角度,单位为度,正值表示顺时针旋转,负值表示逆时针旋转。
示例:
# 加载图片并进行旋转
image = ola.LoadImage("D:\\test\\source.png")
if image != 0:
# 获取原图尺寸
width = height = 0
ola.GetImageSize(image, width, height)
messagebox(f"原图大小:{width} x {height}")
# 旋转90度(顺时针)
rotated90 = ola.RotateImage(image, 90.0)
if rotated90 != 0:
ola.SaveImageFromPtr(rotated90, "D:\\test\\rotated90.png")
messagebox("90度旋转完成")
ola.FreeImagePtr(rotated90)
# 旋转180度
rotated180 = ola.RotateImage(image, 180.0)
if rotated180 != 0:
ola.SaveImageFromPtr(rotated180, "D:\\test\\rotated180.png")
messagebox("180度旋转完成")
ola.FreeImagePtr(rotated180)
# 旋转45度(会自动调整输出图片大小)
rotated45 = ola.RotateImage(image, 45.0)
if rotated45 != 0:
ola.SaveImageFromPtr(rotated45, "D:\\test\\rotated45.png")
messagebox("45度旋转完成")
ola.FreeImagePtr(rotated45)
# 逆时针旋转30度
rotated_minus30 = ola.RotateImage(image, -30.0)
if rotated_minus30 != 0:
ola.SaveImageFromPtr(rotated_minus30, "D:\\test\\rotated_minus30.png")
messagebox("逆时针30度旋转完成")
ola.FreeImagePtr(rotated_minus30)
ola.FreeImagePtr(image)
# 批量处理图片旋转的辅助函数
def rotate_images(input_dir, output_dir, angle):
import os
from glob import glob
# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)
# 处理所有PNG文件
for input_path in glob(os.path.join(input_dir, "*.png")):
filename = os.path.basename(input_path)
output_path = os.path.join(output_dir, f"rotated_{filename}")
image = ola.LoadImage(input_path)
if image != 0:
rotated = ola.RotateImage(image, angle)
if rotated != 0:
ola.SaveImageFromPtr(rotated, output_path)
ola.FreeImagePtr(rotated)
ola.FreeImagePtr(image)
返回值
长整型数:
- 0: 旋转失败
- 非0: 旋转成功,返回新图片的句柄
注意事项
- 旋转角度为正值时顺时针旋转,为负值时逆时针旋转
- 对于非90度的倍数旋转,输出图片的尺寸会自动调整以容纳完整的旋转结果
- 旋转后会返回新的图片句柄,原图片不会被修改
- 新图片句柄使用完后需要调用 FreeImagePtr 释放内存
- 如果需要在旋转的同时调整图片大小,可以配合使用 ReSize 或 ScalePixels 函数