В следующем фрагменте кода PHP используется GD для изменения размера загруженного браузером PNG до 128x128. Он отлично работает, за исключением того, что прозрачные области в исходном изображении заменяются сплошным черным цветом в моем случае.
Даже если imagesavealpha
установлено, что-то не так.
Как лучше всего сохранить прозрачность передискретизированного изображения?
$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType )
= getimagesize( $uploadTempFile );
$srcImage = imagecreatefrompng( $uploadTempFile );
imagesavealpha( $targetImage, true );
$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage,
0, 0,
0, 0,
128, 128,
$uploadWidth, $uploadHeight );
imagepng( $targetImage, 'out.png', 9 );
alphablending = false
здесь важно? В документе говорится : «imagealphablending($im, false)
Чтобы использовать его, нужно отключить alphablending ( )».imagecreatefrompng()
предполагает, что этоimagealphablending
следует установитьtrue
, что явно неверно. Большое спасибо.Почему вы все так усложняете? следующее - то, что я использую, и до сих пор это помогло мне.
источник
Я считаю, что это должно помочь:
edit: Кто-то в документах PHP утверждает,
imagealphablending
что это правда, а не ложь. YMMV.источник
imagealphablending
либо true, либо false, я всегда получаю черный фон.Дополнение, которое может помочь некоторым людям:
Во время построения изображения можно переключать альфваблинг изображения. В конкретном случае, когда мне это было нужно, я хотел объединить несколько полупрозрачных PNG на прозрачном фоне.
Сначала вы устанавливаете imagealphablending на false и заполняете только что созданное изображение истинного цвета прозрачным цветом. Если бы imagealphablending было истинным, ничего бы не произошло, потому что прозрачная заливка слилась бы с черным фоном по умолчанию и в результате была бы черной.
Затем вы переключаете imagealphablending на true и добавляете некоторые изображения PNG на холст, оставляя часть фона видимой (т.е. не заполняя все изображение).
В результате получается изображение с прозрачным фоном и несколько объединенных изображений PNG.
источник
Я сделал функцию для изменения размера изображения, такого как JPEG / GIF / PNG,
copyimageresample
и изображения PNG все еще сохраняют прозрачность:источник
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
Я полагаю, это может помочь:
Обратной стороной является то, что изображение будет лишено каждых 100% зеленых пикселей. Во всяком случае, надеюсь, это поможет :)
источник
imagecreate(...)
работал. Вы создаете изображение, которое заполняется первым выделенным вами цветом. Затем вы устанавливаете этот цвет на прозрачный. Если для целевого изображения задано значение true, оба изображения будут объединены, и прозрачность будет работать правильно.Пересортировка сохранения прозрачности, тогда да, как указано в других сообщениях, для imagesavealpha () необходимо установить значение true, для использования альфа-флага imagealphablending () необходимо установить значение false, иначе это не сработает.
Также я заметил в вашем коде две незначительные вещи:
getimagesize()
чтобы получить ширину / высоту дляimagecopyresmapled()
$uploadWidth
И$uploadHeight
должно быть-1
значение, так как cordinates начинается0
и не1
, поэтому было бы скопировать их в пустой пиксель. Заменив его на:imagesx($targetImage) - 1
иimagesy($targetImage) - 1
, относительно должно быть :)источник
Вот мой общий тестовый код. Меня устраивает
источник
Обратите внимание на исходное изображение
width
иheight
значения, которые передаются вimagecopyresampled
функцию. Если они больше фактического размера исходного изображения, остальная часть изображения будет заполнена черным цветом.источник
Я объединил ответы ceejayoz и Cheekysoft, что дало мне лучший результат. Без imagealphablending () и imagesavealpha () изображение нечеткое:
источник