imagecopyresampled 裁剪 黑条

Posted

技术标签:

【中文标题】imagecopyresampled 裁剪 黑条【英文标题】:imagecopyresampled cropping black bar 【发布时间】:2012-08-28 20:29:55 【问题描述】:

我正在拍摄源图像并尝试根据用户选择对其进行裁剪。虽然它总是留下一个黑色的空白空间,但我假设它与我以错误顺序使用的参数有关。在查看了 imagecopyresampled() 的 php 文档之后,我仍然没有找到一种方法来完成这项工作。

这就是我所拥有的。我在示例中使用了硬编码值,但每个 $targ_ 变量会因每个图像而变化。

$targ_w = 183;      // width of cropped selection
$targ_h = 140;      // height of cropped selection
$targ_x = 79;           // x-coordinate of cropped selection
$targ_y = 59;           // y-coordinate of cropped selection
$targ_x2 = 263;         // x-coordinate of 2nd point (end of selection)
$targ_y2 = 199;     // y-coordinate of 2nd point (end of selection)

$src = '/uploads/test.png';
$img_r = imagecreatefrompng($src);
$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );

imagecopyresampled($dst_r,$img_r,0,0,$targ_x,$targ_y,$targ_x2,$targ_y2,$targ_w,$targ_h);

$newFileName = '/uploads/test2.png';
imagepng($dst_r, $newFileName, 9);

【问题讨论】:

如果我走错了路,请纠正我,但您的变量标识符建议您在需要尺寸的地方使用坐标。顺序为目标坐标 - 源坐标 - 目标维度 - 源维度 它们是坐标,但从技术上讲,它们不是尺寸,因为我正在裁剪选择的 x 和 y? 因为应该保留裁剪区域的尺寸(比例尺也是如此),所以目标尺寸和源(=裁剪区域)尺寸必须相同。请参阅下面的答案。 【参考方案1】:

可能只是因为您没有正确计算裁剪区域的尺寸。除此之外,您使用坐标,应该使用尺寸。比较参数七和八。 请注意,这不会保留透明度。

<?php
$targ_x1 = 59;      // x-coordinate of cropped selection
$targ_y1 = 69;      // y-coordinate of cropped selection
$targ_x2 = 160;     // x-coordinate of 2nd point (end of selection)
$targ_y2 = 82;      // y-coordinate of 2nd point (end of selection)

//1st: dynamically calculate the dimensions
$crop_area_width = $targ_x2-$targ_x1;      // width of cropped selection
$crop_area_height = $targ_y2-$targ_y1;      // height of cropped selection

$image_path = 'http://cdn.sstatic.net/***/img/sprites.png';
$src_img = imagecreatefrompng($image_path);
$dst_img = imagecreatetruecolor($crop_area_width, $crop_area_height);

//2nd: cropping does not change scale so source and target dimensions are the same
imagecopyresampled( $dst_img, $src_img, 0, 0, $targ_x1, $targ_y1, $crop_area_width, $crop_area_height, $crop_area_width, $crop_area_height);

header('Content-Type: image/png');
imagepng($dst_img);
?>

【讨论】:

就是这样,我的印象是 x2 / y2 是计算出来的,显然我错了。非常感谢。【参考方案2】:

见以下网址:-

Cropping an image with imagecopyresampled() in PHP without fopen

试试这个:-

<?php

function load_file_from_url($url) 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $str = curl_exec($curl);
    curl_close($curl);
    return $str;


class cropImage
 var $imgSrc,$myImage,$thumb;
 function setImage($image) 
       //Your Image
         $this->imgSrc = $image; 

       //create image from the jpeg
         $this->myImage = imagecreatefromstring($this->imgSrc) or die("Error: Cannot find image!");
         $this->thumb = imagecreatetruecolor(200, 112);

        //imagecopyresampled($this->thumb, $this->myImage, 0, 0, 0, 45, 200, 112, 480, 270);
         imagecopy($this->thumb, $this->myImage, 0, 0, 0, 45, 200, 112, 480, 270); 
    
    function renderImage()
                                
         header('Content-type: image/jpeg');
         imagejpeg($this->thumb);
         imagedestroy($this->thumb); 
         //imagejpeg($this->myImage);
         //imagedestroy($this->myImage); 
    
  

    $image = new cropImage;
    $image->setImage(load_file_from_url($_GET['src']));
    $image->renderImage();

?>

【讨论】:

imagecopy() 的参数似乎太多了 PHP.net 说 imagecopy() 是 bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )

以上是关于imagecopyresampled 裁剪 黑条的主要内容,如果未能解决你的问题,请参考以下文章

PHP imagecopyresampled + 如何获得最佳结果

UIImagePickerController 允许编辑错误地裁剪图像,在顶部留下黑条

在 ubuntu 上使用 ffmpeg 裁剪视频中的黑条会改变视频大小

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

为啥裁剪图像后会出现黑色区域​​?

在 PHP 中裁剪图像会留下黑色空间