Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERSION D'UNE IMAGE À UN CODE PICWIN


Information sur la source

Catégorie :AddOns Niveau : Initié Date de création : 30/07/2004 Date de mise à jour : 30/07/2004 17:10:32 Vu / téléchargé: 3 517 / 110

Note :
7 / 10 - par 3 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note


Description

Voila un petit alias que j'ai fais pour le fun :
Il convertit une image (JPG,BMP ou PNG) en un code picwin, c'est à dire des milliers de drawdot permettant de redessiner pixel par pixel l'image de base.
Pour faire plus clair : vous pouvez afficher une image à partir d'un remote mIRC.

Evidemment, l'utilité n'est pas le point fort de ma source cette fois-ci.
Convertir une image de taille raisonnable (disons 468*100) de moins de 100 ko pour un fichier .txt de plus de 600 ko ne me semble pas être réellement intéréssant.

Je vais vous parler de la théorie, la méthode utilisée pour réussir à convertir une image en ligne de commande pour picwin :
Tout d'abord, j'utilise une 2 @window invisible.
L'une affiche l'image que l'on va convertir tel qu'elle est (/drawpic), et l'autre me sert à stocker les commandes /drawdot. (stocké par des /alines)
Pour la redessiner, j'ai choisis de 'scanner' pixel par pixel notre l'image de base, d'y extraire sa couleur avec $getdot et de redessiner ce pixel sur mon 2ème @window avec la commande drawdot.
Je scan en horizontal de gauche à droite, puis arrivé à l'extremité droite, je descend d'un pixel tout en recommencant l'opération.
Une fois avoir passé en revue tout les pixels, je fais un /savebuf pour enregistrer le contenu de mon @window invisible dans un fichier.

Passons au benchmark du code :
(testé sur mIRC 6.16 / Windows XP / AMD Barton 2600+)
image de 468x100 pixels (46 801 lignes) converti en ~4 secs et affiché en ~2,5 secs
image de 500x400 pixels (200 001 lignes) converti en ~18 secs et affiché en ~10 secs

Je vous laisse voir mon code, je vous donnerai ensuite les explications pour vous en servir.
 

Source

  • /*
  • >> Conversion d'une image à un picwin
  • >> Par Sorn_Drixer
  • >> www.Sorn-Creation.org
  • >> Utilisation :
  • >> /drawimg fichier.txt fichier.jpg
  • >> fichier.txt étant le fichier dans lequel le code va être écrit
  • >> fichier.jpg étant l'image que l'on va convertir (jpg/bmp/png supporté)
  • >> Pour voir directement ensuite le picwin à partir du .txt généré précedemment :
  • >> /emulimg fichier.txt
  • */
  • alias drawimg {
  • if $exists($2-) { var %a = $2-, %b = @drawimg-img, %c, %d = @drawimg-tmp, %e = $ticks, %f, %g = $1 }
  • else { echo -a Erreur : Fichier inexistant | halt }
  • close -@ %b
  • close -@ @tmp
  • window -dBk0zp +d %b 1 1 $pic(%a).width $pic(%a).height
  • window -h @tmp
  • drawpic %b 0 0 %a
  • window -h %b
  • .remove %g
  • %c = window -CdBk0zp +d %d 1 1 $window(%b).w $window(%b).h
  • aline @tmp %c
  • var %1 = $window(%b).w, %2 = $window(%b).h, %3 = 0, %4 = 0, %5
  • while %2 > %3 {
  • inc %3
  • %4 = 0
  • while %1 > %4 {
  • inc %4
  • %5 = $getdot(%b,%4,%3) 1 %4 %3
  • aline @tmp %5
  • }
  • }
  • savebuf @tmp $1
  • close -@ %b
  • close -@ @tmp
  • %f = $calc($ticks - %e)
  • echo -a Convertion effectuée en $+(,%f,) ms ( $calc(%f / 1000) secs )
  • }
  • alias -l windowname return $+($chr(64),$gettok($gettok($1-,2,64),1,32))
  • alias emulimg {
  • if !$exists($1) { echo - Erreur : Fichier inexistant | halt }
  • var %a = $windowname($read($1,1)), %b = $ticks, %c, %d
  • $read($1,1)
  • .fopen emulimg $1
  • while !$feof { drawdot -rn %a $fread(emulimg) }
  • .fclose emulimg
  • drawrect -rn %a $rgb(0,0,0) 1 0 0 $window(%a).w $window(%a).h
  • drawdot %a
  • %d = $calc($ticks - %b)
  • echo -a Image affichée en $+(,%d,) ms ( $calc(%d / 1000) secs )
  • }
/*

>> Conversion d'une image à un picwin
>> Par Sorn_Drixer
>> www.Sorn-Creation.org

>> Utilisation :
>> /drawimg fichier.txt fichier.jpg
>> fichier.txt étant le fichier dans lequel le code va être écrit
>> fichier.jpg étant l'image que l'on va convertir (jpg/bmp/png supporté)
>> Pour voir directement ensuite le picwin à partir du .txt généré précedemment :
>> /emulimg fichier.txt


*/

alias drawimg {
  if $exists($2-) { var %a = $2-, %b = @drawimg-img, %c, %d = @drawimg-tmp, %e = $ticks, %f, %g = $1 }
  else { echo -a Erreur : Fichier inexistant | halt }
  close -@ %b
  close -@ @tmp
  window -dBk0zp +d %b 1 1 $pic(%a).width $pic(%a).height
  window -h @tmp
  drawpic %b 0 0 %a
  window -h %b
  .remove %g
  %c = window -CdBk0zp +d %d 1 1 $window(%b).w $window(%b).h
  aline @tmp %c
  var %1 = $window(%b).w, %2 = $window(%b).h, %3 = 0, %4 = 0, %5
  while %2 > %3 {
    inc %3
    %4 = 0
    while %1 > %4 {
      inc %4
      %5 = $getdot(%b,%4,%3) 1 %4 %3
      aline @tmp %5
    }
  }
  savebuf @tmp $1
  close -@ %b
  close -@ @tmp
  %f = $calc($ticks - %e)
  echo -a Convertion effectuée en $+(,%f,) ms ( $calc(%f / 1000) secs )
}

alias -l windowname return $+($chr(64),$gettok($gettok($1-,2,64),1,32))

alias emulimg {
  if !$exists($1) { echo - Erreur : Fichier inexistant | halt }
  var %a = $windowname($read($1,1)), %b = $ticks, %c, %d
  $read($1,1)
  .fopen emulimg $1
  while !$feof { drawdot -rn %a $fread(emulimg) }
  .fclose emulimg
  drawrect -rn %a $rgb(0,0,0) 1 0 0 $window(%a).w $window(%a).h
  drawdot %a
  %d = $calc($ticks - %b)
  echo -a Image affichée en $+(,%d,) ms ( $calc(%d / 1000) secs )
}

Conclusion

Ne fonctionne que sur mIRC 6.12 et + (dû à l'utilisation du file handling)
Lors de la convertion d'une image, votre mIRC va geler pendant quelques secondes, ne vous affolez pas, il vous suffit d'attendre la fin de la convertion.

Utilisation :
Dézippez le tout à la racine de votre mIRC, et tapez /load -rs drawimg.mrc
Tapez /drawimg fichier.txt votreimage.jpg pour convertir votreimage.jpg et écrire le code picwin dans fichier.txt

Une image d'exemple est fournis dans le zip.
Tapez par exemple /drawimg test.txt exemple.jpg pour entreprendre la convertion de l'image.

Ensuite, pour l'afficher à partir du code picwin ainsi généré (test.txt), faites :
/emulimg test.txt

Benchmark concernant exemple.jpg :
exemple.jpg converti en ~5 secs et affiché en ~3 secs (testé sur la même machine)

-

J'attends vos commentaires :)

-

Sorn_Drixer
www.Sorn-Creation.org
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

30 juillet 2004 12:45:05 :
Ajout du .zip
30 juillet 2004 12:57:07 :
Conversion et non Convertion. Merci ReMi :p
30 juillet 2004 17:10:33 :
- Optimisation au niveau de la conversion. Technique de buffer vient remplacer le file handling dans l'alias drawimg.

Commentaires et avis

signaler à un administrateur
Commentaire de ReMi34 le 30/07/2004 12:43:13

Encore un truc excellent, décidément, tu m'épateras toujours !

signaler à un administrateur
Commentaire de Eiffel le 30/07/2004 13:39:44

Vraiment excellent !

signaler à un administrateur
Commentaire de Kerrigan le 30/07/2004 13:52:50

tres intéressant.

signaler à un administrateur
Commentaire de Kerrigan le 30/07/2004 14:15:17

Tiens la je pense a un truc assez sympa. Ca doit etre dur mais ça vaut la peine de tenter le coup.

Et si ton avec ton code on faisait un format de compression ? je m'explique

quand tu scanne point par point, verifie si le pixel d'apres est de la meme couleur que le précédent. Si c'est le cas au lieu de faire deux drawdot tu ferais juste un drawline.

Mais on pourrait encore augmenter la puissance du code et ctte foi, le code attend de trouver une couleur différente pour tracer une droite complete.

De cette façon on transformerait une image en une suite de fonctions et si l'image est assez simple je me demande si le format codé, serait pas plus léger que l'image de départ.

pour des dévéloppement futur, on pourrait meme envisager de replacer alors, certain drawline successif de la meme couleur par des drawrect -f

affaire a suivre ...

signaler à un administrateur
Commentaire de SornDrixer le 30/07/2004 14:27:49 administrateur CS

Kerrigan : J'y avais pensé, sauf d'une manière différente :
Je soumets différent point X Y à un drawdot. (
Un drawdot = une couleur précise.
Mais le problème, il aurait fallut que je 'scan' toute l'image pour chaque couleur, ca risquerait de prendre encore + de temps, enfin je dis ca, mais je n'ai pas testé. Je verrai ca ce soir :)

Ton idée de drawline n'est pas mal, mais je préfère tout faire avec drawdot dans ce code.

Qui sait, peut-être un jour j'inventerai mon propre format d'image :P

signaler à un administrateur
Commentaire de Kerrigan le 30/07/2004 17:42:19

creer un format d'image voila une idée tres intéressante.

signaler à un administrateur
Commentaire de Seregon le 30/07/2004 19:17:24

Bof ce genre de code picwin qui font fortement ramer le cpu ca m'emballe pas vraiment
Niveau scripting mouais, Ia rien de tres compliqué ca reste de l'utilisation absique du $getdot et du drawdot

signaler à un administrateur
Commentaire de SornDrixer le 30/07/2004 20:49:27 administrateur CS

Seregon :
Niveau utilité, je l'ai précisé, il est nul. C'est juste une façon de voir jusqu'où mIRC peut aller. (par rapport à son cpu)

Niveau scripting, oui c'est basique, c'est un code sans prétention, mais qui est original.

signaler à un administrateur
Commentaire de Le_Corse le 31/07/2004 23:03:16

"/* , */" c'est pas du language C :p

signaler à un administrateur
Commentaire de SornDrixer le 01/08/2004 09:38:51 administrateur CS

Le_Corse : Ces 'balises' sont utilisées pour délimiter les zones de commentaire dans plusieurs languages, C,PHP,mIRC Script, et sûrement quelques autres.

signaler à un administrateur
Commentaire de Hades53 le 01/08/2004 17:29:15

Mouarf...
Totalement inutile !
L'idée est bonne mais la conception est vraiment grossière:

-Tu utilises /drawpic
- /remove, $exists(), $read(), buffer @window alors que tu peux utiliser $fopen() (car version 6.12+ exigée)
-"fichier.txt" ne supporte pas les espaces
-Que du /drawdot, aucun /drawtext, /drawrect, etc.
-Le fichier txt sortie ne contient aucune commande /drawdot (donc on ne peux pas l'inclure dans un script)
-Comme il ne contient aucune commande /drawdot, on peut se dire qu'il est peut-être compressé mais il n'en est rien.

Bref si tu veux rendre ton code correct, penses à $bvar, /draw*, $compress, /fopen car pour l'heure il n'a vraiment rien qui mérite qu'on y prenne attention.
3/10.

signaler à un administrateur
Commentaire de SornDrixer le 02/08/2004 09:36:26 administrateur CS

Hades53 :
- il faut bien afficher l'image de base quelque part si on veut lui faire des $getdot pour en extraire sa couleur pixel par pixel, et je n'ai pas trouvé d'autre solution que /drawpic.
- Lors de la 1ère version de mon code, j'utilisais le file handling, que j'ai peu à peu remplacé par le buffer @window pour l'alias drawimg. (gain de vitesse intéréssant)
- fichier.txt ne supporte pas les espaces, je le sais, et je n'ai jamais voulu le faire autrement. C'est juste un petit snippet, pas un addon tout fait.
- le fichier txt ne contient aucune commande /drawdot pour diminuer un petit peu sa taille, et je vois mal quelqu'un inclure une image générée par des drawdot dans son script, une vraie image est plus pratique.

Pour une prochaine update si il y a, j'essayerai de tenir compte de se que tu as dis.

signaler à un administrateur
Commentaire de _VeSpArO_ le 24/08/2004 19:46:37

J'aime bien l'utilisation du file handling joli 8/10

signaler à un administrateur
Commentaire de MaX_62 le 27/05/2005 21:39:26

Je trouve l'idée super intéressante mais en testant, je mets 22 secondes pour convertir le .jpg que tu as mis en exemple, et 12 secondes pour le dessiner...
Pas mal malgré tout !

signaler à un administrateur
Commentaire de MaX_62 le 27/05/2005 21:41:24

Au fait : personnellement j'aurai fait cette source en hash tables plutot que d'utiliser le file handling... Ce n'est que mon avis
(dsl du double post)

signaler à un administrateur
Commentaire de SornDrixer le 27/05/2005 22:40:39 administrateur CS

MaX_62 : mmh oui c'est vrai, faudrait faire des tests afin de voir quelle méthode est la plus rapide dans ce cas ici présent.
Le file handling permet d'écrire directement le fichier, tandis que la hashtable, il faut d'abord la créer, ajouter les items, puis seulement une fois celle-ci terminée, "l'exporter" (pour avoir notre fichier.txt contenant le "code source" de l'image pixel par pixel)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,61 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.