Le dimanche 13 Juin 2021 à 06:12 par Yliur :
> Bonjour
>
> Le Sat, 12 Jun 2021 14:38:55 -0500, henryd a écrit :
>
>> Bonjour Í tous,
>>
>> Dans le cadre d'un projet, je dois développer un programme Java qui
>> reçoit en entrée une image au format PPM, la lit (stocke en
>> mémoire la
>> valeur des pixels) puis fait des opérations sur cette image : modifie
>> la
>> couleur (foncer,
>> éclaircir, converti en noir et blanc), affiche la taille de l'image
>> (pixels largeur x pixels longueur), découpe/ agrandi l'image... Le code
>> est soumis Í quelques contraintes : utiliser les listes
>> chainées
>> (natives) pour stocker les données en mémoire, gérer les
>> exceptions,
>> utilisation de la récursivité, d'une classe interface.
>> Je suis débutant en Java et j'ai commencé Í
>> développer une première
>> version du programme que vous trouverez avec la documentation sur mon
>> Github dans le repository suivant :
>> [url]
https://github.com/hdossot/programme_image_java[/url] Cette
>> première version permet de charger l'image en mémoire et
>> commencer Í
>> lire les pixels.
>> LÍ o͹ ça se complexifie pour moi c'est pour
>> écrire la structure avec les
>> différentes classes du programme, les fonctions de chaque classe, les
>> opérations dans les fonctions...
>> Si quelqu'un Í déjÍ eu ce type de projet
>> Í faire ou s'il peut m'aider Í
>> avancer ce serait super :)
>>
>> Je reste Í disposition si vous avez besoin d'information
>> complémentaire,
>>
>> Bien cordialement,
>> Henry
>>
>>
>>
> Un détail sur la convention java : les noms des classes commencent par
> une majuscule en général. Attention Í renommer les
> fichiers qui les
> contiennent de la même manière dans ce cas.
> Au contraire, les noms des paquetages commencent par une minuscule.
>
> Il est rapidement plus clair de ne pas mettre toutes les classes dans le
> même fichier : elles seraient mieux chacune dans un fichier
> Í leur nom.
> Tu peux avoir une classe regroupant les traitements et la fonction main,
> qui permet de lancer le programme (si ton programme grossit, tu
> préféreras peut-être mettre ce qui concerne son
> initialisation dans une
> classe distincte, mais ce n'est pas urgent).
>
> Ta liste de classes ressemblerait Í ça :
> - Image (les données d'une image)
> - Segment (les données d'un segment)
> - TraitementsImages (les traitements et la fonction main())
>
> Place chaque traitement (chargement, sauvegarde, ...) dans une fonction
> de la classe de traitements, ça te permettra de bien les distinguer et
> de
> les appeler ensuite pour réaliser des traitements plus complexes (par
> exemple charger une image, appliquer un traitement, puis sauvegarder
> l'image).
>
> Tu n'es pas obligé de créer tout de suite les fonctions qui ne
> servent Í
> rien, comme changeColor et autres dans Segment. D'autant que la dimension
> ne devrait pas se trouver lÍ Í mon avis.
>
> Si on lit la consigne, la partie structure de données dit ça :
> « On
> définit un segment comme une séquence de points
> consécutifs de même
> couleur. Pour coder un segment, il faut les trois entiers de la couleurs
> plus le nombre de points. On vous demande de représenter une image comme
> un enregistrement contenant la largeur et la hauteur de l’image,
> l’entier
> de la quatrième ligne (valeur maximale d’une couleur) et la liste
> chaͮnee
> de segments. »
>
> Je propose de laisser de cÍ´té pour l'instant la liste
> chaÍ®née et de
> stocker ça dans un tableau extensible de type ArrayList. S'il faut coder
> une liste chaÍ®née, mieux vaut faire ça dans un second
> temps (sauf si tu
> es Í l'aise avec cette structure).
>
> Donc si on lit bien le paragraphe, on a deux concepts/classes : l'image
> et le segment. Un segment est une suite de points de la même couleur,
> défini par les valeurs des couleurs et le nombre de points. Ce sont ces
> informations que devraient constituer les attributs de la classe Segment.
> Pareil pour l'image : elle est constituée d'une largeur, une hauteur, la
> valeur maximale d'une couleur, une liste de segments (c'est lÍ
> qu'on peut
> utiliser le type ArrayList<Segment>, si on veut éviter de se
> préoccuper
> de la liste chaÍ®née pour l'instant). Ces informations sont
> les attributs
> de la classe Image.
>
> Une fois qu'on a ces deux classes, on peut créer les deux fonctions qui
> servent Í charger une image et la sauvegarder. Avec ces signatures
> dans
> la classe TraitementsImages :
> public static Image chargerImage (String chemFicImage)
> public static void sauvegarderImage (Image image, String chemFicImage)
>
>
> Pour ce qui concerne la fonction de chargement :
>
> Le plus difficile consiste Í créer les segments,
> c'est-Í -dire Í compter
> les points successifs d'une même couleur, en s'arrêtant quand la
> couleur
> change ou quand la fin du fichier est atteinte. Il faut donc un compteur
> et une information sur la dernière couleur rencontrée, pour
> détecter les
> changements. Quand la fin d'un segment est détectée (ou que la
> fin du
> fichier survient), un objet Segment peut être créé avec les
> informations
> accumulées puis stocké dans la liste de segments (de type
> ArrayList pour
> l'instant, dans mon exemple). L'image peut être créée
> Í la fin, avec la
> liste de segments et les autres données qui la définissent
> (hauteur et
> largeur, nombre maximal de couleurs).
>
>
> J'arrête lÍ pour l'instant, je pense que ça fait
> déjÍ pas mal de blabla
> et de travail ? :)
>
> Yliur
Bonjour Yliur,
Merci beaucoup pour ton retour très complet avec tous ces conseils et
explications ça m'a permis de bien comprendre le projet et la philosophie que
devrait avoir le code.
J’ai donc remis à jour mon code dans le repository Github suivant (j’ai changé
l’emplacement):
https://github.com/henryd02/programme_image_java
J’ai donc réorganisé les classes dans les différents fichiers : ImageTreatment
(main), Segment, Image, LoadImage (avec la fonction pour charger l’image),
SaveImage (avec la fonction pour sauvegarder l’image).
J’aurais plusieurs questions :
- Pour le chargement et la sauvegarde de l’image, il y avait un fichier d’aide
dans la documentation (je ne l’avais pas vu et je viens de mettre le fichier
1_aide_code_java.pdf dans le repo) du projet avec une classe LoadImage et
SaveImage dans lesquelles sont déclarées les fonctions public static void main(
String [] args ) afin de charger et sauvegarder un fichier (l’image). J’ai donc
créer 2 nouveaux fichiers java avec ces 2 classes. Par contre, je n’arrive pas
utiliser la méthode main, qui est déclaré dans les classes, dans le fichier
ImageTreatment.java. Par exemple, j’ai essayé d’écrire l’instruction
LoadImage(); mais rien ne se passe. Est ce que tu sais comment faire s’il te
plait ? Une fois que cela fonctionnera je mettre tout le code de chargement de
l’image avec l'algorithme pour récupérer les informations directement dedans
- Ok pour utiliser les ArrayList pour le moment (et voir après pour transformer
en listes chaînées). Il s’agit bien de déclarer comme cela un ArrayList :
String[] stringTab; ?
J’ai créé les classes Image avec les attributs : width, height, colorScale,
segmentList et Segment avec les attributs : red, green, blue, pixelsNum. Il
faudra par la suite créer les méthodes darken_color, lighten_color,
black_n_white, negative_color, pour la classe Segment et show_size, crop_image,
darken_image, lighten_image, black_n_white, negative_image pour la classe Image
afin de pouvoir faire les modifications sur ces objets.
- Concernant l’algorithme pour créer les segment : compter les points successifs
d’une même couleur en s’arrêtant lorsque la couleur change ou que la fin du
fichier est atteint, je vais créer un compteur countPixel et les variable
redLast, greenLast, blueLast qui stockent en mémoires les valeurs relatives au
Segment. Aussi, mettre en place la condition si les valeurs red, green, blue
sont identiques au valeurs du dernier (valeurs stockées dans redLast, greenLast,
blueLast) alors on incrémente le compteur. Si différents ou on a atteint la fin
du fichier, alors on stocke l’instance du Segment dans la l’ArrayList de
l’image. Est-ce la philosophie est bonne selon toi ? Je pense que je vais
commencer à écrire ce code dans la fonction main() de la classe TreatmentImage
Je t’invite à me dire ce que tu penses de mon code et s’il y des améliorations/
correction à faire :
https://github.com/henryd02/programme_image_java
Merci beaucoup pour ton aide en tout cas :)
Bien cordialement,
Henry