2012-08-28 82 views
1

我正在拍摄源图像并尝试基于用户选择裁剪它。它总是留下一个黑色的空白空间,我认为它与我使用的参数不正确的顺序有关。在查看php文档中的imagecopyresampled()之后,我仍然想尽一切办法来完成这项工作。imagecopyresampled裁剪黑色条

这是我的。我为示例使用了硬编码值,但每个图像的每个$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); 
+0

如果我只是在错误的路径上,请纠正我,但您的变量标识符建议您使用需要维度的坐标。顺序是_dest坐标 - 源坐标 - 目标尺寸 - 源尺寸_ – Andre

+0

它们是坐标,但在技术上不是它们的尺寸,因为我选择的x和y要裁剪? –

+0

由于裁剪区域的尺寸(也是尺度)应该保留,因此目标尺寸和来源(=作物面积)尺寸必须相同。请参阅下面的答案。 – Andre

回答

2

也许这是因为你没有正确计算裁剪区域的尺寸。除此之外,您还可以使用坐标,其中应该使用尺寸。比较参数7和8。 请注意,这不会保持透明度。

<?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/stackoverflow/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); 
?> 
+0

就是这样,我在x2/y2的印象之下计算了它,显然我错了。非常感谢你。 –

0

请参见下面的网址: -

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(); 

?> 
+0

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)' –