我如何使用IMC_CROP_TRANSPARENT的imagecropauto()?

时间:2016-11-11 16:11:30

标签: php gd

当我尝试裁剪图像的透明区域时,它会保持原始大小,并且透明区域会变黑。

如果我运行此代码:

<?php
    // Create a 300x300px transparant image with a 100px wide red circle in the middle
    $i = imagecreatetruecolor(300, 300);
    imagealphablending($i, FALSE);
    imagesavealpha($i, TRUE);
    $transparant = imagecolorallocatealpha($i, 0xDD, 0xDD, 0xDD, 0x7F);
    imagefill($i, 0, 0, $transparant);
    $red = imagecolorallocate($i, 0xFF, 0x0, 0x0);
    imagefilledellipse($i, 150, 150, 100, 100, $red);
    imagepng($i, "red_300.png");

    // Crop away transparant parts and save
    $i2 = imagecropauto($i, IMG_CROP_TRANSPARENT);
    imagepng($i2, "red_crop_trans.png");
    imagedestroy($i2);

    // Crop away bg-color parts and save
    $i2 = imagecropauto($i, IMG_CROP_SIDES);
    imagepng($i2, "red_crop_sides.png");
    imagedestroy($i2);

    // clean up org image
    imagedestroy($i);

我最终得到的red_crop_trans.png图片为300x300px黑色图片,其中包含100x100px个红色圆圈。 还有一张red_crop_sides.png是一张100x100px黑色图片,里面有一个100x100px个红色圆圈。

为什么red_crop_trans.png没有歪曲到100x100px?为什么两个图像的背景都是黑色的?如何在保持transparace的同时裁剪它们?

1 个答案:

答案 0 :(得分:3)

我花了一段时间才弄明白到底发生了什么。事实证明$i2 = imagecropauto($i, IMG_CROP_TRANSPARENT);返回false而不是true。根据文件:

  

当没有要裁剪的内容时,imagecropauto()会返回FALSE   整个图像将被裁剪。

因此我使用IMG_CROP_TRANSPARENT代替IMG_CROP_DEFAULT

  

尝试使用IMG_CROP_TRANSPARENT,如果失败,则会回退到   IMG_CROP_SIDES。

这给了我预期的结果。现在我自己并没有获得任何黑色背景。但这是一个已知问题,因此很容易找到解决方案:

imagecolortransparent($i, $transparant); // Set background transparent

这让我看到了最终完成的代码:

<?php
    // Create a 300x300px transparant image with a 100px wide red circle in the middle
    $i = imagecreatetruecolor(300, 300);
    imagealphablending($i, FALSE);
    imagesavealpha($i, TRUE);
    $transparant = imagecolorallocatealpha($i, 0xDD, 0xDD, 0xDD, 0x7F);
    imagecolortransparent($i, $transparant); // Set background transparent
    imagefill($i, 0, 0, $transparant);
    $red = imagecolorallocate($i, 0xFF, 0x0, 0x0);
    imagefilledellipse($i, 150, 150, 100, 100, $red);
    imagepng($i, "red_300.png");

    // Crop away transparant parts and save
    $i2 = imagecropauto($i, IMG_CROP_DEFAULT); //Attempts to use IMG_CROP_TRANSPARENT and if it fails it falls back to IMG_CROP_SIDES.
    imagepng($i2, "red_crop_trans.png");
    imagedestroy($i2);

    // Crop away bg-color parts and save
    $i2 = imagecropauto($i, IMG_CROP_SIDES);
    imagepng($i2, "red_crop_sides.png");
    imagedestroy($i2);

    // clean up org image
    imagedestroy($i);

?>