我正致力于允许用户为我的网站上传个人资料照片。我试图避免的经典例子是plentyoffish.com,其中每个用户的图像都是倾斜的,看起来非常难看:
那么,如何在没有上述演示偏差的情况下逐步裁剪/创建标准尺寸版本的图像?
答案 0 :(得分:5)
嗯,你必须有一个最大的高度和宽度,让我们假设你有的图像尺寸是正方形,比如100x100。
当用户上传图像时获取它的尺寸,然后计算出更大,更高或更宽的图像。
然后进行最大测量并获得该测量值与目标测量值的比率,然后使用该比率来缩放高度和宽度。
因此,如果用户上传了500个高度和450个宽度的图片,那么当高度最大时,您将缩小100除以500(缩略图大小)。这给了我们.2作为比率。这意味着宽度将变为90,因此您将缩小到100x90,并且不会发生扭曲。
答案 1 :(得分:1)
这是一些代码(C#)我曾经做过调整大小,类似于blowdart建议的方法。只需将“300”替换为您的情况下一侧的最大尺寸:
private Bitmap ScaleImage(Image oldImage)
{
double resizeFactor = 1;
if (oldImage.Width > 300 || oldImage.Height > 300)
{
double widthFactor = Convert.ToDouble(oldImage.Width) / 300;
double heightFactor = Convert.ToDouble(oldImage.Height) / 300;
resizeFactor = Math.Max(widthFactor, heightFactor);
}
int width = Convert.ToInt32(oldImage.Width / resizeFactor);
int height = Convert.ToInt32(oldImage.Height / resizeFactor);
Bitmap newImage = new Bitmap(width, height);
Graphics g = Graphics.FromImage(newImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(oldImage, 0, 0, newImage.Width, newImage.Height);
return newImage;
}
答案 2 :(得分:0)
或者:如果您仍然喜欢固定尺寸,请遵循blowdart的说明,但要计算最大比例:100px / 450px = .22 ..
编辑:或者让用户选择如何裁剪最大尺寸。
答案 3 :(得分:0)
使用ImageMagick。在命令行上使用:
convert -thumbnail geometry
答案 4 :(得分:0)
我之前为PHP制作了这个功能,对于这个和其他一些场景非常有用:
<?php
function Image($source, $crop = null, $resize = null)
{
$source = ImageCreateFromString(file_get_contents($source));
if (is_resource($source) === true)
{
$width = imagesx($source);
$height = imagesy($source);
if (isset($crop) === true)
{
$crop = array_filter(explode('/', $crop), 'is_numeric');
if (count($crop) == 2)
{
if (($width / $height) > ($crop[0] / $crop[1]))
{
$width = $height * ($crop[0] / $crop[1]);
$crop = array((imagesx($source) - $width) / 2, 0);
}
else if (($width / $height) < ($crop[0] / $crop[1]))
{
$height = $width / ($crop[0] / $crop[1]);
$crop = array(0, (imagesy($source) - $height) / 2);
}
}
else
{
$crop = array(0, 0);
}
}
else
{
$crop = array(0, 0);
}
if (isset($resize) === true)
{
$resize = array_filter(explode('*', $resize), 'is_numeric');
if (count($resize) >= 1)
{
if (empty($resize[0]) === true)
{
$resize[0] = round($resize[1] * $width / $height);
}
else if (empty($resize[1]) === true)
{
$resize[1] = round($resize[0] * $height / $width);
}
}
else
{
$resize = array($width, $height);
}
}
else
{
$resize = array($width, $height);
}
$result = ImageCreateTrueColor($resize[0], $resize[1]);
if (is_resource($result) === true)
{
ImageCopyResampled($result, $source, 0, 0, $crop[0], $crop[1], $resize[0], $resize[1], $width, $height);
ImageDestroy($source);
header('Content-Type: image/jpeg');
ImageJPEG($result, null, 90);
ImageDestroy($result);
}
}
return false;
}
Image('/path/to/your/image.jpg', '1/1', '100*');
Image('/path/to/your/image.jpg', '1/1', '100*100');
Image('/path/to/your/image.jpg', '1/1', '100*500');
?>
答案 5 :(得分:0)
这是一个bash命令,我使用ImageMagick的转换工具将它组合在一起完成此任务。对于位于父目录中的一组图像,一些肖像,一些风景,在当前目录中创建图像,缩放到600x400,从中心裁剪肖像图像,并简单地缩放风景图像:
for f in ../*jpg; do
echo $f;
size=`identify $f|cut -d' ' -f 3`;
w=`echo $size|cut -dx -f 1`;
h=`echo $size|cut -dx -f 2`;
if [ $w -gt $h ]; then
convert $f -thumbnail 600x400 `basename $f`;
else
convert $f -scale 600x -crop 600x400+0+`echo "((600*($h/$w))/2)" | bc | sed 's/\..*//'` `basename $f`;
fi;
done;