LES IMAGES

Comme vous le savez peut etre deja, une image n est pas un widget a part entiere mais peut etre afficher dans un label, un bouton, un canvas, etc...

joindre unE image a votre projet

a) fichier image

Pour afficher une image sur notre interface, habituellement nous utilisons un label avec l option -image comme ceci:

image create photo img -file "ecrou.jpg"
label .fr.lbl -image img
pack .fr.lbl

Vous l aurez compris, il faut d abord creer notre image en lui indiquant ou se trouve le fichier ( ici ecrou.jpg est dans le repertoire de l application)

Si vous avez sotcke vos images dans un sous repertoire genre icon ou img,  le code est le suivant :

image create photo img -file "./img/ecrou.jpg"
label .fr.lbl -image img
pack .fr.lbl

le ./ etant le repertoire de votre application.

b) Image sous forme de data (donnees)

Sous tk il existe la possibilite de definir une image avec sa representation ASCII sous forme de texte.

C est simplement une image dont les donnees sont visibles en clair sous la forme de la vieille norme BASE64.

Cette technique presente deux enormes  avantages :

  • La photo est prechargee en memoire au lancement de l'application, du coup le script est tres rapide.

Prenons un exemple :

image create photo ipaste -data {R0lGODlhGAAXAMZqAOEcVuIdV+IgV+EhV+ElWfoeZvofZvogZuEsW+IuXOMyXv0wbeJAZPw5b+NDZu
JEZuNLa+RYcvxwS/xwTP5ujPuFVfmVAPmWAPmWCfmXAPmXAfmXA/qPYvmXCPmXCvmXC/mYDvmYEfmYEvmYFfmZGPmZHPmaI
/maJHjDQXnDQfmdLfmeMXvEP4HELoDEM/meO3/EPoLFLPmgPfmgP/mgQvmgRfmiRonHT/qkUI/IMY/IMo/INPqkVpTKR/qpYJjLUv
qvdPuwdvuwd/qydvq2ganTefq5h6vUfq7VhPrDnPjFn7nalvnGob7boPvIp7/coL/cocDcocDcpMHdpL/epsDepcDepsHepvvRt8n
hsvvSuNzgu9zgvN3hvNfpxdjqydrqyNrqyunmzvHr2ejy3uz05PT58Pb68vb68/v9+v///////////////////////////////////
////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAH8ALAAAAAAYABc
AAAfEgH+Cg4SFhoeHDw6IjIUICY2RfwQDEZKIEAAADJeHCgEBAp2FCwUHBwYNFKN/HBISE68SFaM8IRi4uR8mnSUnQELBQkE0F50iQ
2NbXV1cYk4WnRdGYTAoKSxSWtGXIkZgMS43LU3bnRvfOUteOlHmlx7fPWVmRU/vkh3fSGhpV/fcJE0Dc+RMmioAO434tmNKlh9Q8EXK
QIQMlYtWvmAJGKnEiyRKQiph4sPYpRMZQIgIsTKEBhKjashYYUPFDBU4WLEKBAA7}

label .fr.lbl -image ipaste

il suffit simplement de mettre notre image entre crochet juste apres l'option -data

  • le 2eme avantage est que l'image est tres compacte.

Nous allons voir comment creer cette image maintenant.

c) creation d'une image au format BASE64

A l'ere du stockage de plus en plus grand, nous oublions la taille des images sur notre disques de plus en plus grandes.

Pour afficher l'image de notre exemple, j'ai enregistre une image libre de droit d'internet au format PNG avec transparence de resolution 32x32 pixels qui fait 17 kilo octets en mode True color.

 

J'ai convertie cette image en mode 256 couleurs et je l'ai enregistre au format GIF  a l'aide de l'editeur GIMP pour linux.

Le resultat est sans appel, j'ai divise par 8 la taille de l'image, elle fait maintenant 1,2Ko

 

Pour la conversion en base64, vous pourrez le faire en ligne de commande sous linux,

mais le site https://elmah.io/tools/base64-image-encoder/

le fera bien pour nous. Copiez votre photo et simplement recuperez le texte converti.

 

Vous pouvez maintenant utiliser votre image dans votre application.

 

d) bibliotheque d'images

On pourrait meme imaginer un fichier code source tk qui contiendrait l'ensemble des images de votre application, comme un bibliotheque.

l'avantage est qu'un simple changement de fichier changerait immediatement le theme des images de votre appli.

C'est le principe aue j'ai utilise dans l'application tksociete (voir ici)

 

REDIMENSIONNER UNE IMAGE A LA VOLEE

J'ai cherché un moment une procédure me permettant de redimensionner à la volée une image en l'agrandissant ou la réduisant mais je n'ai pas trouvé ce que je cherchais.

J'ai donc réalisé cette procédure moi même.

1) Creation de la procédure en lui passant les paramètres.

Je voudrais recevoir de ma nouvelle procédure nommée resizeIMG une image redimensionnée.

Je souhaite aussi lors de son exécution lui passer :

  • L'image à redimensionner ici myimg
  • La taille à redimensionner en X en pixels ici wi
  • La taille à redimensionner en Y en pixels ici he

Pour des raisons de simplification, il est compliqué de connaître par le code en tcl tk la taille d'une image. Nous partirons du postulat que nous redimensionnons une image qui a des dimensions de 128x128 au format PNG.

Voici le code de la procédure que nous allons commenter :

 proc resizeIMG { myimg wi he } {
	 set factor [expr 128 / $wi]
	set Imodified [image create photo -width $wi -height $he]
    $Imodified copy $myimg -to 0 0 $wi $he -subsample $factor
     return $Imodified
 }

Commentons ce code :

  • Définissons une variable factor qui sera le facteur de zoom de notre image.
  • Définisson une variable Imodified qui sera une image aux nouvelles dimensions.

La ligne la plus intéressante est la suivante :

$Imodified copy $myimg -to 0 0 $wi $he -subsample $factor

 

 

 

 

 

 

.