我有一个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");
}
答案 0 :(得分:0)
您可以使用Clone
方法复制图像。此外,写入图像并在之后立即读取图像是多余的。尝试以下内容:
my @sizes = ("1280","960","640","480","320","160");
my $src_image = Image::Magick->new;
$x = $src_image->Read("/path/to/fullsize/image");
#########################
# Run the requested crop
#########################
$x = $src_image->Crop(width=>$input{w},height=>$input{h},x=>$input{x},y=>$input{y});
foreach $size (@sizes) {
my $image = $src_image->Clone;
$resized = "/path/to/size/folders/$size\/$input{image_ID}\.png";
###############################################
# 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);
########################################
# Calculate final dimensions and coords
########################################
$final_height = ($size * $temp_height) / $temp_width;
$final_x = 1;
$final_y = 1;
#######################################
# 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");
}
答案 1 :(得分:0)
这很晚,但如果能帮到某人,这对我有用:
my $imageName = 'picture';
my $file = "tmp/original.jpg";
# Create the image object
my $imageFile = Image::Resize->new($file);
# Resize and save one...
my $image = $imageFile->resize(800, 450);
open(FH, ">$siteroot/user_pics/$imageName\_800x450.jpg");
print FH $image->jpeg();
close(FH);
# Resize and save another...
my $thumb = $imageFile->resize(224, 126);
open(FH, ">$siteroot/user_pics/$imageName\_224x126.jpg");
print FH $thumb->jpeg();
close(FH);
# etc...
unlink ("tmp/original.jpg");