2011-10-21 56 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

明智的解釋和答案。像絲綢一樣順滑。非常感謝。 –

相關問題