Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2012, 10:36   #1
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
Сообщение watermark.func Наложение водяного знака.

Добрый день.Сделав скрипт загрузки изображений и наложения водяного знака, столкнулся со следующей проблемой. Если загружать изображение меньших размеров чем указаны после наложения водяного знака, получается что изображение теряется в процессе и получается черное изображение с водяным знаком.Прошу помочь доработать скрипт,а именно сделать :
Если изображение меньше указанных размеров, то скрипт не применяет никаких действий ,а просто загружает как есть.
PHP код:
<?php

/**
 * Наложение водяного знака в виде изображения
 * @param $oldimage_name - исходное изображение
 * @param $new_image_name - выходное изображение
 * @return Boolean
 */
function watermark_image($oldimage_name$new_image_name){
    
// получаем имя изображения, используемого в качестве водяного знака    
    
global $image_path;
    
// получаем размеры исходного изображения
    
list($owidth,$oheight) = getimagesize($oldimage_name);
    
// задаем размеры для выходного изображения    
    
$width 730;
    
$height 430;    
    
// создаем выходное изображение размерами, указанными выше
    
$im imagecreatetruecolor($width$height);
    
$img_src imagecreatefromjpeg($oldimage_name);
    
// наложение на выходное изображение, исходного
    
imagecopyresampled($im$img_src00038$width$height$owidth$oheight);
    
$watermark imagecreatefrompng($image_path);
    
// получаем размеры водяного знака
    
list($w_width$w_height) = getimagesize($image_path);
    
// определяем позицию расположения водяного знака    
    
$pos_x $width $w_width
    
$pos_y $height $w_height;
    
// накладываем водяной знак
    
imagecopy($im$watermark$pos_x$pos_y104$w_width$w_height);
    
// сохраняем выходное изображение, уже с водяным знаком в формате jpg и качеством 100
    
imagejpeg($im$new_image_name79);
    
// уничтожаем изображения
    
imagedestroy($im);
    
unlink($oldimage_name);
    return 
true;
}


?>
Predator199 вне форума Ответить с цитированием
Старый 22.06.2012, 12:54   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Predator199 Посмотреть сообщение
Если изображение меньше указанных размеров, то скрипт не применяет никаких действий ,а просто загружает как есть.
Думаю, про управляющие конструкции ты в курсе:
PHP код:
if(($ширина_оригинала >= $новая_ширина) && ($высота_оригинала >= $новая_высота)){
    
// ...выполняем наложение watermark...
}
else{
    
// ...загружаем как есть - что бы это не значило...

Andkorol вне форума Ответить с цитированием
Старый 22.06.2012, 16:32   #3
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

PHP код:
if (($owidth 700) && ($owidth 700)) {

function 
watermark_image($oldimage_name$new_image_name){ 
    
// получаем имя изображения, используемого в качестве водяного знака     
    
global $image_path
    
// получаем размеры исходного изображения 
    
list($owidth,$oheight) = getimagesize($oldimage_name); 
    
// задаем размеры для выходного изображения     
    
$width 730
    
$height 430;     
    
// создаем выходное изображение размерами, указанными выше 
    
$im imagecreatetruecolor($width$height); 
    
$img_src imagecreatefromjpeg($oldimage_name); 
    
// наложение на выходное изображение, исходного 
    
imagecopyresampled($im$img_src00038$width$height$owidth$oheight); 
    
$watermark imagecreatefrompng($image_path); 
    
// получаем размеры водяного знака 
    
list($w_width$w_height) = getimagesize($image_path); 
    
// определяем позицию расположения водяного знака     
    
$pos_x $width $w_width;  
    
$pos_y $height $w_height
    
// накладываем водяной знак 
    
imagecopy($im$watermark$pos_x$pos_y104$w_width$w_height); 
    
// сохраняем выходное изображение, уже с водяным знаком в формате jpg и качеством 100 
    
imagejpeg($im$new_image_name79); 
    
// уничтожаем изображения 
    
imagedestroy($im); 
    
unlink($oldimage_name); 
    return 
true


} else {
  echo 
"a НЕ больше, чем b";

Так будит правильно, 1-я половина?
Predator199 вне форума Ответить с цитированием
Старый 22.06.2012, 16:55   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Predator199 Посмотреть сообщение
PHP код:
if (($owidth 700) && ($owidth 700)) 
Ппц - как может быть ширина одновременно и больше 700, и меньше 700 ???

Условие в самой функции должно быть - ты же там получаешь информацию о ширине и высоте оригинального изображения.
В зависимости от этого твоя функция либо делает watermark - либо не делает ничего.
Вне функции у тебя нет никаких $owidth и $oheight - хотя в твоем коде этого не угадать.
Andkorol вне форума Ответить с цитированием
Старый 22.06.2012, 17:40   #5
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Не хочет загружать изображения .

PHP код:
<?php

    $max_filesize 
230000;        
    
$image_path "watermark.png";  // изображение
    
$path "uploads/fpsimages/";
    
$valid_formats = array("jpg""png","jpeg","gif");
    
$name $_FILES['userfile']['name'];
    
$ext strtolower(pathinfo($namePATHINFO_EXTENSION));
    
$filename $_FILES['userfile']['name']; 
    
$file_strip str_replace(" ","_",$filename);
    
$size getimagesize($_FILES['userfile']['tmp_name'] );
    
$size[0]; // width
    
$size[1]; // height

if(!in_array($ext,$valid_formats)) {
     die(
'<div class="error">На сайте зпрещено загружать файлы с "'.$ext.'" форматом.</div>');
    }

if(
filesize($_FILES['userfile']['tmp_name']) > $max_filesize) { 
      die(
'<div class="error">Файл, который Вы попытались загрузить, слишком большой   (max   230кб).</div>'); 
     } 


if ((
$size[0]; > 600) && ($size[0]; < 600)) {


function 
watermark_image($oldimage_name$new_image_name){ 
    
// получаем имя изображения, используемого в качестве водяного знака     
    
global $image_path
    
// получаем размеры исходного изображения 
    
list($owidth,$oheight) = getimagesize($oldimage_name); 
    
// задаем размеры для выходного изображения     
    
$width 730
    
$height 430;     
    
// создаем выходное изображение размерами, указанными выше 
    
$im imagecreatetruecolor($width$height); 
    
$img_src imagecreatefromjpeg($oldimage_name); 
    
// наложение на выходное изображение, исходного 
    
imagecopyresampled($im$img_src00038$width$height$owidth$oheight); 
    
$watermark imagecreatefrompng($image_path); 
    
// получаем размеры водяного знака 
    
list($w_width$w_height) = getimagesize($image_path); 
    
// определяем позицию расположения водяного знака     
    
$pos_x $width $w_width;  
    
$pos_y $height $w_height
    
// накладываем водяной знак 
    
imagecopy($im$watermark$pos_x$pos_y104$w_width$w_height); 
    
// сохраняем выходное изображение, уже с водяным знаком в формате jpg и качеством 100 
    
imagejpeg($im$new_image_name79); 
    
// уничтожаем изображения 
    
imagedestroy($im); 
    
unlink($oldimage_name); 
    return 
true



if(
strlen($name))
    {

            
// загружаем изображение
            
$upload_status move_uploaded_file($_FILES['userfile']['tmp_name'], $path.$_FILES['userfile']['name']);
            
// при успешной загрузке            
            
if($upload_status)
            {
                
// задаем директорию и имя для сохранения нового изображения
                
$new_name $path.time().".jpg";
                
// добавляем водяной знак: watermark_text() - для текста, watermark_image() - для изображения
                
if(watermark_image($path.$_FILES['userfile']['name'], $new_name))
                
$demo_image $new_name;            
            }
                    else 
                            
$msg="Загрузка не удалась!"

    }

if(!empty(
$demo_image))
echo 
'
<div class="success">
[img]'
.$new_name.'[/img]
</div>'
;


} else {


    if(
move_uploaded_file($_FILES['userfile']['tmp_name'],$path $file_strip)) {
      echo 
'<div class="success">[img]'$file_strip .'[/img]</div>'
    } else {
      echo 
'<div class="error">Не был загружен, пожалуйста поробуйте еще.</div>';
 }

}  


                

?>
В чем ошибка?

Последний раз редактировалось Predator199; 22.06.2012 в 17:45.
Predator199 вне форума Ответить с цитированием
Старый 22.06.2012, 18:03   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Predator199 Посмотреть сообщение
Не хочет загружать изображения .
В чем ошибка?
В коде...
Поиск ошибок

Опять то же самое - один параметр и больше 600, и меньше 600.
Плохо с логикой - или с пониманием прочитанного?
Цитата:
if (($size[0]; > 600) && ($size[0]; < 600))
Andkorol вне форума Ответить с цитированием
Старый 22.06.2012, 18:15   #7
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Спс, все работает.

Последний раз редактировалось Predator199; 22.06.2012 в 18:46.
Predator199 вне форума Ответить с цитированием
Старый 24.06.2012, 12:24   #8
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Скажите пожалуйста. Как задать размеры для выходного изображение в процентах.
Но в пределах максимума и минима?
Predator199 вне форума Ответить с цитированием
Старый 24.06.2012, 12:55   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Predator199 Посмотреть сообщение
Как задать размеры для выходного изображение в процентах.
Но в пределах максимума и минима?
Получить значения в процентном отношении от исходных размеров - в школе ж учил, как работать с процентами?
Проверить, находятся ли полученные значения в пределах минимума/максимума.
Всё.
Andkorol вне форума Ответить с цитированием
Старый 24.06.2012, 13:05   #10
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Спс. Разобрался.

Последний раз редактировалось Predator199; 24.06.2012 в 13:27.
Predator199 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
httppost и отображение знака & как знака? maloy_ya Работа с сетью в Delphi 4 12.03.2012 20:47
не работает func num args() и func get arg($i) Дмитрий_Попов PHP 1 09.02.2012 21:25
Watermark Hworang PHP 0 01.12.2010 23:13
Funcţii virtuale dziga8989 Помощь студентам 6 20.10.2009 18:36
watermark kadurban PHP 3 28.07.2008 17:14