PHP / GD ile, nasıl bir görüntüyü kırpmak mı?

2 Cevap php

I mimic the trim behavior of Photoshop GD and PHP ile (her taraftan aynı renk ile kaplı alanı kırpmak) istiyorum ama bunu gerçekleştirmek için nasıl fikirleri eksik var.

Birisi bunu yapmak nasıl bir fikrin varsa ben onu çok duymak istiyorum.

Şimdiden teşekkürler.

2 Cevap

Aklıma en kolay çözümdür:

  1. Sol üst pikselin rengini öğrenin.
  2. Sırasıyla üst, alt, sol el ve sağ tarafında başlayan, yatay ve dikey çizgi ile görüntü hattı üzerinden gidin. Bir çizgi, sol üst köşede karşılaşılan SADECE renk oluşuyorsa o yapması için ayarlanabilir boş alandır. X artırarak çıkan görüntü o satırı atlamak veya y sizin imagecopy * () fonksiyonu koordinat.

Denenmemiş ama işe yarayabilir.

BTW, ImageMagick kutudan yapabilirsiniz: http://www.imagemagick.org/Usage/crop/#trim

Here's bir örnek işlevi (bu da dolgu ekleyebilirsiniz):

// Trims an image then optionally adds padding around it.
// $im  = Image link resource
// $bg  = The background color to trim from the image
// $pad = Amount of padding to add to the trimmed image
//        (acts simlar to the "padding" CSS property: "top [right [bottom [left]]]")
function imagetrim(&$im, $bg, $pad=null){

    // Calculate padding for each side.
    if (isset($pad)){
        $pp = explode(' ', $pad);
        if (isset($pp[3])){
            $p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[3]);
        }else if (isset($pp[2])){
            $p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[1]);
        }else if (isset($pp[1])){
            $p = array((int) $pp[0], (int) $pp[1], (int) $pp[0], (int) $pp[1]);
        }else{
            $p = array_fill(0, 4, (int) $pp[0]);
        }
    }else{
        $p = array_fill(0, 4, 0);
    }

    // Get the image width and height.
    $imw = imagesx($im);
    $imh = imagesy($im);

    // Set the X variables.
    $xmin = $imw;
    $xmax = 0;

    // Start scanning for the edges.
    for ($iy=0; $iy<$imh; $iy++){
        $first = true;
        for ($ix=0; $ix<$imw; $ix++){
            $ndx = imagecolorat($im, $ix, $iy);
            if ($ndx != $bg){
                if ($xmin > $ix){ $xmin = $ix; }
                if ($xmax < $ix){ $xmax = $ix; }
                if (!isset($ymin)){ $ymin = $iy; }
                $ymax = $iy;
                if ($first){ $ix = $xmax; $first = false; }
            }
        }
    }

    // The new width and height of the image. (not including padding)
    $imw = 1+$xmax-$xmin; // Image width in pixels
    $imh = 1+$ymax-$ymin; // Image height in pixels

    // Make another image to place the trimmed version in.
    $im2 = imagecreatetruecolor($imw+$p[1]+$p[3], $imh+$p[0]+$p[2]);

    // Make the background of the new image the same as the background of the old one.
    $bg2 = imagecolorallocate($im2, ($bg >> 16) & 0xFF, ($bg >> 8) & 0xFF, $bg & 0xFF);
    imagefill($im2, 0, 0, $bg2);

    // Copy it over to the new image.
    imagecopy($im2, $im, $p[3], $p[0], $xmin, $ymin, $imw, $imh);

    // To finish up, we replace the old image which is referenced.
    $im = $im2;
}