如何从 jpeg 的顶部和底部裁剪 45px

Posted

技术标签:

【中文标题】如何从 jpeg 的顶部和底部裁剪 45px【英文标题】:How to crop 45px from the top and bottom of a jpeg 【发布时间】:2017-08-27 01:17:32 【问题描述】:

我正在尝试从 YouTube jpeg 缩略图图像的顶部和底部裁剪 45 像素,例如 this one,即 480 像素 x 360 像素。

看起来像这样:

请注意图像顶部和底部的 45 像素黑条。我只是想删除那些,这样我的结果图像是 480px x 270px 并且黑条消失了。

通过实现this stack post 中的示例,我取得了部分成功。这是我基于此的 php 函数:

function CropImage($sourceImagePath, $width, $height)
    $src = imagecreatefromjpeg($sourceImagePath);
    $dest = imagecreatetruecolor($width, $height);
    imagecopy($dest, $src, 0, 0, 20, 13, $width, $height);
    header('Content-Type: image/jpeg');
    imagejpeg($dest);
    imagedestroy($dest);
    imagedestroy($src);

如此称呼:

CropImage("LOTR.jpg", 480, 270);

发生了一些裁剪,但导致了 2 个问题:

    它没有裁剪顶部和底部,而是似乎裁剪了左侧和底部,结果如下:

    从我正在使用的 PHP 代码 sn-p 中,我看不到如何生成新文件。相反,我在浏览器中执行的 PHP 脚本只是在浏览器中呈现变形文件。我不希望这种情况发生,我希望能够将 dest 路径传递给函数并让它创建新文件(而不向客户端/浏览器发送任何内容),并删除顶部 45px 和底部 45px。很明显,header('Content-Type: image/jpeg'); 是问题的一部分,但删除它仍然不会给我一个写入服务器的目标文件,我想。

我也在寻找PHP docs here。似乎更改 imagecopy($dest, $src, 0, 0, 20, 13, $width, $height); 中的参数可以解决这个问题,但我真的不清楚这些参数应该是什么。带有黑条的resulting thumbnails inside the YouTube tab look odd。提前感谢您的任何建议。

【问题讨论】:

imagecopy imagejpeg 我将什么传递给imagejpeg()$src? $dest?还有什么? 两者。只需要改$src_x$src_y,20和13错了。 又是怎么写文件的? 【参考方案1】:
<?php
function CropImage($sourceImagePath, $width, $height)

    // Figure out the size of the source image
    $imageSize = getimagesize($sourceImagePath);
    $imageWidth = $imageSize[0];
    $imageHeight = $imageSize[1];

    // If the source image is already smaller than the crop request, return (do nothing)
    if ($imageWidth < $width || $imageHeight < $height) return;

    // Get the adjustment by dividing the difference by two
    $adjustedWidth = ($imageWidth - $width) / 2;
    $adjustedHeight = ($imageHeight - $height) / 2;

    $src = imagecreatefromjpeg($sourceImagePath);

    // Create the new image
    $dest = imagecreatetruecolor($width,$height);      

    // Copy, using the adjustment to crop the source image
    imagecopy($dest, $src, 0, 0, $adjustedWidth, $adjustedHeight, $width, $height);

    imagejpeg($dest,'somefile.jpg');
    imagedestroy($dest);
    imagedestroy($src);

【讨论】:

user2182349 您的解决方案完美运行,但我仍然看不到如何将修改后的图像保存到服务器。 header('Content-Type: image/jpeg');当然需要删除,但是保存更改的图像的语法是什么? 是的,就是这样。请更新您的答案,并删除header。所以我可以接受,它可能会帮助别人。

以上是关于如何从 jpeg 的顶部和底部裁剪 45px的主要内容,如果未能解决你的问题,请参考以下文章

同时使用css显示图像裁剪图像的顶部和底部

图像调整大小和裁剪

Android - 如何使用视图布局尺寸裁剪 jpeg

PHP图像从顶部,底部,左侧和右侧裁剪

从上到下均匀裁剪图像

是否可以用微妙的曲线裁剪元素的底部?