•  » Outils
  •  » [Ploader] Ajout d'un watermark

#1 2009-09-21 11:47:27

flipflip
Membre
Lyon
2005-03-19
2316

[Ploader] Ajout d'un watermark

Je réalise actuellement une modification de pLoader pour intégrer un watermark aux images mais je rencontre un problème avec la version haute définition. Dans la fonction CreateHigh j'utilise la variable $self->current_image->site_high_file pour trouver qu'elle image est en cours de traitement, d'après ce que j'ai compris du code (c'est nouveau le perl pour moi) c'est cette variable qui est utilisé dans le cas d'une rotation, le hic est qu'en plus d'ajouter le watermark sur la version pour la galerie ça l'ajoute aussi sur l'original sur le disque dur... Et ça c'est pas top :(

Appel de la fonction CreateWatermark dans CreateHigh

Code:

    if( $self->watermark_active_pwg_high ) {
            my $file_out = $self->current_image->site_high_file;
          $self->CreateWatermark(
             $self->watermark_text,
                $self->watermark_text_size,
                $self->watermark_position,
                $self->watermark_marge_x,
                $self->watermark_marge_y,
                $self->watermark_color,
                $file_out
            );
    }

Fonction CreateWatermark

Code:

sub CreateWatermark {
    my ( $self, $text, $text_size, $position, $x, $y, $color, $file_out ) = @_;
    
    my $rval = 1 ;
    my $gravity = '';
    my $fill = '';

    # debug
    printf("Create watermark %s\n", $file_out);

    if($position eq gettext("Top left")) {
      $gravity = 'NorthWest';
    }
    
    if($position eq gettext("Top right")) {
      $gravity = 'NorthEast';
    }
    
    if($position eq gettext("Bottom left")) {
        $gravity = 'SouthWest';
    } 
    
    if($position eq gettext("Bottom right")) {
        $gravity = 'SouthEast';
    }   
    
    if($color eq gettext("White")) {
      $fill = '#FFFFFF';
    }

    if($color eq gettext("Black")) {
        $fill = '#000000';
    }    

    my $image = new Image::Magick;
    
    my $status = $image->ReadImage(
        encode('iso-8859-1', $file_out)
    );      
            
    $image->Annotate(
        font => 'kai.ttf',
        pointsize => $text_size,
        fill => $fill,
        x => $x,
        y => $y,
        text => $text,
        gravity => $gravity,
    );
                      
    $image->Write(
        sprintf(
            "%s:%s",
            $self->type,
            encode('iso-8859-1', $file_out),
        )
    );
}

Le cerveau à des capacités tellement étonnantes qu’aujourd’hui pratiquement tout le monde en à un

Mon site : http://www.blogoflip.fr

Hors ligne

#2 2009-09-22 10:59:24

ron
Former Piwigo Team
2008-09-30
211

Re: [Ploader] Ajout d'un watermark

Dans le transfert de la photo originale il y a 2 cas :

- avec modification : rotation ou ajout de watermark

- sans modification

Dans le premier cas, pLoader crée une copie de l'original qui sera stockée dans le répertoire .pLoader\resize et modifie cette copie.

Dans le second cas, pLoader fait une lecture de l'original lors du transfert.


Il faut donc modifier la fonction CreateHigh pour faire un copie de l'original quand il y a rotation ou ajout de watermark.

La première étape consiste à sortir le code de création de la copie dans une fonction :

Code:

sub _set_site_high_file {
        my ( $self ) = @_;

        my ( $vol, $dir, $file ) = File::Spec->splitpath(
            $self->current_image->file
        );
    
        my ( $filename, $ext ) = split /\./, $file ;
    
        # high_file is a copy of original
        $self->current_image->site_high_file( 
            File::Spec->catfile(
                $self->site_resized_dir,
                sprintf(
                    "%s_high.%s",
                    $filename,
                    $self->type,
                )
            )
        );
}

puis remplacer dans le code actuel :

Code:

    if( $self->auto_rotate and $orientation =~ m/Rotate (\d+)/ ){

        my ( $vol, $dir, $file ) = File::Spec->splitpath(
            $self->current_image->file
        );
    
        my ( $filename, $ext ) = split /\./, $file ;
    
        # high_file is a copy of original
        $self->current_image->site_high_file( 
            File::Spec->catfile(
                $self->site_resized_dir,
                sprintf(
                    "%s_high.%s",
                    $filename,
                    $self->type,
                )
            )
        );

par l'appel de cette fonction :

Code:

    if( $self->auto_rotate and $orientation =~ m/Rotate (\d+)/ ){

        $self-> _set_site_high_file ();

        # image rotation follows
         ....

puis ajouter le cas de création du watermark

Code:

    # rotate
    if( $self->auto_rotate and $orientation =~ m/Rotate (\d+)/ ){
         ....
    }
    # watermark is added
    elsif($self->watermark_active_pwg_high) {

        $self-> _set_site_high_file ();

        # watermark creation follows
        ...
    }
    # simple read
    else{

    }

Hors ligne

#3 2009-09-22 13:01:41

flipflip
Membre
Lyon
2005-03-19
2316

Re: [Ploader] Ajout d'un watermark

Merci pour ta réponse.
Mais il me semble que dans CreateHigh il y a déjà une condition sur la rotation, donc en théorie c'est l'image transféré qui est "rotationé" et non l'original sur le disque dur ?


Le cerveau à des capacités tellement étonnantes qu’aujourd’hui pratiquement tout le monde en à un

Mon site : http://www.blogoflip.fr

Hors ligne

#4 2009-09-22 14:46:54

ron
Former Piwigo Team
2008-09-30
211

Re: [Ploader] Ajout d'un watermark

flipflip a écrit:

donc en théorie c'est l'image transféré qui est "rotationé" et non l'original sur le disque dur ?

Oui, normalement ça doit se comporter de cette façon, sinon c'est un bug. On ne doit pas modifier l'original.

Hors ligne

#5 2009-09-23 08:54:05

flipflip
Membre
Lyon
2005-03-19
2316

Re: [Ploader] Ajout d'un watermark

Donc normalement il faudrait que je récupère le fichier de sortie dans la condition avec rotation, mais c'est le même que dans le cas ou il n'y pas de rotation... Ou alors j'ai mal lue le code.


Le cerveau à des capacités tellement étonnantes qu’aujourd’hui pratiquement tout le monde en à un

Mon site : http://www.blogoflip.fr

Hors ligne

#6 2009-09-24 11:31:17

ron
Former Piwigo Team
2008-09-30
211

Re: [Ploader] Ajout d'un watermark

flipflip a écrit:

Donc normalement il faudrait que je récupère le fichier de sortie dans la condition avec rotation, mais c'est le même que dans le cas ou il n'y pas de rotation... Ou alors j'ai mal lue le code.

Tu as raison, dans le code que j'ai fourni il ne peut y avoir rotation+watermark, ce qui ne correspond pas à ce que l'on veut. Il faut d'abord déterminer si on travaille sur une copie ie s'il y a rotation ou ajout de watermark, ou si l'on lit directement l'original.

Puis dans le cas de la modification, traiter la rotation et si besoin, l'ajout de watermark.

Code:

    my $bModifyOriginal;
    my $bRotate;
    my $bAddWatermark;

    if( $self->auto_rotate and $orientation =~ m/Rotate (\d+)/ ){
        $bModifyOriginal = 1;
        $bRotate = 1;
    }

    if( $self->watermark_active_pwg_high ){
        $bModifyOriginal = 1;
        $bAddWatermark = 1;
    }

    if($bModifyOriginal){
        $self-> _set_site_high_file ();

        if($bRotate){
              #rotate here
        }

        if($bAddWatermark){
              #add watermark here

        }

    }
    else{
        # simple read of original

   }

Hors ligne

#7 2009-10-02 09:55:37

flipflip
Membre
Lyon
2005-03-19
2316

Re: [Ploader] Ajout d'un watermark

Salut,
Je reviens sur le problème. J'ai beau retourné ton code dans tout les sens je ne comprends pas... Surement à cause de ma faible connaissance en perl :(

Si je te donne le code complet, de la partie watermark tu peux faire l'intégration ?


Le cerveau à des capacités tellement étonnantes qu’aujourd’hui pratiquement tout le monde en à un

Mon site : http://www.blogoflip.fr

Hors ligne

#8 2009-10-02 11:08:22

ron
Former Piwigo Team
2008-09-30
211

Re: [Ploader] Ajout d'un watermark

flipflip a écrit:

Si je te donne le code complet, de la partie watermark tu peux faire l'intégration ?

Pas de problème, envoie moi ton code, je fais l'intégration.

Hors ligne

#9 2009-10-02 12:11:09

flipflip
Membre
Lyon
2005-03-19
2316

Re: [Ploader] Ajout d'un watermark

Cool.

Alors dans le fichier ImageList.pm, à la suite de

Code:

# this class implements a collection of image files with associated data
$|=1;
__PACKAGE__->mk_accessors( 
    qw/
                 thumb_size
                preview_ratio
                categories
...
                imagelist_version

Ajoute

Code:

                watermark_active
                watermark_text
                watermark_text_size
                watermark_position
                watermark_marge_y
                watermark_marge_x
                watermark_color
                watermark_active_pwg_high

Après la fonction CreateResized

Code:

sub CreateWatermark {
    my ( $self, $text, $text_size, $position, $x, $y, $color, $file_out ) = @_;
    
    my $rval = 1 ;
    my $gravity = '';
    my $fill = '';

    # debug
    printf("Create watermark %s\n", $file_out);

    if($position eq gettext("Top left")) {
      $gravity = 'NorthWest';
    }
    
    if($position eq gettext("Top right")) {
      $gravity = 'NorthEast';
    }
    
    if($position eq gettext("Bottom left")) {
        $gravity = 'SouthWest';
    } 
    
    if($position eq gettext("Bottom right")) {
        $gravity = 'SouthEast';
    }   
    
    if($color eq gettext("White")) {
      $fill = '#FFFFFF';
    }

    if($color eq gettext("Black")) {
        $fill = '#000000';
    }    

    my $image = new Image::Magick;
    
    my $status = $image->ReadImage(
        encode('iso-8859-1', $file_out)
    );      
            
    $image->Annotate(
        font => 'kai.ttf',
        pointsize => $text_size,
        fill => $fill,
        x => $x,
        y => $y,
        text => $text,
        gravity => $gravity,
    );
                      
    $image->Write(
        sprintf(
            "%s:%s",
            $self->type,
            encode('iso-8859-1', $file_out),
        )
    );
}

Vers la ligne 837, à la suite de

Code:

sub Store {
    my ( $self ) = @_;
    
    my $data = $self->get_storable(
        [ 
            qw/
                images
                 thumb_size
                preview_ratio
                type
...
                imagelist_version

Ajoute

Code:

                watermark_active
                watermark_text
                watermark_text_size
                watermark_position
                watermark_marge_y
                watermark_marge_x
                watermark_color
                watermark_active_pwg_high

Vers la ligne 988 dans la fonction UploadSelection après

Code:

            if( $self->watermark_active ) {
              my $file_out = $self->current_image->site_resized_file;
                $self->CreateWatermark(
                   $self->watermark_text,
                   $self->watermark_text_size,
                   $self->watermark_position,
                   $self->watermark_marge_x,
                   $self->watermark_marge_y,
                   $self->watermark_color,
                   $file_out          
                );
            }

Vers la ligne 1008 dans la fonction UploadSelection après

Code:

        # the original is at the right size, no need to create a resize
        else {
            $self->current_image->site_resized_file(
                $self->current_image->file,
            );

Ajoute

Code:

            if( $self->watermark_active ) {  
              my $file_out = $self->current_image->site_resized_file;                          
                $self->CreateWatermark(
                   $self->watermark_text,
                   $self->watermark_text_size,
                   $self->watermark_position,
                   $self->watermark_marge_x,
                   $self->watermark_marge_y,
                   $self->watermark_color,
                   $file_out
                );
            }

Dans la fonction CreateHigh il faut ajouter

Code:

    if( $self->watermark_active_pwg_high ) {
            my $file_out = $self->current_image->site_high_file;
          $self->CreateWatermark(
             $self->watermark_text,
                $self->watermark_text_size,
                $self->watermark_position,
                $self->watermark_marge_x,
                $self->watermark_marge_y,
                $self->watermark_color,
                $file_out
            );
    }

C'est le bout qui ne prend pas la bonne photo.

Dans le fichier wsApp.pm, dans _default_imagelist_params après

Code:

    my $params = {
      new_files        => [],
         thumb_size       => 120,
...
        ResizeCallback   => sub { $self->ResizeImage(@_) },

Ajoute

Code:

        watermark_active => 0,
        watermark_text   => '',
        watermark_text_size => 10,
        watermark_position => gettext('Top left'),
        watermark_marge_y => 10,
        watermark_marge_x => 10,
        watermark_color => gettext('White'), 
        watermark_active_pwg_high => 0,

Dans le fichier wxFrameAUI.pm vers la ligne 337 dans

Code:

my @properties = 
    qw/
          progressdlg
          upload_progressdlg
          imageviewer
..
          preview_settings
          advanced_settings

Ajoute

Code:

          watermark_settings

Vers la ligne 713 après

Code:

    $self->advanced_settings(
        [
            {
                label     => gettext("Transfert chunk size :"),
                type      => 'Number',
                value  => sub { wxTheApp->chunk_size(@_) },
            },
        ]    
    );

Ajoute

Code:

    $self->watermark_settings(
        [
            {
              label  => gettext("Active watermark :"),
              type   => 'Bool',
              value  => sub { $self->imagelist->watermark_active(@_) },
            },
            {
              label => gettext("Active watermark on high definition :"),
              type  => 'Bool',
              value => sub { $self->imagelist->watermark_active_pwg_high(@_) },
            },
            {
              label  => gettext("Watermark text :"),
              value  => sub { $self->imagelist->watermark_text(@_) },
            },
            {
                label     => gettext("Watermark text size :"),
                type      => 'Number',
                value   => sub { $self->imagelist->watermark_text_size(@_) },
            },
            {
                label     => gettext("Watermark color :"),
                type      => 'Choice',
                value   => sub { $self->imagelist->watermark_color(@_) },
                choice  => [
                                  gettext("White"),
                                  gettext("Black"),
                           ],
            },            
            {
                label     => gettext("Watermark position :"),
                type      => 'Choice',
                value   => sub { $self->imagelist->watermark_position(@_) },
                choice  => [
                                  gettext("Top left"),
                                  gettext("Top right"),
                                  gettext("Bottom left"),
                                  gettext("Bottom right"),
                           ],
            },
            {
                label     => gettext("Watermark marge y :"),
                type      => 'Number',
                value   => sub { $self->imagelist->watermark_marge_y(@_) },
            },
            {
                label     => gettext("Watermark marge x :"),
                type      => 'Number',
                value   => sub { $self->imagelist->watermark_marge_x(@_) },
            },            
        ]
    );

Vers la ligne 804 dans la fonction _refreshFrame après

Code:

        $self->advanced_settings_panel,

Ajoute

Code:

        $self->watermark_settings_panel,

Vers la ligne 867 dans la fonction _refresh_settings_panels_properties après

Code:

    $self->advanced_settings_panel->properties(
        $self->advanced_settings,
    );

Ajoute

Code:

    $self->watermark_settings_panel->properties(
        $self->watermark_settings,
    );

Vers la ligne 905 dans la fonction _init_settings_panels après

Code:

    $self->advanced_settings_panel(
        Uploader::GUI::wxPropertyGridPanel->new( 
            { 
                parentwnd       => $self,
                properties      => $self->advanced_settings,
                frame_callbacks => [],

            }
        )    
    );

Ajoute

Code:

    $self->watermark_settings_panel(
        Uploader::GUI::wxPropertyGridPanel->new(
            {
                parentwnd   => $self,
                properties  => $self->watermark_settings,
                frame_callbacks => [],
            }
        )
    );

Vers la ligne 1275 dans la fonction create_notebook_global_settings après

Code:

        [
            $self->advanced_settings_panel, 
            gettext("Advanced"),
        ],

Ajoute

Code:

        [
            $self->watermark_settings_panel,
            gettext("Watermark"),
        ],

Voila il me semble avoir fait le tour.


Le cerveau à des capacités tellement étonnantes qu’aujourd’hui pratiquement tout le monde en à un

Mon site : http://www.blogoflip.fr

Hors ligne

#10 2009-10-03 00:30:05

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12346

Re: [Ploader] Ajout d'un watermark

flipflip, mais pourquoi ne pas faire un patch (avec la commande "diff") ou bien tout simplement envoyer tout ton code, avec le numéro de la revision SVN de référence ? (là, ça va prendre du temps de tout faire "à la main").


Dernier billet du blog Piwigo.com (20 juin 2019) Modus, nouveau thème par défaut sur Piwigo.com

Hors ligne

#11 2009-10-03 09:57:17

ron
Former Piwigo Team
2008-09-30
211

Re: [Ploader] Ajout d'un watermark

flipflip, au vu de ton code, tu as bien avancé dans l'implémentation de la fonctionnalité watermark donc je ne pense pas que le problème que tu rencontres pour finaliser soit lié à ta connaissance de Perl ! J'ai peut être mal compris le problème et fourni une réponse inadaptée. Je vais implémenter tes modifications et je te tiens au courant.

Hors ligne

#12 2009-10-05 08:58:49

flipflip
Membre
Lyon
2005-03-19
2316

Re: [Ploader] Ajout d'un watermark

plg, je n'ai pas fais de patch tout simplement parce que je ne sais pas faire :(

ron, le code est fonctionnel sauf pour les images en hautes défintinions pour la raison que j'ai donnée en début de post (modification de l'image sur le disque dur et non celle envoyé par ploader).


Le cerveau à des capacités tellement étonnantes qu’aujourd’hui pratiquement tout le monde en à un

Mon site : http://www.blogoflip.fr

Hors ligne

#13 2010-10-15 15:42:22

jp.harand
Membre
Dijon (21)
2010-10-15
247

Re: [Ploader] Ajout d'un watermark

Hello.
Je me permets de m'insérer dans cette discussion de spécialistes pour suggérer une évolution du tatouage numérique ("watermark").
Sauf erreur de ma part, pLoader effectue un tatouage avec un texte monocolore.
Sur des images bien différentes du point de vue du contraste (une photo de sous-bois le soir, une photo de glacier en plein été), le même tatouage ne pourra pas être "propre" sur les deux (si on fait un tatouage blanc, il se verra bien dans le sous-bois mais ne se verra quasiment pas sur l'image du glacier).
(Autre cas problématique : un arbre en contre jour, cela fait plein de petites zones très contrastées. Sur une même photo, le tatouage sera illisible par endroit.)
Une solution serait que le texte du tatouage ait un contour d'une autre couleur. (Photofiltre le fait très bien... mais n'est pas intégré à Piwigo !)

Cette évolution de pLoader est-elle :
- envisagée ?
- planifiée/prévue ?
- en cours de réflexion ?
- en cours de développement ?
- dans les cartons ?
:o)

Cordialement.


» Galeries : Galerie du bocage de BourgogneDécouvertes nature en Bourgogne
» Plugins : Tag To Keyword
» Thèmes : SylviaReseauBocagesBourgogne (en cours)

Hors ligne

#14 2010-10-15 15:49:32

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12346

Re: [Ploader] Ajout d'un watermark

Je suis assez d'accord pour dire que la fonction de watermarking the pLoader est assez basique. Néanmoins, c'est déjà de l'utilisation "avancée" par rapport à la mission de base de pLoader qui est je le rappelle ajouter des photos à Piwigo, de manière simple et robuste.

Une fonction d'export vers Piwigo dans des outils de traitement d'image (comme Photofiltre) serait à mon avis plus approprié.


Dernier billet du blog Piwigo.com (20 juin 2019) Modus, nouveau thème par défaut sur Piwigo.com

Hors ligne

  •  » Outils
  •  » [Ploader] Ajout d'un watermark

Pied de page des forums

Propulsé par FluxBB

github twitter facebook newsletter Faire un don Piwigo.org © 2002-2019 · Contact