[как сделать] Наложение картинки на картинку (Ватермарк)

Тема в разделе "PHP", создана пользователем Axel G, 12 июн 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Axel G

    Axel G Создатель

    Регистр.:
    30 мар 2009
    Сообщения:
    30
    Симпатии:
    2
    Здравствуйте всем, итак вопрос, скрипт сам создает такое изображение (создал условие, если юзер выбирает чекбокс) Перейти по ссылке
    Вот клиентская часть
    HTML:
    <label><input type="radio" name="watermark_thumb" value="2">Увеличить</label>
    Соответсвенно серверная
    PHP:
    if ($_POST['watermark_thumb'] == "2") {
    # затруднение вызывает именно само наложение
    # затем создаем превью (это код создания без лупы)
    createthumb($imgf,$pictype,$thbf,$tsize,$tsize);
    @
    chmod($thbf,0666);
    include(
    "thumbnail.php"); // отвечает за вывод кодов
     
    }
    изображение лупы лежит в папке /theme/magnifying_glass.png. Ширина миниатуюрки также задается пользователем, и как сделать наложение, никак не разберусь. Людь знающие подсобите советом.
     
  2. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    Вот так:

    файл теста test.html:

    HTML:
    <img src="main.jpg">
    <br><br>
    <img src="image.php?main=main.jpg&watermark=watermark.png">
    image.php
    PHP:
    <?php

            
    include 'api.watermark.php';
            
    $watermark = new watermark();
            
    $main_img_obj imagecreatefromjpeg($_GET['main']);
            
    $watermark_img_obj imagecreatefrompng($_GET['watermark']);
            
    $return_img_obj $watermark->create_watermark($main_img_obj$watermark_img_obj66);
            
    header('Content-Type: image/jpeg');
            
    header('Content-Disposition: inline; filename=' $_GET['src']);
            
    imagejpeg($return_img_obj''50);

    ?>

    api.watermark.php

    PHP:
    <?php
    class watermark{


            function 
    create_watermark$main_img_obj$watermark_img_obj$alpha_level 100 ) {
                    
    $alpha_level        /= 100;


                    
    $main_img_obj_w        imagesx$main_img_obj );
                    
    $main_img_obj_h        imagesy$main_img_obj );
                    
    $watermark_img_obj_w        imagesx$watermark_img_obj );
                    
    $watermark_img_obj_h        imagesy$watermark_img_obj );


                    
    $main_img_obj_min_x        floor( ( $main_img_obj_w ) - ( $watermark_img_obj_w ) );
                    
    $main_img_obj_max_x        ceil( ( $main_img_obj_w ) + ( $watermark_img_obj_w ) );
                    
    $main_img_obj_min_y        floor( ( $main_img_obj_h ) - ( $watermark_img_obj_h ) );
                    
    $main_img_obj_max_y        ceil( ( $main_img_obj_h ) + ( $watermark_img_obj_h ) );


                    
    $return_img        imagecreatetruecolor$main_img_obj_w$main_img_obj_h );


                    for( 
    $y 0$y $main_img_obj_h$y++ ) {
                            for( 
    $x 0$x $main_img_obj_w$x++ ) {
                                    
    $return_color        NULL;


                                    
    $watermark_x        $x $main_img_obj_min_x;
                                    
    $watermark_y        $y $main_img_obj_min_y;


                                    
    $main_rgb imagecolorsforindex$main_img_objimagecolorat$main_img_obj$x$y ) );


                                    if (        
    $watermark_x >= && $watermark_x $watermark_img_obj_w &&
                                                            
    $watermark_y >= && $watermark_y $watermark_img_obj_h ) {
                                            
    $watermark_rbg imagecolorsforindex$watermark_img_objimagecolorat$watermark_img_obj$watermark_x$watermark_y ) );


                                            
    $watermark_alpha        round( ( ( 127 $watermark_rbg['alpha'] ) / 127 ), );
                                            
    $watermark_alpha        $watermark_alpha $alpha_level;


                                            
    $avg_red                $this->_get_ave_color$main_rgb['red'],                $watermark_rbg['red'],                $watermark_alpha );
                                            
    $avg_green        $this->_get_ave_color$main_rgb['green'],        $watermark_rbg['green'],        $watermark_alpha );
                                            
    $avg_blue                $this->_get_ave_color$main_rgb['blue'],        $watermark_rbg['blue'],                $watermark_alpha );


                                            
    $return_color        $this->_get_image_color$return_img$avg_red$avg_green$avg_blue );


                                    } else {
                                            
    $return_color        imagecolorat$main_img_obj$x$y );

                                    }


                                    
    imagesetpixel$return_img$x$y$return_color );

                            }
                    }


                    return 
    $return_img;

            }


            function 
    _get_ave_color$color_a$color_b$alpha_level ) {
                    return 
    round( ( ( $color_a * ( $alpha_level ) ) + ( $color_b        $alpha_level ) ) );
            }


            function 
    _get_image_color($im$r$g$b) {
                    
    $c=imagecolorexact($im$r$g$b);
                    if (
    $c!=-1) return $c;
                    
    $c=imagecolorallocate($im$r$g$b);
                    if (
    $c!=-1) return $c;
                    return 
    imagecolorclosest($im$r$g$b);
            }


    ?>
    В папку со скриптом положи main.jpg и watermark.png. Открывай в браузере test.html.
     
    Axel G нравится это.
  3. Axel G

    Axel G Создатель

    Регистр.:
    30 мар 2009
    Сообщения:
    30
    Симпатии:
    2
    Эмм, gres_18, Спасибо, но это не совсем то что надо. Хотелось бы попроще, просто запись в файл. В папочке thumbs сохранялось изображением с наложенной лупой = )
    Перейти по ссылке
     
  4. wal

    wal Постоялец

    Регистр.:
    24 мар 2008
    Сообщения:
    89
    Симпатии:
    30
    пишите в файлы результат работы скрипта приведенного выше...
    и будет то что вам нужно.
     
  5. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    К сожалению, проще работать с графикой вряд ли получится. Это же не текстовая информация - бинарная, а при работе с ней нужно играть по ее правилам :)

    Только что осенило... А может попробовать просто с помощью css совместить два слоя, один из которых - лупа на прозрачном фоне? Сам не пробовал, будет минутка - попробую.
     
    Axel G нравится это.
  6. Axel G

    Axel G Создатель

    Регистр.:
    30 мар 2009
    Сообщения:
    30
    Симпатии:
    2
    gres_18, ну так а фишка в том, что я к себе на сайт буду вставлять миниатюрку, и нужно чтобы он брал изображение с папки тубмс, с уже наложенной лупой на него (наложили, сохранили тумбу). Или я не прав??

    Я такого рода превью, увидел на скринах трушки, сохранил изображение, и выдрал лупу через фотошоп, благо релиз был 1080р, и снизу полосочка черная = ) Уж больно красиво, хотелось бы к себе и на сайт поставить = )
     
  7. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    HTML:
    <div class="watermark">
      <img src="image.jpg" alt="blah blah">
      <span></span>
    </div>
    .watermark {
      position: relative;
    }
    .watermark span {
      position: absolute;
      left: 0;
      bottom: 0;
      background-image: url(watermark.gif);
    }
    или так
    HTML:
    <div class="watermark">
      <img src="image.jpg" alt="blah blah">
      <span>example.com</span>
    </div>
    .watermark span {
      position: absolute;
      left: 0;
      bottom: 0;
    } 
    Если это не вариант, тогда прийдется работать с графикой как описано выше. Успехофф!
     
    Axel G нравится это.
  8. Axel G

    Axel G Создатель

    Регистр.:
    30 мар 2009
    Сообщения:
    30
    Симпатии:
    2
    gres_18, да нет же, это не вариант, я пишу фотохостинг себе, а так как осуществляю вывод инфы на превью о оригинальном изображении, как на айпикчер, то это не совсем то, вы немножко не поняли, ну да и не страшно = )
     
  9. Axel G

    Axel G Создатель

    Регистр.:
    30 мар 2009
    Сообщения:
    30
    Симпатии:
    2
    Сделал все намного проще и без всяких апи :smmne:

    PHP:
    <?php
        $img 
    imagecreatefrompng('http://img37.imageshack.us/img37/5672/93b3835d1a131be4fb50b6b.png');

        
    $x 190;

        
    $X imagesx($img);
        
    $Y imagesy($img);
        
        
    $y intval($x*$Y/$X);

        
    $thumb imagecreatetruecolor($x,$y);

        
    imagecopyresampled($thumb$img0000$x$y$X$Y);

        

        
    $glass imagecreatefrompng('http://ipicture.ru/uploads/100611/bSP3J7Q2Aj.png');
        
    $tx imagesx($glass);
        
    $ty imagesy($glass);
        
        
    imagecopy($thumb$glass$x-$tx+1$y-$ty+100$tx$ty);

        
    header('Content-type: image/png');
        
    imagepng($thumb);
        
    imagedestroy($glass);
        
    imagedestroy($img);

    ?>
     
  10. Petroff86

    Petroff86 Писатель

    Регистр.:
    17 мар 2010
    Сообщения:
    3
    Симпатии:
    0
    О! Спасибо! Тоже очень пригодилось..:yahoo:
     
Статус темы:
Закрыта.