gpt4 book ai didi

php - 在浏览器中自动裁剪图像

转载 作者:行者123 更新时间:2023-11-29 20:14:20 24 4
gpt4 key购买 nike

如何在上传过程中自动裁剪图片?有没有php函数可以做到这一点?

我希望我的网页通过裁剪来显示原始图像不同维度的相同维度的图像。

或者有什么想法吗?

最佳答案

如果不知道主题在哪里,自动裁剪会很困难。也许你可以尝试得到一个内部居中的矩形,如图所示:

Inner rectangle picture shows a rectangle within another one

首先要做的是找到原始图像尺寸和文件类型。您不应该信任图像扩展名,而是使用 getimagesize为了那个原因。尽管名称 getimagesize 不仅返回大小,还返回文件类型。

//width is at index 0, height at index 1, mime type at ['mime'] key
$original = getimagesize($filename);

然后您应该构建一个内部 PHP 数据结构以在内存中保存源图像,这样您就可以使用 imagecreatefromjpeg 对其进行操作。或 imagecreatefrompngimagecreatefromgif , 取决于图像类型。例如:

$srcImage = imagecreatefromjpeg($filename);

接下来,您应该分配另一个数据结构来保存目标图像。在这种情况下,我们没有图像开始,所以我分配了一个空图像。

$dstImage = imagecreatetruecolor($newWidth, $newHeight);

接下来,您应该将原始图像的一部分复制到目标图像。如果您不想调整大小,请使用 imagecopy , 否则如果你想裁剪和调整大小你可以考虑 imagecopyresampled .

imagecopy(dstImage, $srcImage, 0, 0, $srcX, $srcY, $srcW, $srcH);

其中 $srcX 是源图像中的起始 X 点,$srcY 是起始 Y 点,$srcW 是从起始 X 点开始复制的宽度,$srcH 是要复制区域的高度。

最后,您可以保存您的图片:

imagejpeg($this->dstImage, $filename, 90);

或者您可以将它输出到浏览器:

imagejpeg($this->dstImage);

如果您保存图像,您必须考虑将其保存在哪个目录中,如果您有大量图像(数千张或更多),请考虑将它们拆分到多个子目录中的方法。

如果您保存原始图像,切勿保存带有不在允许扩展名列表中的扩展名的图像,否则这将是一个巨大的安全漏洞,攻击者可以在其中向您发送和执行任何 PHP 代码网站。

根据描述的概念我写了一个小类:

class ImageCrop {

//Image resources
private $srcImage, $dstImage;

//original width and height
private $width, $height;

/**
* Read an image from disk.
* @return true in case of success, false otherwise.
*/
public function openImage($filename) {
if (!file_exists($filename)) {
return false;
}
$original = getimagesize($filename);
switch ($original['mime']) {
case 'image/jpeg':
$this->srcImage = imagecreatefromjpeg($filename);
break;
case 'image/png':
$this->srcImage = imagecreatefrompng($filename);
break;
case 'image/gif':
$this->srcImage = imagecreatefromgif($filename);
break;
default:
return false;
}
$this->width = $original[0];
$this->height = $original[1];
return true;
}

/**
* Crop an image to the new specified dimension trying to get an
* internal rectangle of the original image. No crop is done if the
* original dimension is already smaller than $newWidth or $newHeight.
*/
public function crop($newWidth, $newHeight) {
$this->dstImage = imagecreatetruecolor($newWidth, $newHeight);
$srcX = $srcY;
$srcW = $this->width;
$srcH = $this->height;
$extraWidth = $this->width - $newWidth;
if ($extraWidth > 0) {
$srcX = $extraWidth / 2;
}
$extraHeight = $this->height - $newHeight;
if ($extraHeight > 0) {
$srcY = $extraHeight / 2;
}
imagecopy($this->dstImage, $this->srcImage, 0, 0,
$srcX, $srcY, $srcW, $srcH);
}

/**
* Save the destination image, the crop function should have been
* called already.
*/
public function save($filename) {
imagejpeg($this->dstImage, $filename, 90);
}

/**
* Output the destination image to the browser.
*/
public function output() {
imagejpeg($this->dstImage);
}

}

将类保存在ImageCrop.php中,示例用法:

require_once 'ImageCrop.php';

$imageCrop = new ImageCrop();
if ($imageCrop->openImage('big.jpg')) {
$imageCrop->crop(200, 300); //newWidth, newHeight
$imageCrop->save('small.jpg');
}

或者,要将输出直接发送到浏览器,请使用 $imageCrop->output();

关于php - 在浏览器中自动裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7845044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com