Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP, GD: Черный фон сзади у png

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте,
 
Нашел скрипт наложения картинки на картинку,но когда попадаются картинки в png с прозрачными участками,то они превращаются в черный.
 
Как отменить черный фон,я куча способов перепробовал  
и ставил  
imagealphablending
 
imagesavealpha
 
Вот сам код:

Код:
 
header('content-type: image/png');  
 
// получаем имя изображения через GET
$image = $_GET['image'];  
 
// создаём водяной знак
$watermark = imagecreatefrompng('watermark.png');    
 
// получаем значения высоты и ширины водяного знака
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);  
 
// создаём jpg из оригинального изображения
$image_path = '/path/to/image/folder/' . $image;
$image = imagecreatefrompng($image_path);
//если что-то пойдёт не так
if ($image === false) {
    return false;
}
$size = getimagesize($image_path);
// помещаем водяной знак на изображение
$dest_x = $size[0] - $watermark_width - 5;
$dest_y = $size[1] - $watermark_height - 5;
 
imagealphablending($image, true);
imagealphablending($watermark, true);
// создаём новое изображение
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
imagejpeg($image);
// освобождаем память
imagedestroy($image);
imagedestroy($watermark);  

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 20:43 11-10-2013 | Исправлено: Cheery, 21:02 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578
www.php.net/imagecopymerge
 
imagecopy не поддерживает прозрачность
там же примеры

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:02 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
заменить imagecopy на imagecopymerge?

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 21:11 11-10-2013 | Исправлено: maxus5578, 21:11 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578

Цитата:
заменить imagecopy на imagecopymerge?

а разме можно как то иначе было прочитать ответ?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:12 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
изменил,эффект не изменился,а $watermark стал черным вместо прозрачного

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 21:18 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578
 
хотя, все же, видимо придется вернуться.. я же сказал - смотрите примеры, не вы же первый столкнулись с таким
 

Цитата:
<?
$flag = imagecreatefrompng('flags/images/flagWhiteFill.png');
$mask = imagecreatefrompng('flags/images/flag_transparent.png');
 
imagealphablending($flag, 1);
imagealphablending($mask, 1);
 
imagecopy($flag, $mask, 0,0,0,0,25,43);
 
Header("Content-type: image/jpeg");
imagepng($flag);
?>
 
ImageSaveAlpha(resource, bool);   made the transparent color - not transparent... dunno why

 
хотя это, похоже, такой же код..
 
сейчас попробую воспроизвести у себя.
 
Добавлено:
В общем это проблема с поддержкой PNG-24
C PNG-8 проблем нет.
 
http://stackoverflow.com/q/11680734/1164491

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:23 11-10-2013 | Исправлено: Cheery, 21:41 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
а что же делать тогда,как картинки в PNG-8 переделывать?
 
P.S. Картинки я не создаю,их получаю через $_GET['image'] с других сайтов

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 21:53 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578
я смотрю пока.. у меня получается и с png-24, но тогда водяной знак черный фон имеет.  
основная картинка в порядке.
 
обязательно сохранять в png? то есть прозрачность конечного изображения точно нужна?
 
проблема, насколько понимаю, в том, что что у PNG-24 нет альфа канала, там прозрачность иначе реализована.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:55 11-10-2013 | Исправлено: Cheery, 21:58 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery, мне без разницы какой формат сохранять,чтоб только все было норм,то есть картинка если имеет прозрачность то превращалась в белый фон, и водяной знак тоже был пробрачным
 
Добавлено:
а можно как то конвертировать картинки  PNG-8?

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 22:02 11-10-2013 | Исправлено: maxus5578, 22:02 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578
 
Я тут "намудрил", работает, но водяной знак нужно аккуратно подбирать, там возникают "артефакты" по краям..

Код:
$flag = imagecreatefrompng('image2.png');  
$mask = imagecreatefrompng('image.png');  
 
imagesavealpha($flag, 1);  
imagealphablending($flag, 1);
imagesavealpha($mask, 1);  
imagealphablending($mask, 1);
 
imagecopymerge_alpha($flag, $mask, 0, 0, 0, 0, 200, 200, 100);  
 
header("Content-type: image/png");  
imagepng($flag);  
 
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){  
    // creating a cut resource  
    $cut = imagecreatetruecolor($src_w, $src_h);  
    imagecolortransparent ($cut, imagecolorallocate($cut, 255, 0, 0));
    imagefill($cut, 0, 0, imagecolorallocate($cut, 255, 0, 0));
    // copying relevant section from background to the cut resource  
    #imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);  
     
    // copying relevant section from watermark to the cut resource  
    imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);  
     
    // insert cut resource to destination image  
    imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct);
}
 

что то лишнее, наверняка.
оно просто заливает фон водяного знака красным цветом (можно выбрать любой), делает его прозрачным.. тогда срабатывает, но нет плавного перехода на границах водяного знака. это так, по быстрому - времени мало на подобное у меня
 
а Imagick есть на сервере?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:37 11-10-2013 | Исправлено: Cheery, 22:43 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
так сказать "артефакты" вылазят так вылазят.Спасибо за помощь, вы прям гений во всем, что не спросишь все знает. =)

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 23:00 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578
imagemagick установлен? им, скорее всего, можно сделать подобное без проблем.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:01 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 23:14 11-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578
ну так проще им попробовать

Код:
$img1 = new Imagick( "image1.png" );
$img2 = new Imagick( "image2.png" );
 
$img1->compositeImage( $img2, imagick::COMPOSITE_OVER, 0, 0 );
 
header('Content-type: image/png');
echo $img1;

результат (не получался с GD)
 

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:35 11-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо,завтра проверю
 
Добавлено:
поставил все супер,
мне бы вот еще нужно что бы водяной знак был снизу справа.
В GD было так  
// помещаем водяной знак на изображение
$dest_x = $size[0] - $watermark_width - 5;
$dest_y = $size[1] - $watermark_height - 5;

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 23:52 11-10-2013 | Исправлено: maxus5578, 01:36 12-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578

Цитата:
В GD было так  

ну, и? аналогично и тут - берете размер и вычитаете из него размер водяного знака
3 и 4 аргументы функции являются координатами
 
+ www.php.net/imagick.getimagesize

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:10 12-10-2013 | Исправлено: Cheery, 02:11 12-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
ну я думал что GD и Imagick это разное,и все по другому вычитается

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 02:33 12-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maxus5578

Цитата:
ну я думал что GD и Imagick это разное,и все по другому вычитается

разное, функции называются иначе, но смысл то работы с изображениями не меняется

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:55 12-10-2013
maxus5578

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо за помощь,все получилось

Всего записей: 118 | Зарегистр. 12-09-2013 | Отправлено: 11:22 12-10-2013 | Исправлено: maxus5578, 11:49 12-10-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP, GD: Черный фон сзади у png


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru