4:3的图像裁剪算法

4:3的图像裁剪算法

问题描述:

我使用ImageMagick的Perl的4:3的图像裁剪算法

use Image::Magick; 

我已经写功能代码来执行类似调整大小,缩略图所有必要的任务,读取尺寸,作物,作物中心。

我确实有一个要求,所有的照片是风景,所以我抛出任何图像的高度大于或等于宽度。

我在挣扎的问题是在调整大小之前裁剪。照片需要是4:3的宽高比。某些照片采用新的16:9格式,或者在发送到服务器之前可能会被裁剪,导致屏幕显示偏斜。在我调整大小之前,我想裁剪图像,使其与最接近的4:3相等。例如,800/600是好的,但802/600会将中心裁剪到800/600。

我将调整大小的所有照片,裁剪大小regarless存储为800/600的最大存储图像,但这是仙子无关紧要。由于我可以提前读取高度和宽度尺寸,因此可能有算法可用于计算最接近的匹配。我真的只需要帮助获得新的尺寸来裁剪,而不是ImageMagick,除非ImageMagick中有一个函数可以为我做到这一点。

但是,我一直不成功找到一个。

+0

你的意思是这样的:如果宽度> 4.0/3.0 *高度则newWidth = 4.0/3.0的高度否则newHeight = 3.0/4.0 *宽? – vmpstr 2012-02-24 14:10:08

+0

这是我一直想要处理的照片,我加载到数码相框。我的一个奇特相机需要16x9的照片,这很棒,但在画面中看起来不太好看。裁剪的大小不是唯一的问题:你需要决定在哪里切除额外的东西:同样在两边,别的地方,等等。 – 2012-02-24 17:20:23

+0

要做到这一点,你只需找到中心,然后测量,直到你达到裁剪尺寸。 $图像 - >作物( '800×600 + $ X + $ Y');其中$ x =原始图像宽度的1/2,$ y是原始图像高度的1/2。 – chrisrth 2012-02-24 21:54:23

为我工作:

my $image_width = 800; # play with this when testing 
my $image_height = 600; 

my $target_aspect = 4/3; 
my $current_aspect = $image_width/$image_height; 

given ($current_aspect <=> $target_aspect) { 
    when (1) { $image_width = int($image_height * $target_aspect); } 
    when (-1) { $image_height = int($image_width/$target_aspect); } 
} 
+0

谢谢,我们马上要测试 – chrisrth 2012-02-24 14:23:38

+0

完美解决方案。 – chrisrth 2012-02-24 14:49:41