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

时间:2017-08-27 01:17:32

标签: php

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

看起来像这样:

enter image description here

请注意图像顶部和底部的45px黑条。我只是希望那些被移除,使我的结果图像是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个问题:

  1. 它没有裁剪顶部和底部,而是看起来裁剪左侧和底部,导致:
  2. enter image description here

    1. 从我正在使用的PHP代码片段中,我看不到如何生成新文件。相反,我在浏览器中执行的PHP脚本只是在浏览器中呈现变形文件。我不希望这种情况发生,我希望能够将dest路径传递给函数,并让它创建新文件(而不是向客户端/浏览器发送任何内容),顶部45px和底部45px被删除。很明显header('Content-Type: image/jpeg');是问题的一部分,但删除它仍然不会给我一个写入服务器的目标文件,这是一种方法。
    2. 我也在寻找PHP docs here。似乎改变imagecopy($dest, $src, 0, 0, 20, 13, $width, $height);中的参数会解决这个问题,但我真的不清楚这些参数应该是什么。带有黑条的resulting thumbnails inside the YouTube tab look odd。提前感谢任何建议。

1 个答案:

答案 0 :(得分: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);
}