2016-11-11 2 views
-1

Когда я пытаюсь обрезать область прозрачности изображения, его размер будет иметь первоначальный размер, а области прозрачности становятся черными.Как использовать imagecropauto() с IMG_CROP_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); 
    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 красным кружком в нем. И красный_crop_sides.png, который представляет собой черный номер 100x100px с красным кругом в нем 100x100px.

Почему red_crop_trans.png не обрезано до 100x100px? и почему фон обоих изображений черный? И как мне обрезать их, сохраняя прозрачность?

+0

опробован на Ubuntu 16.10, с PHP 7.0.8-3ubuntu3 , и GD-библиотека. Версия 2.2.1 –

ответ

2

Мне потребовалось некоторое время, чтобы выяснить, что именно происходит. Оказалось, что $i2 = imagecropauto($i, IMG_CROP_TRANSPARENT); возвращал ложь вместо истины. Согласно документации:

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); 

?> 
+0

Это изменило, но не решило, теперь IMG_CROP_TRANSPARENT также возвращает 100x100, но все еще с черным фоном. Но если код работает для вас, то что-то не так с php или с библиотеками, вы также работаете с Ubuntu? если не возможно, это проблема, связанная с Ubuntu. –

+0

@PugganSe Это не звучит как проблема Ubuntu для меня. Я пробовал это в Windows (wamp), но когда я ищу эту проблему, она, похоже, связана с порядком операций в коде. Возможно, вы можете больше узнать из этого вопроса здесь: http://stackoverflow.com/questions/2611852/imagecreatefrompng-makes-a-black-background-instead-of-transparent – icecub

+0

Порядок работы? При сохранении $ i у него есть прозрачность, следующим шагом является обрезка, а затем другое сохранение, не может изменить этот порядок операций. –