Protéger image à l'aide de php

Fermé
Camille - 21 juin 2008 à 15:49
 Utilisateur anonyme - 21 juin 2008 à 16:44
Bonjour,

J'ai créé un site avec des photos, je souhaiterais que sur ses photos un watermark apparaisse automatiquement.
Je ne peut pas le faire manuellement ma galerie comptant plusieurs centaines de photos...
Il me faudrait un script a placer par exemple dans le dossier des photos qui ferait tout le travail à ma place.
Je suppose que c'est possible, me manque juste le script.

Je suis sous free, donc les script utilisant un htaccess ne marche pas... Celui- la par exemple :
http://www.asp-php.net/scripts/asp-php/watermark-2.php

Ne marche pa sous free, c'est dommage c'est exactement ce qu'il me fallait.
Personne n'en aurait un compatible avec free ?


Merci d'avance pour votre aide.
Camille

2 réponses

Utilisateur anonyme
21 juin 2008 à 16:22
Tu peux contourner le problème en créant un .htaccess qui refuse l'accès au image du site (refus d'accès par lien direct au .jpg) et faire des liens vers un script qui va te faire ton watermarking à la volée, en lisant l'image que tu auras passée en argument (via un ?img=image01.jpg par exemple).
L'accès aux photos ne sera donc plus possible sans passer par le script et les utilisateurs verront le watermarking sur celles-ci....
0
C'est une bonne idée mais le probleme est que mon site est hebergé chez free et que free et les htaccess = erreur 500

Ce script par exemple ne marche pas sous free :

l'htaccess :
addhandler WaterMark2 jpg
action WaterMark2 /galleriephoto/WaterMark2.php


le fichier watermark2.php
<?php
/*
    WATERMARK_TYPE
        Type de watermark         
        Valeurs: 'text' | 'image'

    WATERMARK_ALIGN_H
        Alignment horizontal         
        Valeurs: 'left' | 'right' | 'center'

    WATERMARK_ALIGN_V
        Alignment vertical        
        Valeurs: 'top' | 'bottom' | 'center'
        
    WATERMARK_MARGIN
        Excentrage à partir du bord.
        Valeurs: (en pixels)
*/

    define('WATERMARK_TYPE', 'text'); 
    define('WATERMARK_ALIGN_H', 'center'); 
    define('WATERMARK_ALIGN_V', 'bottom'); 
    define('WATERMARK_MARGIN', '10'); 

/*
    WATERMARK_IMAGE_FILE
        Chemin vers le fichier image employé comme watermark
        Valeur possible (chemin absolu ou relatif).

    WATERMARK_OPACITY
        Opacité de l'image.
        Valeurs: entre 0 et 100
*/

    define('WATERMARK_IMAGE_FILE', './test.png');
    define('WATERMARK_OPACITY', '60'); 

/*
    WATERMARK_TEXT
        Votre texte utilisé pour le copyright.
            
    WATERMARK_TEXT_FONT
        La police.
        Valeurs: de 1 à 5
    
    WATERMARK_TEXT_SHADOW
        Police "black shadow".
        Valeurs: 'yes' | 'no'

    WATERMARK_TEXT_COLOR
        La couleur de la police
        Valeurs en décimal (ex: '255,255,255') ou  hexadécimal (ex: '#ff4567')
*/

    define('WATERMARK_TEXT', 'Copyright (c) 2007 www.visualprod.net'); 
    define('WATERMARK_TEXT_FONT', '3'); 
    define('WATERMARK_TEXT_SHADOW', 'yes'); 
    define('WATERMARK_TEXT_COLOR', '#FFFFFF');

// FIN DE LA CONFIGURATION
// Utilisateurs non averti, ne pas toucher au reste ...

    $original_image_file = $_SERVER['DOCUMENT_ROOT'] . $_SERVER['PATH_INFO'];
    $original_image_info = getimagesize($original_image_file);
    if ($original_image_info) {
        $original_image_width = $original_image_info[0];
        $original_image_height = $original_image_info[1];
        $original_image_imagetype = $original_image_info[2];
        $original_image_mime_type = $original_image_info['mime'];
    }
    else {
        header("Status: 500 Internal Server Error");
        if ($_SERVER['REQUEST_METHOD'] != 'HEAD') {
            header("Content-Type: text/plain");
            echo "WaterMark: Erreur lors de la lecture des propriétés des images de la gallerie.";
                        echo "Une ou plusieurs images sont tronquées par une signature d'entête.\n";
        }
        exit;
    }

    if ($original_image_imagetype == IMAGETYPE_GIF) {
        header("Content-Type: " . $original_image_mime_type);
        readfile($original_image_file);
        exit;
    } 
    elseif ($original_image_imagetype == IMAGETYPE_JPEG) {
        header("Content-Type: " . $original_image_mime_type);
        $source_image = imagecreatefromjpeg($original_image_file);
    } 
    elseif ($original_image_imagetype == IMAGETYPE_PNG) {
        header("Content-Type: " . $original_image_mime_type);
        $source_image = imagecreatefrompng($original_image_file);
    }
    else {
        header("Status: 500 Internal Server Error");
        if ($_SERVER['REQUEST_METHOD'] != 'HEAD') {
            header("Content-Type: text/plain");
            echo "WaterMark: format d'image non supporté\n";
        }
        exit;
    }

    if (WATERMARK_TYPE == 'image' && WATERMARK_IMAGE_FILE != '' 
    && file_exists(WATERMARK_IMAGE_FILE)) {

        $watermark_image_file = realpath(WATERMARK_IMAGE_FILE);

        $watermark_image_info = getimagesize($watermark_image_file);
        if ($original_image_info) {
            $watermark_image_width = $watermark_image_info[0];
            $watermark_image_height = $watermark_image_info[1];
            $watermark_image_imagetype = $watermark_image_info[2];
            $watermark_image_mime_type = $watermark_image_info['mime'];
        }
        else {
            header("Status: 500 Internal Server Error");
            if ($_SERVER['REQUEST_METHOD'] != 'HEAD') {
                header("Content-Type: text/plain");
                echo "WaterMark: Erreur lors de a lecture des propriétés de l'image à incruster.";
                                echo "L'image est tronquée par une signature d'entête.\n";
            }
            exit;
        }

        if ($watermark_image_imagetype == IMAGETYPE_JPEG) {
            $watermark_image = imagecreatefromjpeg(WATERMARK_IMAGE_FILE);
        } 
        elseif ($watermark_image_imagetype == IMAGETYPE_PNG) {
            $watermark_image = imagecreatefrompng(WATERMARK_IMAGE_FILE);
        }

        if ($watermark_image) {

            $watermark_y = WATERMARK_MARGIN;
            if (WATERMARK_ALIGN_V == 'top') {
                $watermark_y = WATERMARK_MARGIN;
            } 
            elseif (WATERMARK_ALIGN_V == 'bottom') {
                $watermark_y = $original_image_height - $watermark_image_height - WATERMARK_MARGIN;
            } 
            elseif (WATERMARK_ALIGN_V == 'center') {
                $watermark_y = (int)($original_image_height / 2 - $watermark_image_height / 2);
            }

            $watermark_x = WATERMARK_MARGIN;        
            if (WATERMARK_ALIGN_H == 'left') {
                $watermark_x = WATERMARK_MARGIN;
            } 
            elseif (WATERMARK_ALIGN_H == 'right') {
                $watermark_x = $original_image_width - $watermark_image_width - WATERMARK_MARGIN;
            } 
            elseif (WATERMARK_ALIGN_H == 'center') {
                $watermark_x = (int)($original_image_width / 2 - $watermark_image_width / 2);
            }

            imagecopymerge(
                $source_image, 
                $watermark_image, 
                $watermark_x, $watermark_y,
                0, 0, 
                $watermark_image_width, $watermark_image_height,
                WATERMARK_OPACITY
            );    
        }
    }
    elseif (WATERMARK_TYPE == 'text' && WATERMARK_TEXT != '') {

        $color = WATERMARK_TEXT_COLOR;
        $red = hexdec(substr($color, 1, 2));
        $green = hexdec(substr($color, 3, 2));
        $blue = hexdec(substr($color, 5, 2));        
        $text_color = imagecolorallocate($source_image, $red, $green, $blue); 
        $shadow_color = imagecolorallocate($source_image, 0, 0, 0); 
        $text_height = imagefontheight(WATERMARK_TEXT_FONT);
        $text_width = strlen(WATERMARK_TEXT) * imagefontwidth(WATERMARK_TEXT_FONT);

        $watermark_y = WATERMARK_MARGIN;
        if (WATERMARK_ALIGN_V == 'top') {
            $watermark_y = WATERMARK_MARGIN;
        }
        elseif (WATERMARK_ALIGN_V == 'bottom') {
            $watermark_y = $original_image_height - $text_height - WATERMARK_MARGIN;
        }
        elseif (WATERMARK_ALIGN_V == 'center') {
            $watermark_y = (int)($original_image_height / 2 - $text_height / 2);
          }

        $watermark_x = WATERMARK_MARGIN;
        if (WATERMARK_ALIGN_H == 'left') {
            $watermark_x = WATERMARK_MARGIN;
        }
        elseif (WATERMARK_ALIGN_H == 'right') {
            $watermark_x = $original_image_width - $text_width - WATERMARK_MARGIN;
        }
        elseif (WATERMARK_ALIGN_H == 'center') {
            $watermark_x = (int)($original_image_width / 2 - $text_width / 2);
        }

        if (WATERMARK_TEXT_SHADOW == 'yes') {
            imagestring(
                $source_image, 
                WATERMARK_TEXT_FONT, 
                $watermark_x + 1, $watermark_y + 1, 
                WATERMARK_TEXT, 
                $shadow_color
            );
        }
        imagestring(
            $source_image, 
            WATERMARK_TEXT_FONT, 
            $watermark_x, $watermark_y,
            WATERMARK_TEXT,
            $text_color
        );

    }
    else {
        header("Status: 500 Internal Server Error");
        if ($_SERVER['REQUEST_METHOD'] != 'HEAD') {
            header("Content-Type: text/plain");                
            echo "WaterMark: Erreur de configuration\n";
        }
        exit;
    }

    if ($original_image_imagetype == IMAGETYPE_JPEG) {
        imagejpeg($source_image);
    }
    elseif ($original_image_format == IMAGETYPE_PNG) {
        imagepng($source_image);
    }    
?>



J'obtiens une erreur 500 avec.
0
Utilisateur anonyme > Camille
21 juin 2008 à 16:32
T'as pas du lire ma réponse en fait, je t'ai indiqué de contourner le problème du addhandler du htaccess, c'est ce point qui coince, en dehors de ça les htaccess marchent très bien chez free pour bloquer l'accès direct à certains types de fichiers (.jpg par exemple).
Note : inutile de poster un code quand il est disponible via un lien...
0
Désolé pour le code, je pensai aussi que tu n'étais pas aller voir le lien que j'avais posté...
En faite, c'étais moi qui n'avais pas compris ta réponse, encore désolé...

Je suis en faite novice en php.
J'ai peur que la solution que tu me propose bloque l'accés à ma gallerie qui est sous coppermine.
Tu pourrait me mettre le contenu du htaccess s'il te plait. Je risque rien à tester.

Merci.
Camille
0
Utilisateur anonyme
21 juin 2008 à 16:44
Un truc du style :
<Files *.jpgl>
order allow,deny
deny from all
</Files>
Te permets de bloquer l'accès aux fichier .jpg dans le dossier donné par exemple.
0