我有一个 Perl 脚本,它使用 Image::Magick perl 模块从 Web 表单中裁剪现有图像(使用 JCrop 为我提供宽度、高度、x、y)。因为裁剪后的图像将用于响应式设计环境,所以我正在创建多种尺寸的图像以供网站前端使用。尺寸构建在一个数组中(如下面的代码所示),并逐个处理以创建每个图像尺寸。
正如您将从下面的代码中看到的那样,我最终必须打开图像 3 次并写入 3 次......这似乎有点过分......所以我希望你们知道一个更好的方法来做到这一点。
我最初尝试使用 Image::Magick 简单地打开文件一次,运行“裁剪、调整大小、裁剪”过程,然后写入一次图像,但结果非常糟糕。没有一个坐标被正确翻译,因此图像甚至没有接近用户在网络表单中请求的大小......尽管这些值被完美地读取。
所以我对你们所有人的问题是,是否有人能够完成一次“打开”(对打开的图像进行多次操作),然后使用 Image::Magick perl 模块执行一次“写入”?如果是这样,您能否提供一个与我在下面发布的代码行一样长的示例?我非常感谢可以提供的任何帮助。我的代码片段如下。很抱歉评论过多,我想让它尽可能容易地跟随:)
#!/usr/bin/perl
use Image::Magick;
use CGI qw(:cgi-lib);
&ReadParse(*input);
##############################
# Build array of sizes needed
##############################
my @sizes = ("1280","960","640","480","320","160");
foreach $size (@sizes) {
$resized = "/path/to/size/folders/$size\/$input{image_ID}\.png";
$image = Image::Magick->new;
$x = $image->Read("/path/to/fullsize/image");
#########################
# Run the requested crop
#########################
$x = $image->Crop(width=>$input{w},height=>$input{h},x=>$input{x},y=>$input{y});
########################
# Write cropped version
########################
$x = $image->Write("$resized");
###########################
# Open the cropped version
###########################
$image = Image::Magick->new;
$x = $image->Read("$resized");
###############################################
# Size the image down to +2 pixels all around
# to handle border opacity when pixel rounding
###############################################
$temp_width = $size + 2;
$temp_height = ($temp_width * $input{h}) / $input{w};
###########################
# Resize the cropped image
###########################
$x = $image->Resize(width=>$temp_width, height=>$temp_height);
################################
# Write the newly resized image
################################
$x = $image->Write("$resized");
########################################
# Calculate final dimensions and coords
########################################
$final_height = ($size * $temp_height) / $temp_width;
$final_x = 1;
$final_y = 1;
###############################
# Open the newly resized image
###############################
$image = Image::Magick->new;
$x = $image->Read("$resized");
#######################################
# Final crop the image for clean edges
#######################################
$x = $image->Crop(width=>$size,height=>$final_height,x=>$final_x,y=>$final_y);
########################################
# Write the final cropped image for use
########################################
$x = $image->Write("$resized");
}