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
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
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
BonjourBonjour Yliur,
Le Sat, 12 Jun 2021 14:38:55 -0500, henryd a écrit :Bonjour Í tous,Un détail sur la convention java : les noms des classes commencent par
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
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
BonjourBonjour Yliur,
Le Sat, 12 Jun 2021 14:38:55 -0500, henryd a écrit :Bonjour Í tous,Un détail sur la convention java : les noms des classes commencent par
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
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
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
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
Bonjour Yliur,Bonjour Yliur,Le document d'aide c'était juste pour te donner quelques exemples, tu
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).
n'en a pas besoin dans ton programme. Tu peux supprimer les classes
LoadImage, SaveImage et Terminal.
Pour l'instant tu peux juste placer les deux fonctions de chargement dans
ImageTreatment :
public static Image chargerImage (String chemFicImage)
{
...
}
public static void sauvegarderImage (Image image, String chemFicImage)
{
...
}
Pour les appeler depuis main(), tu écris simplement leur nom :
chargerImage ("...") ;J’aurais plusieurs questions :De manière général, on n'appelle pas la méthode
- 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
main() («Â principale ») :
elle est exécutée quand on lance le programme, c'est tout.
Pour appeler des fonctions statiques d'une autre classe, on peut utiliser
cette forme :
Classe.fonction (...) ;
S'il s'agit de méthodes, on crée un objet de cette manière
:
Classe objet = new Classe() ;
Puis on appelle la méthode comme ça :
objet.methode (...) ;- Ok pour utiliser les ArrayList pour le moment (et voir après pourNon, c'est une classe de java.
transformer en listes chaÍ®nées). Il s’agit bien de
déclarer comme cela
un ArrayList : String[] stringTab; ?
String[] c'est un tableau dont la taille est fixée lors de sa
création.
ArrayList c'est une classe permettant de créer des tableaux extensibles
(au fur et Í mesure qu'on ajoute des éléments
dedans, la taille allouée
s'accroͮt).
Ça se déclare comme ça :
ArrayList<String> chaines ;
Et ça s'initialise comme ça :
chaines = new ArrayList<>() ;
Pour ajouter un élément dedans :
chaines.add ("coucou") ;
Pour accéder Í l'élément de rang i :
chaines.get (i) ;J’ai créé les classes Image avec les attributs : width,D'accord.
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 lesOui.
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 ÍOui, tu peux l'ajouter Í ton code existant.
écrire ce code dans la fonction main() de la classe TreatmentImage
Tu peux dès maintenant créer une fonction de chargement d'image
dans
ImageTreatment, sur le modèle de ce que j'ai noté plus haut, et
placer le
code dedans. Pour l'appeler depuis main(), tu écris simplement
chargerImage ("...") ;Je t’invite Í me dire ce que tu penses de mon code etUne remarque générale : essaie de ne pas masquer les exceptions.
s’il y des
améliorations/
correction Í faire :
https://github.com/henryd02/programme_image_java
Si tu ne
fais pas de traitement particulier des erreurs, tu peux ajouter
throws Exception
Í la fin de la ligne
public static void main ...
Les exceptions qui ne sont pas capturées avec catch donneront une pile
d'appels qui t'aidera Í comprendre ce qui s'est passé. Dans
ton exemple
tu as capturé les exceptions de type IOException, affiché un
message
indiquant que le fichier n'a pas été trouvé (ça
pourrait être ça, mais ça
pourrait être autre chose), masqué la pile d'appel et
laissé le programme
poursuivre (le traitement continue après le catch en cas d'erreur, alors
que si une erreur survient tu voudrais probablement que le programme
plante avec le message d'erreur précis).
Si try réclame que tu le complètes avec quelque chose quand tu
supprimes
le catch, tu peux supprimer ajouter Í la place
finally
{}
Bonjour Yliur,Bonjour Yliur,Le document d'aide c'était juste pour te donner quelques exemples, tu
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).
n'en a pas besoin dans ton programme. Tu peux supprimer les classes
LoadImage, SaveImage et Terminal.
Pour l'instant tu peux juste placer les deux fonctions de chargement dans
ImageTreatment :
public static Image chargerImage (String chemFicImage)
{
...
}
public static void sauvegarderImage (Image image, String chemFicImage)
{
...
}
Pour les appeler depuis main(), tu écris simplement leur nom :
chargerImage ("...") ;J’aurais plusieurs questions :De manière général, on n'appelle pas la méthode
- 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
main() («Â principale ») :
elle est exécutée quand on lance le programme, c'est tout.
Pour appeler des fonctions statiques d'une autre classe, on peut utiliser
cette forme :
Classe.fonction (...) ;
S'il s'agit de méthodes, on crée un objet de cette manière
:
Classe objet = new Classe() ;
Puis on appelle la méthode comme ça :
objet.methode (...) ;- Ok pour utiliser les ArrayList pour le moment (et voir après pourNon, c'est une classe de java.
transformer en listes chaÍ®nées). Il s’agit bien de
déclarer comme cela
un ArrayList : String[] stringTab; ?
String[] c'est un tableau dont la taille est fixée lors de sa
création.
ArrayList c'est une classe permettant de créer des tableaux extensibles
(au fur et Í mesure qu'on ajoute des éléments
dedans, la taille allouée
s'accroͮt).
Ça se déclare comme ça :
ArrayList<String> chaines ;
Et ça s'initialise comme ça :
chaines = new ArrayList<>() ;
Pour ajouter un élément dedans :
chaines.add ("coucou") ;
Pour accéder Í l'élément de rang i :
chaines.get (i) ;J’ai créé les classes Image avec les attributs : width,D'accord.
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 lesOui.
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 ÍOui, tu peux l'ajouter Í ton code existant.
écrire ce code dans la fonction main() de la classe TreatmentImage
Tu peux dès maintenant créer une fonction de chargement d'image
dans
ImageTreatment, sur le modèle de ce que j'ai noté plus haut, et
placer le
code dedans. Pour l'appeler depuis main(), tu écris simplement
chargerImage ("...") ;Je t’invite Í me dire ce que tu penses de mon code etUne remarque générale : essaie de ne pas masquer les exceptions.
s’il y des
améliorations/
correction Í faire :
https://github.com/henryd02/programme_image_java
Si tu ne
fais pas de traitement particulier des erreurs, tu peux ajouter
throws Exception
Í la fin de la ligne
public static void main ...
Les exceptions qui ne sont pas capturées avec catch donneront une pile
d'appels qui t'aidera Í comprendre ce qui s'est passé. Dans
ton exemple
tu as capturé les exceptions de type IOException, affiché un
message
indiquant que le fichier n'a pas été trouvé (ça
pourrait être ça, mais ça
pourrait être autre chose), masqué la pile d'appel et
laissé le programme
poursuivre (le traitement continue après le catch en cas d'erreur, alors
que si une erreur survient tu voudrais probablement que le programme
plante avec le message d'erreur précis).
Si try réclame que tu le complètes avec quelque chose quand tu
supprimes
le catch, tu peux supprimer ajouter Í la place
finally
{}
Le Fri, 18 Jun 2021 09:30:32 -0500, henryd a écrit :Bonjour Yliur,
Bonjour
Il n'y a rien dans cet article. Ou bien je ne parviens pas Í le
lire ?
Yliur
Le Fri, 18 Jun 2021 09:30:32 -0500, henryd a écrit :Bonjour Yliur,
Bonjour
Il n'y a rien dans cet article. Ou bien je ne parviens pas Í le
lire ?
Yliur
Le Sun, 20 Jun 2021 02:08:42 -0500, henryd a écrit :
Non plus : les deux articles sont vides. Dans google groups aussi. Et ils
n'apparaissent même pas dans Nemo.
Le Sun, 20 Jun 2021 02:08:42 -0500, henryd a écrit :
Non plus : les deux articles sont vides. Dans google groups aussi. Et ils
n'apparaissent même pas dans Nemo.
Le Sun, 20 Jun 2021 02:08:42 -0500, henryd a écrit :
Non plus : les deux articles sont vides. Dans google groups aussi. Et ils
n'apparaissent même pas dans Nemo.
Salut,
Yliur a tapoté le 21/06/2021 03:19:Le Sun, 20 Jun 2021 02:08:42 -0500, henryd a écrit :
Non plus : les deux articles sont vides. Dans google groups aussi. Et
ils n'apparaissent même pas dans Nemo.
[HC]
giganews et goretquotage, c'était filtré sur mon serveur (qui alimente
nemo)....
[/HC]
Salut,
Yliur a tapoté le 21/06/2021 03:19:
Le Sun, 20 Jun 2021 02:08:42 -0500, henryd a écrit :
Non plus : les deux articles sont vides. Dans google groups aussi. Et
ils n'apparaissent même pas dans Nemo.
[HC]
giganews et goretquotage, c'était filtré sur mon serveur (qui alimente
nemo)....
[/HC]
Salut,
Yliur a tapoté le 21/06/2021 03:19:Le Sun, 20 Jun 2021 02:08:42 -0500, henryd a écrit :
Non plus : les deux articles sont vides. Dans google groups aussi. Et
ils n'apparaissent même pas dans Nemo.
[HC]
giganews et goretquotage, c'était filtré sur mon serveur (qui alimente
nemo)....
[/HC]