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é.
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.
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).
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.
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").
Cool.
Alors dans le fichier ImageList.pm, à la suite de
# this class implements a collection of image files with associated data $|=1; __PACKAGE__->mk_accessors( qw/ thumb_size preview_ratio categories ... imagelist_version
Ajoute
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
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
sub Store { my ( $self ) = @_; my $data = $self->get_storable( [ qw/ images thumb_size preview_ratio type ... imagelist_version
Ajoute
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
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
# 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
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
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
my $params = { new_files => [], thumb_size => 120, ... ResizeCallback => sub { $self->ResizeImage(@_) },
Ajoute
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
my @properties = qw/ progressdlg upload_progressdlg imageviewer .. preview_settings advanced_settings
Ajoute
watermark_settings
Vers la ligne 713 après
$self->advanced_settings( [ { label => gettext("Transfert chunk size :"), type => 'Number', value => sub { wxTheApp->chunk_size(@_) }, }, ] );
Ajoute
$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
$self->advanced_settings_panel,
Ajoute
$self->watermark_settings_panel,
Vers la ligne 867 dans la fonction _refresh_settings_panels_properties après
$self->advanced_settings_panel->properties( $self->advanced_settings, );
Ajoute
$self->watermark_settings_panel->properties( $self->watermark_settings, );
Vers la ligne 905 dans la fonction _init_settings_panels après
$self->advanced_settings_panel( Uploader::GUI::wxPropertyGridPanel->new( { parentwnd => $self, properties => $self->advanced_settings, frame_callbacks => [], } ) );
Ajoute
$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
[ $self->advanced_settings_panel, gettext("Advanced"), ],
Ajoute
[ $self->watermark_settings_panel, gettext("Watermark"), ],
Voila il me semble avoir fait le tour.
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.
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 ?
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.
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 }
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.
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.
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 ?
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 :
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 :
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 :
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
# 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{ }
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
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
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), ) ); }