0

我想从透明的 16x16 画布上裁剪不透明的像素。由于非透明像素实际上是图像。可以在 PHP GD 或 Imagick 中使用吗?

4

3 回答 3

1

只是花了很长时间摆弄这个,现在是凌晨!

我在任何地方都找不到只使用 GD 的函数/脚本,所以我希望这对某人有所帮助。

本质上,它循环遍历源图像的行和列,确定整个行/列是否透明,如果是,则相应地更新 $left、$right、$top 和 $bottom 变量。

我能想到的唯一限制是一个图像,其中有一行或一列将图像从中间分开,此时这将标记 $bottom 或 $right 早于预期,但对于任何寻找的人来说都是一个好的开始。

在我的情况下,源图像是一个 gd 资源,最后需要一些 imagedestroy() 调用......

function transparent($src_img,$in){
    $c = imagecolorsforindex($src_img,$in);
    if($c["alpha"] == 127){
        return true;
    }else{
        return false;
    }
    //var_dump($c);
}

function crop($src_img){

    $width = imagesx($src_img);
    $height = imagesy($src_img);

    $top = 0;
    $bottom = 0;
    $left = 0;
    $right = 0;

    for($x=0;$x<$width;$x++){
        $clear = true;
        for($y=0;$y<$height;$y++){
            if ($this->transparent($src_img,imagecolorat($src_img, $x, $y))){

            }else{
                $clear = false;
            }
        }
        if($clear===false){
            if($left == 0){
                $left = ($x-1);
            }
        }
        if(($clear===true)and($left != 0)){
            if($right == 0){
                $right = ($x-1);
            }else{
                break;
            }
        }
    }

    for($y=0;$y<$height;$y++){
        $clear = true;
        for($x=0;$x<$width;$x++){
            if ($this->transparent($src_img,imagecolorat($src_img, $x, $y))){

            }else{
                $clear = false;
            }
        }
        if($clear===false){
            if($top == 0){
                $top = ($y-1);
            }
        }
        if(($clear===true)and($top != 0)){
            if($bottom == 0){
                $bottom = ($y-1);
            }else{
                break;
            }
        }
    }

    $new = imagecreatetruecolor($right-$left, $bottom-$top);
    $transparent = imagecolorallocatealpha($new,255,255,255,127);
    imagefill($new,0,0,$transparent);


    imagecopy($new, $src_img, 0, 0, $left, $top, $right-$left, $bottom-$top);
    return $new;

}
于 2015-06-24T01:14:07.863 回答
0

image magick 有一个修剪方法http://www.php.net/manual/en/imagick.trimimage.php我认为这就是你需要的

<?php
/* Create the object and read the image in */
$im = new Imagick("image.jpg");

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

/* Ouput the image */
header("Content-Type: image/" . $im->getImageFormat());
echo $im;
?>
于 2013-04-27T15:59:14.873 回答
0

由于图像非常小,您可以使用imagecolorat循环遍历所有像素,然后使用imagesetpixel将不透明的像素写入新图像,或者记下角落并使用imagecopy复制整个内容

就像是:

$x1 = -1;
$y1 = -1;
for($x=0;$x<16;$x++){
    for($y=0;$y<16;$y++){
        if (!transparent(imagecolorat($im, $x, $y))){
            if($x1 < 0 ){
                $x1 = $x;
                $y1 = $y;
            }else{
                $x2 = $x;
                $y2 = $y;       
            }
        }
    }
}
imagecopy($im2, $im, 0, 0, $x1, $y1, $x2-$x1+1, $y2-$y1+1); 

您将必须定义函数 transparent() - 要么进行位移以获取 alpha 通道,要么识别透明颜色(如果它是 gif)。

编辑:高度/宽度数学更新

于 2013-04-18T21:11:09.250 回答