2011-10-21 40 views
11

我试图修剪图像中只有左侧和右侧使用ImageMagick和PHP可变数量的空白。有谁知道如何做到这一点(也许使用imagemagick以外的东西?)?如何在PHP中使用Imagemagick修剪图像的左侧和右侧?

下面是一个例子。

我有这两个图像:
Test
Test Again
每个具有被动态地在一个固定的宽度的图像创建的文本的可变量。 我需要做的是修剪掉右边的背景和左侧所以图像打印出来是这样的:
TestResult
Test Again Result

如果ImageMagick的不能做到这一点,我愿意用别的东西,但我将需要帮助,因为我不是一个程序员。谢谢!

这里是我当前的代码,修剪图像的所有方面:

<?php 
/* Create the object and read the image in */ 
$i = '3'; 
$im = new Imagick("test".$i.".png"); 

/* Trim the image. */ 
$im->trimImage(0); 

/* Ouput the image */ 
//header("Content-Type: image/" . $im->getImageFormat()); 
//echo $im; 
/*** Write the trimmed image to disk ***/ 
$im->writeImage(dirname(__FILE__) . '/test'.$i.'.png'); 
/*Display Image*/ 
echo $img = "<img src=\"test".$i.".png\">"; 
?> 

回答

4

从我可以在ImageMagick的文档看到cropping and borders,它似乎并不可能。

您无法为“智能”裁剪指定边缘(在命令行中称为-trim),并且接受几何参数的所有裁剪方法都需要固定数量进行裁剪。

想到的唯一想法是在单独的调用中获取剃毛区域的颜色,运行trimImage,并使用-border将损失区域添加回来。

编辑: IM手册建议类似的东西。退房Trimming Just One Side of an Image.我不熟悉即时通讯的PHP扩展,将代码翻译成PHP调用,但它应该是半途而废的。

+3

我能够使用以下代码修剪图像的右侧和左侧:exec('convert test4.png -gravity West -background white -splice 5x0 -background black -splice 5x0 -trim + repage -chop 5x0 test44。PNG');谢谢! exec('convert test44.png -gravity East -background white -splice 1x0 -background black -splice 1x0 -trim + repage -chop 1x0 test44.png'); – Nathan

+0

您还可以将裁剪边组合成一个命令(这会更高效,并且会提供更好的质量),例如,对于右边距和底部边距:'convert -gravity北 - 背景白色拼接0x1 -trim + repage -chop 0x1 - 重力西 - 背景白-splice 1x0 -trim + repage -chop 1x0 ' – dvo

0

使用cropImage()代替。事情是这样的,也许:

$img_x_size = 800; // Set these to relevant values 
$img_y_size = 600; 

$crop_pixels = 20; // How many pixels to crop 

// cropImage(XsizeOfCrop, YsizeOfCrop, CropXPos, CropYPos) 
$im->cropImage($img_x_size - $crop_pixels, $img_y_size, 0, $crop_pixels/2); 
+0

这个问题(如果我了解crop_pixels co正确)是它只能移除固定数量的像素 - trimImage实际上会裁剪图像,直到出现背景颜色以外的其他东西(以使图像尽可能小)。所以我不认为这会起作用....我澄清了我的问题,因为它有点混乱。谢谢! – Nathan

1

使用GD:

function imageautocrop(&$img) { 
    $emptycol = function ($img, $x, $min, $max) { 
     for($y=$min; $y<$max; $y++) { 
      $col = imagecolorsforindex($img, imagecolorat($img, $x, $y)); 
      if($col['alpha'] != 127) return false; 
     } 
     return true; 
    } 
    $trim = Array('top'=>0,'bot'=>0,'lft'=>0,'rgt'=>0); 
    $size = Array('x'=>imagesx($img)-1,'y'=>imagesy($img)-1); 
    // code for affecting rows removed due to question asked 
    while($emptycol($img, $trim['lft'], $trim['top'], $size['y']-$trim['bot'])) $trim['lft']++; 
    while($emptycol($img, $size['x']-$trim['rgt'], $trim['top'], $size['y']-$trim['bot'])) $trim['rgt']++; 
    $newimg = imagecreate($size['x']-$trim['lft']-$trim['rgt']+1, $size['y']-$trim['top']-$trim['bot']+1); 
    imagecopy($newimg, $img, 0, 0, $trim['lft'], $trim['top'], imagesx($newimg)+1, imagesy($newimg)+1); 
    imagedestroy($img); 
    $img = $newimg; 
} 

这是我的很旧代码,所以可能不是最优的,但它的工作。

+0

我试过使用你的代码,但我不能让它工作......就像我说我不是一个程序员太多。你可以给我线加载图像,然后写入更改图像?对不起,我的无知。 – Nathan

+0

'$ img = imagecreatefrompng(“FILENAME.png”); imageautocrop($ IMG); imagepng($ img,“NEWFILENAME.png”);' –

5

基于GD的库WideImage有类似的东西。它被称为autoCrop,默认情况下它可以在所有四个方面工作。

但是,您可以添加另一个参数,并基于它只裁剪顶部/底部或左/右。

autoCrop code

这是相当有据可查的。 $imgWideImage_Image类型。还有一个interactive online demo of it

相关问题:Removing black bars off video thumbnail

+1

作为附加评论:您可以使用该库并切割所有面,然后使用相同的库将裁剪后的图像居中放置到具有正确高度的另一张图片上与裁剪后的图像宽度相同)与背景颜色有关。完成作业(如果文本最初位于y轴上)。 – hakre

+0

这看起来像它会工作(我有WideImage启动和运行) - 但我不知道如何添加另一个参数只autocrop的图像的左侧和右侧。你能提供代码吗?谢谢你的帮助。 – Nathan

0

这是因为文本是动态生成

  • 生成文字图像,确定宽度(图像)
  • 叠加文本图像分割成背景,确定宽度(背景)
  • 使用一个两个步骤过程工具如上所述,作物(宽度(背景)-width(图像)/ 2在任一侧上

诀窍是找出的宽度(图像)见:How can I auto adjust the width of a GD-generated image to fit the text?

话又说回来,如果你知道宽度(图像),你可以先覆盖之前裁剪宽度(背景)

12

我认为你是正确的轨道ImageMagick-trim操作1),但诀窍是把它告诉你它离不开实际上做它,然后修改,这样做你真正想要的...

因此,要修剪盒ImageMagick计算你的第一张图片,你这样做:

convert -fuzz 10% image.jpg -format "%@" info: 
60x29+21+31 

这是一个60x29像素的矩形,从左上角开始偏移21和下降31。现在,我们想要得到这些值bash变量,所以我设置了IFS(输入分隔符)分割的空间,x+标志字段:

#!/bin/bash 
IFS=" x+" read a b c d < <(convert -fuzz 10% image.jpg -format "%@" info:) 

echo $a $b $c $d 
60 29 21 31 

现在我可以忽略2931因为我们只是在裁剪宽度感兴趣,作物像这样:

convert image.jpg -crop "${a}x+${c}+0" out.jpg 

因此,对于您2个图像,我得到这些:

enter image description here enter image description here

和全过程是这样的:

#!/bin/bash 
IFS=" x+" read a b c d < <(convert -fuzz 10% image.jpg -format "%@" info:) 
convert image.jpg -crop "${a}x+${c}+0" out.jpg 

1)-format %@是只为-trim操作者,这将是本完全

convert image.jpg -trim info: 
image.jpg JPEG 72x40 200x100+16+24 8-bit sRGB 0.000u 0:00.000 
的速记
+0

明智的解释和答案。像丝绸一样顺滑。非常感谢。 –

相关问题