无论imagemagick中的方向如何,都会自动调整较短边的图像大小

Posted

技术标签:

【中文标题】无论imagemagick中的方向如何,都会自动调整较短边的图像大小【英文标题】:Automatically resize image on the shorter side regardless of orientation in imagemagick 【发布时间】:2014-01-04 21:57:18 【问题描述】:

无论使用 imagemagick 的方向如何,我都在努力调整图像的大小,这个程序甚至没有包含基本的检测方法是不是很糟糕?我现在是否必须使用 getimagesize 检查最短边并比较它们或什么?

-resize 125^ 

只有一种方式,当我将图像翻转 90 度时,短边变得小于 125.. 即它不会在两个方向上调整短边的大小。如果有影响,我会尝试使用更少的代码。

【问题讨论】:

【参考方案1】:

这是一个我刚刚完成的功能,用于强制精确的像素大小 - 我不能保证 100%,但我用许多选项对其进行了测试,到目前为止得到了完美的结果,它给出了最接近的结果。首先,它通过计算比率来调整源图像和指定尺寸之间的最小差异。然后修剪掉多余的像素。我已经补偿了奇数,负值等。到目前为止我已经取得了不错的成绩。如果我错过了什么或者它是否以某种方式损坏,请告诉我:

php

    // set source/export paths and pixel sizes for final sizes
    $src="path/to/source.jpg";
    $exp="path/to/output.jpg";
    $crop_w=300;
    $crop_h=200;


    $size = getimagesize("$src");

    //check image sizes
    if( ($size[0] < $crop_w) || ($size[1] < $crop_h) )
    echo 'Image not big enough to crop';
    exit();
    

    //get differential ratios of image vs crop sizes - 
        //smaller ratio must be resized
    $ratio_w = $size[0]/$crop_w;
    $ratio_h = $size[1]/$crop_h; 

    //square or landscape - shave sides

    if($ratio_w >= $ratio_h)

        //resize width / shave top&bottom
        exec("convert $src -resize x".$crop_h." $exp ");
        $size = getimagesize("$exp");
        $diff=abs($crop_w-$size[1]);

        //dividing 1 by 2 will leave a zero on round down - just force resize
        if($diff < 2)

        // skip shave - diff too small
        exec('convert $exp -resize  '.$crop_w.'X! $exp ');
        
        else
            //divide difference by 2 for shave amount
            $shave = round($diff/2,0,PHP_ROUND_HALF_DOWN); //halve & round difference down to avoid cropping smaller

            exec('convert '.$exp.' -shave  '.$shave.'x0 '.$exp.' '); //shave sides

            //odd $diff leave a rounded down pixel - force height resize 
            if($diff%2 !==0)//if $diff was not divisible by two then 1 pixel is left from round down
            exec('convert '.$exp.' -resize  '.$crop_w.'x! '.$exp.' ');
            
        
    

    //portrait - shave height
    else

        //resize width / shave top&bottom
        exec("convert $src -resize ".$crop_w."x $exp ");
        $size = getimagesize("$exp");
        $diff=abs($crop_h-$size[1]);

        //dividing 1 by 2 will leave a zero on round down - just force resize
        if($diff < 2)

        exec('convert $exp -resize  x'.$crop_h.'! $exp ');
        
        else
            //divide difference by 2 for shave amount
            $shave = round($diff/2,0,PHP_ROUND_HALF_DOWN); //halve & round difference down to avoid cropping smaller

            exec('convert '.$exp.' -shave  0x'.$shave.' '.$exp.' '); //shave sides

            //odd $diff leave a rounded down pixel - force height resize 
            if($diff%2 !==0)//if $diff was not divisible by two then 1 pixel is left from round down

            exec('convert '.$exp.' -resize  x'.$crop_h.'! '.$exp.' ');
            
        



    

随意使用/制作 cmets。 PHP 5.4

【讨论】:

以上是关于无论imagemagick中的方向如何,都会自动调整较短边的图像大小的主要内容,如果未能解决你的问题,请参考以下文章

iPad 启动图像和方向

海康360°如何调自动训拍

使用自动布局更改方向时更改内容顺序

无论如何,mongodb每个月都会自动创建一个新数据库吗?

检测 iPhone 相机方向

KML 运动线方向