PHP裁剪图像以固定宽度和高度而不丢失尺寸比
Posted
技术标签:
【中文标题】PHP裁剪图像以固定宽度和高度而不丢失尺寸比【英文标题】:PHP crop image to fix width and height without losing dimension ratio 【发布时间】:2011-03-16 09:47:30 【问题描述】:我希望创建尺寸为 100 像素 x 100 像素的缩略图。我看过很多解释这些方法的文章,但如果要保持尺寸比,大多数最终都有宽度!=高度。
例如,我有一个 450 像素 x 350 像素的图像。我想裁剪到 100 像素乘 100 像素。如果我要保持这个比例,我最终会得到 100 像素 x 77 像素。当我在一行和一列中列出这些图像时,这使得它很难看。但是,没有尺寸比的图像也会看起来很糟糕。
我看过来自 flickr 的图片,它们看起来很棒。例如: 缩略图:http://farm1.static.flickr.com/23/32608803_29470dfeeb_s.jpg 中号:http://farm1.static.flickr.com/23/32608803_29470dfeeb.jpg 大号:http://farm1.static.flickr.com/23/32608803_29470dfeeb_b.jpg
tks
【问题讨论】:
哦,现在我知道为什么有人因为那个 b4 骂我了。我必须点击勾号!!。天哪,我没注意到。好的,让我看看回复 【参考方案1】:这是通过仅使用图像的一部分作为具有 1:1 纵横比的缩略图(主要是图像的中心)来完成的。如果您仔细观察,您可以在 flickr 缩略图中看到它。
因为您的问题中有“crop”,我不确定您是否还不知道,但是您想知道什么?
要使用裁剪,下面是一个示例:
//Your Image
$imgSrc = "image.jpg";
//getting the image dimensions
list($width, $height) = getimagesize($imgSrc);
//saving the image into memory (for manipulation with GD Library)
$myImage = imagecreatefromjpeg($imgSrc);
// calculating the part of the image to use for thumbnail
if ($width > $height)
$y = 0;
$x = ($width - $height) / 2;
$smallestSide = $height;
else
$x = 0;
$y = ($height - $width) / 2;
$smallestSide = $width;
// copying the part into thumbnail
$thumbSize = 100;
$thumb = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide);
//final output
header('Content-type: image/jpeg');
imagejpeg($thumb);
【讨论】:
嗨 skoschnike 仔细检查我是否正确拼写了你的名字 =) 我已经想到了。但我对如何做到这一点一无所知。愿意分享吗?? 嘿,斯文,我试过你的脚本,效果很好。非常感谢你。完美无瑕 嘿,斯文,我只是有一个问题。使用你的脚本效果很好。但我意识到裁剪后的图像质量与原始图像不同。例如,我从 flickr 上截取了一张示例图片,然后裁剪到相同的尺寸,它们看起来不同。有什么办法可以保持质量?? 您可以在 imagejpeg() 函数中指定 jpg 质量,请参见此处de.php.net/imagejpeg(文件名参数使用 NULL)。默认质量为 75。 只是一个建议——一个我们都忘记的好小函数:$smallestSide = min($height, $width);【参考方案2】:根据较小的宽度或高度以正方形裁剪图像
public function croppThis($target_url)
$this->jpegImgCrop($target_url);
$target_url - 是图像的名称。
public function jpegImgCrop($target_url) //support
$image = imagecreatefromjpeg($target_url);
$filename = $target_url;
$width = imagesx($image);
$height = imagesy($image);
$image_type = imagetypes($image); //IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP | IMG_XPM
if($width==$height)
$thumb_width = $width;
$thumb_height = $height;
elseif($width<$height)
$thumb_width = $width;
$thumb_height = $width;
elseif($width>$height)
$thumb_width = $height;
$thumb_height = $height;
else
$thumb_width = 150;
$thumb_height = 150;
$original_aspect = $width / $height;
$thumb_aspect = $thumb_width / $thumb_height;
if ( $original_aspect >= $thumb_aspect )
// If image is wider than thumbnail (in aspect ratio sense)
$new_height = $thumb_height;
$new_width = $width / ($height / $thumb_height);
else
// If the thumbnail is wider than the image
$new_width = $thumb_width;
$new_height = $height / ($width / $thumb_width);
$thumb = imagecreatetruecolor( $thumb_width, $thumb_height );
// Resize and crop
imagecopyresampled($thumb,
$image,
0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
0 - ($new_height - $thumb_height) / 2, // Center the image vertically
0, 0,
$new_width, $new_height,
$width, $height);
imagejpeg($thumb, $filename, 80);
【讨论】:
简单易用的解决方案;但首先检查文件类型并使用 jpg、png 或 gif 的 imagecreate 可能会更有帮助。 如何工作..请帮助我..如何显示像图像【参考方案3】:您可以使用此代码。 您需要以 px 为单位传递源图像路径和缩略图大小,以及可选的目标路径。如果您通过,它将保存图像,否则将显示拇指。
只允许使用 jpg、jpeg 和 png。
function cropImage($sourcePath, $thumbSize, $destination = null)
$parts = explode('.', $sourcePath);
$ext = $parts[count($parts) - 1];
if ($ext == 'jpg' || $ext == 'jpeg')
$format = 'jpg';
else
$format = 'png';
if ($format == 'jpg')
$sourceImage = imagecreatefromjpeg($sourcePath);
if ($format == 'png')
$sourceImage = imagecreatefrompng($sourcePath);
list($srcWidth, $srcHeight) = getimagesize($sourcePath);
// calculating the part of the image to use for thumbnail
if ($srcWidth > $srcHeight)
$y = 0;
$x = ($srcWidth - $srcHeight) / 2;
$smallestSide = $srcHeight;
else
$x = 0;
$y = ($srcHeight - $srcWidth) / 2;
$smallestSide = $srcWidth;
$destinationImage = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($destinationImage, $sourceImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide);
if ($destination == null)
header('Content-Type: image/jpeg');
if ($format == 'jpg')
imagejpeg($destinationImage, null, 100);
if ($format == 'png')
imagejpeg($destinationImage);
if ($destination = null)
else
if ($format == 'jpg')
imagejpeg($destinationImage, $destination, 100);
if ($format == 'png')
imagepng($destinationImage, $destination);
【讨论】:
它在哪里创建拇指?什么是拇指路径?也写一些描述。【参考方案4】:我喜欢使用 GDLib 来处理图像,它也非常容易使用。那里有很多博客文章和教程。不过,我建议为它使用一个类或类似的类,因为处理图像中的所有变化可能非常耗时。
【讨论】:
【参考方案5】:要完成@SvenKoschnicke 代码,这里是处理其他图像格式的小工具:
$sourceProperties = getimagesize($imgSrc);
$width = $sourceProperties[0];
$height = $sourceProperties[1];
switch ($sourceProperties[2])
case IMAGETYPE_PNG:
$myImage = imagecreatefrompng($imgSrc);
break;
case IMAGETYPE_GIF:
$myImage = imagecreatefromgif($imgSrc);
break;
case IMAGETYPE_JPEG:
$myImage = imagecreatefromjpeg($imgSrc);
break;
【讨论】:
以上是关于PHP裁剪图像以固定宽度和高度而不丢失尺寸比的主要内容,如果未能解决你的问题,请参考以下文章