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 に答える