ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 图像操作 Nette \ Utils \ Image类用于基本的图像处理。 它简化了基本操作,如图像大小调整,锐化或将图像发送到浏览器。 如果你想在PHP中操作图像(比如缩放或锐化图像),你必须编写一个不可读和不可理解的代码。 它不会是Nette框架,如果它没有来更好的API :-) 我们可以从加载文件中的图像开始: ~~~ use Nette\Utils\Image; $image = Image::fromFile('nette.jpg'); ~~~ 或者我们可以创建新的空白图像,大小为100×200: ~~~ $image = Image::fromBlank(100, 200); ~~~ 我们可以选择设置背景颜色(默认为黑色): ~~~ $image = Image::fromBlank(100, 200, Image::rgb(125, 0, 0)); ~~~ 我们会写出它的大小: ~~~ echo "Image size is: $image->width × $image->height"; ~~~ ## 图像调整大小 我们将按比例缩小图像,使其不超过50×30像素: ~~~ $image->resize(50, 30); ~~~ 可以只设置一个维度,计算第二个维度: ~~~ $image->resize(50, NULL); // width 50px, height auto $image->resize(NULL, 30); // width auto, height 30px ~~~ 任何维度也可以百分比设置: ~~~ $image->resize('75%', 30); // 75% × 30px ~~~ 在所提到的示例中,图像仅按比例缩小。 可以通过使用指令Image :: ENLARGE允许放大: ~~~ $image->resize(50, 30, Image::ENLARGE); ~~~ 使用指令Image :: STRETCH,我们可以允许大小的非比例变化: ~~~ $image->resize(50, 30, Image::STRETCH); ~~~ 两个指令可以组合: ~~~ $image->resize(50, 30, Image::ENLARGE | Image::STRETCH); ~~~ 如果我们将一个或两个维度作为负数写入,图像将被翻转(水平或垂直): ~~~ $flipped = $image->resize(NULL, '-100%'); // flip vertically $flipped = $image->resize('-100%', '-100%'); // rotate by 180° $flipped = $image->resize(-125, 50); // resize & flip horizontally ~~~ ## 图像修改 减少图像后,我们可以通过锐化来改善它: ~~~ $image->sharpen(); ~~~ 我们还可以通过矩形的坐标修剪图像: ~~~ $image->crop($left, $top, $width, $height); ~~~ 缩小的图像可以插入到另一个(所谓的水印)中。 ~~~ $blank = Image::fromBlank(320, 240, Image::rgb(52, 132, 210)); $blank->place($image, 0, 0); // place into a position 0px, 0px // coordinates can be set also in percentage $blank->place($image, '80%', '75%', 25); // transparency is 25 % ~~~ Nette \ Utils \ Image简化了从GD扩展中调用所有图形函数,例如imagefilledrectangle,但使用更易理解的对象方法。 ~~~ $white = Image::rgb(255, 255, 255); $image->filledRectangle(0, 0, $width, $height, $white); ~~~ ## 图像保存 图像可以保存到文件中: ~~~ $image->save('resampled.jpg'); ~~~ 自动地,也可以设置图像的质量和格式(如果格式未设置,它从文件扩展名检测到): ~~~ $image->save('resampled.jpg', 80, Image::JPEG); // JPEG, quality 80% ~~~ 或者,图像可以保存到变量中: ~~~ $binary = (string) $image; ~~~ 或者您可以使用相应的标题Content-Type的设置将其直接发送到浏览器: ~~~ // send it like image/jpeg $image->send(); // send it like image/png $image->send(Image::PNG); ~~~ 这样的API真的很高兴使用,不是吗?