2013-09-02 1 views
0

Я пытаюсь добавить водяной знак, png с прозрачным фоном, на изображениях (jpg/gif/png/jpeg) ... У меня есть 2 файла ... первый - watermark.php:Добавить водяной знак на изображения

<?php 
    require 'func/images.func.php'; 
    if (isset($_FILES['image'])){ 
     $file_name =  $_FILES['image']['name']; 
     $file_tmp =  $_FILES['image']['tmp_name']; 
     $name = explode('.', $file_name); 
     if (allowed_image($file_name) === true){ 
      $file_name = $img_name .'.png'; 
      watermark_image($file_tmp, 'images-watermark/uploads/' . $file_name);  
     } else{ 
      echo '<p>no image, or image type not accepted.</p>'; 
     } 
    } 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Documento senza titolo</title> 
</head> 
<body> 
<form action="" method="POST" enctype="multipart/form-data"> 
Choose an image: 
<input type="file" name="image" /> 
<input type="submit" value="watermark"/> 
</form> 
</body> 
</html> 

... а второй один images.func.php:

<?php 
    function allowed_image($file_name){ 
    $allow_set = array('jpg', 'jpeg', 'gif', 'png'); 
    $file_ext = (explode('.', $file_name)); 
    $end = end($file_ext); 
    return (in_array($end , $allow_set) === true) ? true : false; 
} 

function watermark_image($file, $destination){ 
    $watermark = imagecreatefrompng('images-watermark/watermarkf.png'); 
    $source = getimagesize($file); 
    $source_mime = $source['mime']; 
    if ($source_mime === 'image/png'){ 
     $image = imagecreatefrompng($file);  
    }else if($source_mime === 'image/jpeg'){ 
     $image = imagecreatefromjpeg($file);  
    }else if($source_mime === 'image/gif'){ 
     $image = imagecreatefromgif($file);   
    } 
    imagecopy($image, $watermark, 70, 160, 0, 0, imagesx($watermark),imagesy($watermark)); 
    imagepng($image, $destination); 
    imagedestroy($image); 
     imagedestroy($watermark); 

} 
?> 

... мой код работает с JPG/PNG формате/JPEG (изображения имеют водяной знак с прозрачным фоном) ... в gif-изображениях водяной знак не имеет прозрачного фона ... любые подсказки? Заранее спасибо

+0

О, вау .. Кажется, вам не хватает ** много ** отступов здесь. Пожалуйста, очистите это, поэтому у нас есть разумный шанс взглянуть на вашу проблему. – h2ooooooo

+0

Возможный дубликат: http://stackoverflow.com/questions/13983557/php-add-transparent-png-to-gif-dynamically –

+0

Кроме того, использует ли OP воображение? Я думаю, что это может быть не поддержано GD –

ответ

1

GIF-изображения необходимо распаковать до полного RGB, затем смешать, а затем повторно проиндексировать до 256 цветов. Добавление прозрачного водяного знака поверх изображения - отличный способ сделать данные невозможными для захвата в форме GIF, потому что вы внедрили 256 новых оттенков наложения.

+0

Я могу распаковать gif-изображения на полный RGB с помощью Photoshop ... но ... что это значит «затем смешанный» и «затем переиндексирован до 256 цветов»? Большое спасибо – umbbberto

+0

Ваше изображение наложения смешано с пикселями исходного изображения. Оригинальный GIF имеет 256 цветов, затем вы смешиваете свой прозрачный водяной знак, и теперь изображение имеет более 256 цветов, а палитру нужно переделать, теряя информацию в процессе. На самом деле, на самом деле, это не использовать GIF. Это формат изображения с тех пор, когда на экранах компьютеров было только несколько цветов. Да, они маленькие, поэтому интерполированные PNG-файлы, проходят через pngcrush –

+0

ok ... Я понимаю .. очень много – umbbberto

1

Я бы рекомендовал использовать библиотеку для этого, если вы не делаете этого для экспериментальной цели. Мой личный фаворит PHP Image Workshop или вы также можете использовать Imagine.