在PHP中從圖像中裁剪空白



image gd (4)

是否可以刪除PHP中圖像周圍的空白?

注意:澄清我的意思是像photoshops修剪功能。

謝謝。

https://ffff65535.com


Gnud的腳本冗餘地調用imagesx和imagesy。 它還會迭代每一側的每個像素,即使角落重疊也是如此。 這種改進版本消除了冗餘函數調用,並且只檢查每個像素一次,從而顯著提高了速度。 如果每個像素都被修剪,該函數返回一個等於2的狀態($ result ['#'])。

example();
function example(){
    $img = imagecreatefromjpeg("http://ecx.images-amazon.com/images/I/413XvF0yukL._SL500_AA280_.jpg");

    // find the trimmed image border
    $box = imageTrimBox($img);

    // copy cropped portion
    $img2 = imagecreate($box['w'], $box['h']);
    imagecopy($img2, $img, 0, 0, $box['l'], $box['t'], $box['w'], $box['h']);

    // output cropped image to the browser
    header('Content-Type: image/png');
    imagepng($img2);

    imagedestroy($img);
    imagedestroy($img2);
}



function imageTrimBox($img, $hex=null){
if (!ctype_xdigit($hex)) $hex = imagecolorat($img, 0,0);
$b_top = $b_lft = 0;
$b_rt = $w1 = $w2 = imagesx($img);
$b_btm = $h1 = $h2 = imagesy($img);

do {
    //top
    for(; $b_top < $h1; ++$b_top) {
        for($x = 0; $x < $w1; ++$x) {
            if(imagecolorat($img, $x, $b_top) != $hex) {
                break 2;
            }
        }
    }

    // stop if all pixels are trimmed
    if ($b_top == $b_btm) {
        $b_top = 0;
        $code = 2;
        break 1;
    }

    // bottom
    for(; $b_btm >= 0; --$b_btm) {
        for($x = 0; $x < $w1; ++$x) {
            if(imagecolorat($img, $x, $b_btm-1) != $hex) {
                break 2;
            }
        }
    }

    // left
    for(; $b_lft < $w1; ++$b_lft) {
        for($y = $b_top; $y <= $b_btm; ++$y) {
            if(imagecolorat($img, $b_lft, $y) != $hex) {
                break 2;
            }
        }
    }

    // right
    for(; $b_rt >= 0; --$b_rt) {
        for($y = $b_top; $y <= $b_btm; ++$y) {
            if(imagecolorat($img, $b_rt-1, $y) != $hex) {
                break 2;
            }
        }

    }

    $w2 = $b_rt - $b_lft;
    $h2 = $b_btm - $b_top;
    $code = ($w2 < $w1 || $h2 < $h1) ? 1 : 0;
} while (0);

// result codes:
// 0 = Trim Zero Pixels
// 1 = Trim Some Pixels
// 2 = Trim All Pixels
return array(
    '#'     => $code,   // result code
    'l'     => $b_lft,  // left
    't'     => $b_top,  // top
    'r'     => $b_rt,   // right
    'b'     => $b_btm,  // bottom
    'w'     => $w2,     // new width
    'h'     => $h2,     // new height
    'w1'    => $w1,     // original width
    'h1'    => $h1,     // original height
);
}

PHP的gd庫有imagecropauto函數:

<?php 
$img=imagecreatefrompng("tux.png"); // Load and instantiate the image
if($img) {
  $cropped=imagecropauto($img,IMG_CROP_DEFAULT); // Auto-crop the image

  imagedestroy($img); // Clean up as $img is no longer needed

  header("Content-type: image/png"); // Set the appropriate header so the browser
                                     // knows how to present it
  imagepng($cropped); // Return the newly cropped image
}

默認情況下, imagecropauto將嘗試使用透明度進行裁剪,然後使用圖像的4個角落重新嘗試檢測要裁剪的背景; 在上面的示例中,我也成功使用以下常量代替IMG_CROP_AUTO

  • IMG_CROP_BLACK - 適用於黑色背景的圖像
  • IMG_CROP_WHITE - 對於具有白色背景的圖像很有用
  • IMG_CROP_THRESHOLD - 允許您設置裁剪時使用的顏色和閾值

從5.5版開始, imagecropauto已包含在php中,有關更多信息,請參閱此處的imagecropautoPHP文檔


我知道這已經很老了但是如果你啟用了ImageMagick,你可以使用這個方法

修剪圖像


查看PHP中的ImageMagick庫。 它具有處理和操作圖像(包括crop )的良好方法。

你必須弄清楚圖像周圍的“空白”。 這可能具有挑戰性,因為“空白”可能是白色,其他顏色,透明度等......





crop