2:I[9275,[],""] 3:I[1343,[],""] 4:I[231,["231","static/chunks/231-ad43a7880cb84318.js","202","static/chunks/app/projets/page-b89b386e3203a327.js"],""] 0:["8xlXttnvkxuKqUAoujXFi",[[["",{"children":["projets",{"children":["ascii-art",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",{"children":["projets",{"children":["ascii-art",{"children":["__PAGE__",{},[["$L1",[["$","head",null,{"children":[["$","title",null,{"children":"Développement Logiciel - ASCII Art"}],["$","meta",null,{"name":"description","content":"Développement d'un logiciel de traitement d'image pour convertir chaque pixel en caractères ASCII."}],["$","link",null,{"rel":"canonical","href":"https://maximilienherr.fr/projets/ascii-art"}]]}],["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https://maximilienherr.fr\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Projets\",\"item\":\"https://maximilienherr.fr/projets\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Ascii Art\",\"item\":\"https://maximilienherr.fr/projets/ascii-art\"}]}"}}],["$","section",null,{"className":"content","children":[["$","h1",null,{"children":"Développement Logiciel - ASCII Art"}],["$","p",null,{"children":"Rapidement, le contexte de ce projet est de réaliser un logiciel capable d'appliquer un traitement sur une image, pour convertir chaque pixel en caractères de la table ASCII. On convertit donc chaque composant de l'image en caractères, comme \"W\", \"w\", \"l\" ..."}],["$","img",null,{"className":"$undefined","src":"/images/Images/ascii-art_illustration.webp","alt":"ascii art SAE illustration","width":512,"height":199,"loading":"lazy","decoding":"async"}],["$","h2",null,{"children":"Caractéristiques techniques du projet"}],["$","h3",null,{"children":"Langages / technologies utilisés"}],["$","p",null,{"children":"Ce logiciel de traitement d'image se fait à partir d'un code en C++. Pour gérer les problèmes qui peuvent arriver dans le traitement d'images, on a utilisé Visual Studio 2019, qui nous donne accès à un débuggeur très puissant. Ainsi, on a pu identifier l'état de nos variables, notamment pour savoir si l'on dépasse la taille de l'image, si l'on dépasse des valeurs…"}],["$","h3",null,{"children":"Combien de temps, qui et quoi ?"}],["$","p",null,{"children":["Ce projet s'inscrit dans le cadre de ma formation en BUT Informatique Graphique, à travers une SAE (Situation d'Apprentissage et d'Évaluation). Il a ainsi duré une douzaine d'heures, comprenant le temps de développement, ainsi que le temps de rédaction du compte-rendu. J'étais en collaboration avec",["$","a",null,{"href":"https://www.linkedin.com/in/florian-mure-9b335422b/","target":"_blank","rel":"noopener","children":"Florian Mure"}],"."]}],["$","p",null,{"children":"Après avoir passé un premier temps sur du code du projet, je suis parti sur la création du compte-rendu de celui-ci, impliquant la bonne compréhension du projet."}],["$","h2",null,{"children":"Détails du projet"}],["$","p",null,{"children":"Ce projet était la première application pratique de nos compétences sur une durée prolongée, dans le cadre de ma formation. Pour le réaliser complètement à 2, nous avons utilisé GitHub, pour la première fois dans mon cas. Cela m'a permis de me former brièvement sur l'outil, et apprendre la collaboration à travers Git comme outil de partage de code."}],["$","p",null,{"children":"En termes de code à proprement parler, celui-ci répond aux exigences érigées en début de projet dans le sujet. Nous étions guidés dans sa réalisation (rappel : premier projet \"sérieux\"), pour autant, nous avons fini dans les délais, même en avance, avec un code qui fonctionnait dans tous les cas. En effet, comme nous traitons une image, il était possible que le traitement ne fonctionne pas selon certaines tailles d'images, selon certaines configurations… Notre projet final est fonctionnel dans tous ces cas-là."}],["$","p",null,{"children":"Pour préciser un peu le déroulement de ce projet, il y avait 5 versions, que nous devions réaliser chronologiquement, avec des indications au fur et à mesure :"}],["$","h3",null,{"children":"Version 1"}],["$","ul",null,{"children":["entre la largeur ou la hauteur de l’image et width ou height. À partir",["$","li",null,{"children":"Récupération dimages en PGM"}],["$","li",null,{"children":"Traitement des informations du fichier image (entête et corps)"}],["$","li",null,{"children":"Conversion des informations du corps du fichier en ASCII Art"}]]}],["$","p",null,{"children":"entre la largeur ou la hauteur de l’image et width ou height. À partir On doit dabord utiliser un utilitaire fourni pour transformer des images type PNG ou JPEG en PGM."}],["$","p",null,{"children":"entre la largeur ou la hauteur de l’image et width ou height. À partir Une fois ces images transformées, lentête contient 2 informations importantes sur le fichier, sa largeur et sa hauteur. Ensuite, le corps du fichier, est composé de chaque pixel, codé sur un octet. Une fois la valeur convertie en ASCII (selon la palette fournie), on peut entre la largeur ou la hauteur de l’image et width ou height. À partir lafficher dans la console."}],["$","h3",null,{"children":"Version 2"}],["$","ul",null,{"children":[["$","li",null,{"children":"Création d'un fichier texte"}],["$","li",null,{"children":"Exportation de l'ASCII Art dans le fichier texte crée"}]]}],["$","p",null,{"children":"Cette partie est beaucoup plus succincte, il suffit de créer le entre la largeur ou la hauteur de l’image et width ou height. À partir fichier, que lon pourra nommer comme on le souhaite. Puis, au lieu entre la largeur ou la hauteur de l’image et width ou height. À partir dafficher dans la console, on exporte les valeurs dans le fichier texte créé."}],["$","h3",null,{"children":"Version 3"}],["$","ul",null,{"children":[["$","li",null,{"children":"Lecture de fichiers textes \"palette\""}],["$","li",null,{"children":"Changement de l'affichage de l'ASCII Art selon la palette traitée"}]]}],["$","p",null,{"children":"On doit donc traiter les données des palettes, en ouvrant le fichier, qui présentent un nombre \"aléatoire\" de caractères. Du fait du caractère aléatoire du nombre de caractères, on doit adapter le programme pour afficher, avec les bons intervalles, les caractères ASCII de la palette."}],["$","h3",null,{"children":"Version 4"}],["$","ul",null,{"children":[["$","li",null,{"children":"Entrée d'arguments pour une exécution en invite de commande"}],["$","li",null,{"children":"Affichage d'un help"}],["$","li",null,{"children":["Changement des arguments pour :",["$","ul",null,{"children":[["$","li",null,{"children":"Fichier d'entrée"}],["$","li",null,{"children":"Fichier de sortie"}],["$","li",null,{"children":"Fichier de palette"}]]}]]}]]}],["$","p",null,{"children":"On doit alors utiliser des arguments en entrée du programme, qui vont entre la largeur ou la hauteur de l’image et width ou height. À partir nous permettre dafficher une aide, et de changer les paramètres du entre la largeur ou la hauteur de l’image et width ou height. À partir programme Les arguments sont de ce fait laide et les paramètres du programme, à savoir le chemin du fichier en entrée, du fichier de sortie, et du fichier palette."}],["$","h3",null,{"children":"Version 5"}],["$","ul",null,{"children":[["$","li",null,{"children":"Ajout de deux arguments width et height"}],["$","li",null,{"children":"Calcul du facteur de diminution"}],["$","li",null,{"children":"Calcul de la moyenne de valeurs sur une zone et envoie des valeurs dans un tableau"}]]}],["$","p",null,{"children":"On rajoute désormais deux arguments width et height qui vont entre la largeur ou la hauteur de l’image et width ou height. À partir correspondre à la taille maximale que lon veut pour notre fichier. entre la largeur ou la hauteur de l’image et width ou height. À partir Seulement, on doit conserver une image propre, cest donc le facteur de diminution majoritaire qui va être conservé."}],["$","p",null,{"children":"Ce facteur de diminution sera ainsi la valeur maximale du rapport entre la largeur ou la hauteur de l’image et width ou height. À partir entre la largeur ou la hauteur de limage et width ou height. À partir de là, on doit parcourir de nouveau le tableau des données, en ne entre la largeur ou la hauteur de l’image et width ou height. À partir conservant quun pixel pour une zone du facteur (exemple, pour un facteur de diminution de 3, on remplace 9 pixels par 1)."}],["$","p",null,{"children":"Et à la fin, ça nous donne des petits chats tout mignons en caractères de la table ASCII !"}],["$","img",null,{"className":"$undefined","src":"/images/Images/ascii-art_result_cats.png","alt":"Résultat du projet en version 5","width":1814,"height":705,"loading":"lazy","decoding":"async"}],["$","h2",null,{"children":"Auto-critique du résultat"}],["$","p",null,{"children":"Étant donné que nous sommes arrivés à la fin des 5 versions du projet, cette critique sera rapide. Nous avons bien travaillé, avec le respect du temps imparti. D'autant plus que nous avions utilisé GitHub (donc Git) pour le partage de code, en se formant brièvement sur l'outil. Cela nous a permis d'avancer vraiment plus vite."}],["$","div",null,{"className":"logos","children":[["$","img",null,{"className":"logo","src":"/images/logos/CPP.png","alt":"CPP","width":1822,"height":2048,"loading":"lazy","decoding":"async"}],["$","img",null,{"className":"logo","src":"/images/logos/VisualStudio.png","alt":"Visual Studio","width":1285,"height":1414,"loading":"lazy","decoding":"async"}],["$","img",null,{"className":"logo","src":"/images/logos/git.png","alt":"Git","width":383,"height":383,"loading":"lazy","decoding":"async"}]]}],["$","h2",null,{"children":"Sources du projet"}],["$","a",null,{"href":"https://github.com/MaximilienHe/PGM-to-ASCII-Art","target":"_blank","rel":"noopener","children":["$","img",null,{"className":"logo","src":"/images/logos/logo-sources-projet.png","alt":"Sources du projet","width":512,"height":512,"loading":"lazy","decoding":"async"}]}]]}]]],null],null]},["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children","projets","children","ascii-art","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6db49e2b852da83c.css","precedence":"next","crossOrigin":"$undefined"}]]}],null]},["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children","projets","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}],null]},[["$","html",null,{"lang":"en","children":[["$","head",null,{"children":[["$","meta",null,{"charSet":"UTF-8"}],["$","meta",null,{"httpEquiv":"X-UA-Compatible","content":"IE=edge"}],["$","meta",null,{"name":"viewport","content":"width=device-width, initial-scale=1.0"}],["$","meta",null,{"name":"description","content":"Je me présente, Maximilien Herr, et sur ce site, vous retrouverez mon portfolio, à travers mes projets, mon CV, et bien plus encore pour découvrir mon profil d'ingénieur logiciel et de rédacteur tech"}],["$","meta",null,{"name":"image","content":"https://maximilienherr.fr/banniere_dev_redac.png"}],["$","meta",null,{"property":"og:title","content":"Maximilien Herr - Portfolio"}],["$","meta",null,{"property":"og:description","content":"Je me présente, Maximilien Herr, et sur ce site, vous retrouverez mon portfolio, à travers mes projets, mon CV, et bien plus encore !"}],["$","meta",null,{"property":"og:image","content":"https://maximilienherr.fr/banniere_dev_redac.png"}],["$","meta",null,{"property":"og:url","content":"https://maximilienherr.fr"}],["$","link",null,{"rel":"icon","href":"/favicon.ico"}],["$","title",null,{"children":"Maximilien Herr"}],["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"Person\",\"name\":\"Maximilien Herr\",\"url\":\"https://maximilienherr.fr\",\"sameAs\":[\"https://www.linkedin.com/in/maximilienherr\",\"https://github.com/maximilienherr\"]}"}}]]}],["$","body",null,{"className":"__className_d65c78","children":[["$","section",null,{"className":"header","children":["$","div",null,{"className":"nav","children":[["$","input",null,{"type":"checkbox","id":"nav-check"}],["$","div",null,{"className":"nav-header","children":["$","div",null,{"className":"nav-title","children":["$","$L4",null,{"href":"/","children":["$","p",null,{"children":"Maximilien Herr"}]}]}]}],["$","div",null,{"className":"nav-btn","children":["$","label",null,{"htmlFor":"nav-check","children":[["$","span",null,{}],["$","span",null,{}],["$","span",null,{}]]}]}],["$","div",null,{"className":"nav-links","children":[["$","$L4",null,{"href":"/nr","children":"Numérique Responsable"}],["$","a",null,{"href":"/#articles","children":"Rédacteur"}],["$","$L4",null,{"href":"/projets","children":"Projets"}],["$","$L4",null,{"href":"/contact","children":"Contact"}],["$","$L4",null,{"href":"/cv","className":"button","children":"MON CV"}]]}]]}]}],["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}],["$","section",null,{"className":"footer","children":[["$","p",null,{"children":["© Maximilien Herr | ",2025," (site dev avec Next.js)"]}],["$","div",null,{"className":"socials","children":[["$","a",null,{"href":"https://www.linkedin.com/in/maximilien-herr/","target":"_blank","rel":"noopener","children":["$","p",null,{"children":"LinkedIn"}]}],["$","a",null,{"href":"https://github.com/MaximilienHe","target":"_blank","rel":"noopener","children":["$","p",null,{"children":"GitHub"}]}]]}]]}]]}]]}],null],null],[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/10a6cc3a3ff26b94.css","precedence":"next","crossOrigin":"$undefined"}]],"$L5"]]]] 5:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"Maximilien Herr - Numérique Responsable"}]] 1:null