Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

enregistrer une image en JPG sur linux

8 réponses
Avatar
Jean-Marie
bonjour

j'ai utilisé 2 librairies différentes (ImageIO et com.sun.image.codec.jpeg)
pour enregistrer au format JPG une image de la fenêtre de mon application ;
dans les 2 cas çà marche sous windows mais pas sous linux (testé sous
SUSE ou REDHAT) : l'image est noire !

quelqu'un a-t'il une explication ?

merci d'avance

Jean-Marie

8 réponses

Avatar
Mayeul
Jean-Marie wrote:
bonjour

j'ai utilisé 2 librairies différentes (ImageIO et com.sun.image.codec.jpeg)
pour enregistrer au format JPG une image de la fenêtre de mon application ;
dans les 2 cas çà marche sous windows mais pas sous linux (testé sous
SUSE ou REDHAT) : l'image est noire !

quelqu'un a-t'il une explication ?

merci d'avance



Dans les deux cas ça passe par com.sun.image.codec.jpeg.
ImageIO est une bibliothèque générique, qui quand on fait du JPEG, passe
par com.sun.image.codec.jpeg.

Accessoirement, ImageIO fait partie de la bibliothèque de base Java, et
garantit de ne pas changer ou disparaître sans prévenir, ce qui n'est
pas le cas du codec en question (il pourrait être remplacé par un autre,
si ça chante à celui qui implémente la bibliothèque de base.)


À part ça, je n'ai pas d'explication. C'est peut-être un bug connu, de
Java, de X11, de la façon qu'a Java de gérer X11, des extensions 3D ou
damage, ou je ne sais quoi. Ça a peut-être été réparé dans une version
récente de Java. Mais je doute que ça ait un rapport avec la
bibliothèque utilisée pour enregistrer en JPEG. À vérifier avec du PNG,
ou en réaffichant la même image à côté.

--
Mayeul
Avatar
Christian Laborde
Il faudrait avoir déjà un exemple de code pour répondre à
cette question.
A+

Mayeul a écrit :
Jean-Marie wrote:
bonjour

j'ai utilisé 2 librairies différentes (ImageIO et
com.sun.image.codec.jpeg)
pour enregistrer au format JPG une image de la fenêtre de mon
application ;
dans les 2 cas çà marche sous windows mais pas sous linux (testé sous
SUSE ou REDHAT) : l'image est noire !

quelqu'un a-t'il une explication ?

merci d'avance



Dans les deux cas ça passe par com.sun.image.codec.jpeg.
ImageIO est une bibliothèque générique, qui quand on fait du JPEG, passe
par com.sun.image.codec.jpeg.

Accessoirement, ImageIO fait partie de la bibliothèque de base Java, et
garantit de ne pas changer ou disparaître sans prévenir, ce qui n'est
pas le cas du codec en question (il pourrait être remplacé par un autre,
si ça chante à celui qui implémente la bibliothèque de base.)


À part ça, je n'ai pas d'explication. C'est peut-être un bug connu, de
Java, de X11, de la façon qu'a Java de gérer X11, des extensions 3D ou
damage, ou je ne sais quoi. Ça a peut-être été réparé dans une version
récente de Java. Mais je doute que ça ait un rapport avec la
bibliothèque utilisée pour enregistrer en JPEG. À vérifier avec du PNG,
ou en réaffichant la même image à côté.

--
Mayeul



--
Christian Laborde
La Révolution citoyenne, c'est sur : http://c.lab.over-blog.com/
Le forum des électrons libres :
http://electrons-libres.forumactif.fr
Les citoyens qui voient Net : http://www.netoyens.info
True E-mail : remove -no-spam-
Sentier des Vinches
CH 1091 Grandvaux
Suisse
Avatar
jmtrg
On 22 mar, 10:15, Christian Laborde
wrote:
Il faudrait avoir déjà un exemple de code pour répondre à
cette question.
A+

Mayeul a écrit :



> Jean-Marie wrote:
>> bonjour

>> j'ai utilisé 2 librairies différentes (ImageIO et
>> com.sun.image.codec.jpeg)
>> pour enregistrer au format JPG une image de la fenêtre de mon
>> application ;
>> dans les 2 cas çà marche sous windows mais pas sous linux (testé sous
>> SUSE ou REDHAT) : l'image est noire !

>> quelqu'un a-t'il une explication ?

>> merci d'avance

> Dans les deux cas ça passe par com.sun.image.codec.jpeg.
> ImageIO est une bibliothèque générique, qui quand on fait du JPEG , passe
> par com.sun.image.codec.jpeg.

> Accessoirement, ImageIO fait partie de la bibliothèque de base Java, et
> garantit de ne pas changer ou disparaître sans prévenir, ce qui n'e st
> pas le cas du codec en question (il pourrait être remplacé par un a utre,
> si ça chante à celui qui implémente la bibliothèque de base.)

> À part ça, je n'ai pas d'explication. C'est peut-être un bug conn u, de
> Java, de X11, de la façon qu'a Java de gérer X11, des extensions 3D ou
> damage, ou je ne sais quoi. Ça a peut-être été réparé dans une version
> récente de Java. Mais je doute que ça ait un rapport avec la
> bibliothèque utilisée pour enregistrer en JPEG. À vérifier avec du PNG,
> ou en réaffichant la même image à côté.

> --
> Mayeul

--
Christian Laborde
La Révolution citoyenne, c'est sur :http://c.lab.over-blog.com/
Le forum des électrons libres :http://electrons-libres.forumactif.fr
Les citoyens qui voient Net :http://www.netoyens.info
True E-mail : remove -no-spam-
Sentier des Vinches
CH 1091 Grandvaux
Suisse



ci-joint le code :
Dimension dim = parentframe.getSize();
BufferedImage bi = new BufferedImage
(dim.width,dim.height,BufferedImage.TYPE_INT_BGR);
Graphics bg = bi.getGraphics();
parentframe.paintAll(bg); // avec la barre de menu et le cadre
// recherche de la meilleure qualité
Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
if (iter.hasNext()) {
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
float values[] = iwp.getCompressionQualityValues();
// Write one for each compression values
float maxvalue=Float.MIN_VALUE;
for (int i = 0, n = values.length; i < n; i++) {
maxvalue=Math.max(maxvalue, values[i]);
}
iwp.setCompressionQuality(maxvalue);

File outFile = new File(_filename);
FileImageOutputStream output = new FileImageOutputStream(
outFile);
writer.setOutput(output);
IIOImage image = new IIOImage(bi, null, null);
writer.write(null, image, iwp);
}

Jean-Marie
Avatar
jmtrg
On 23 mar, 09:38, wrote:
On 22 mar, 10:15, Christian Laborde
wrote:



> Il faudrait avoir déjà un exemple de code pour répondre à
> cette question.
> A+

> Mayeul a écrit :

> > Jean-Marie wrote:
> >> bonjour

> >> j'ai utilisé 2 librairies différentes (ImageIO et
> >> com.sun.image.codec.jpeg)
> >> pour enregistrer au format JPG une image de la fenêtre de mon
> >> application ;
> >> dans les 2 cas çà marche sous windows mais pas sous linux (test é sous
> >> SUSE ou REDHAT) : l'image est noire !

> >> quelqu'un a-t'il une explication ?

> >> merci d'avance

> > Dans les deux cas ça passe par com.sun.image.codec.jpeg.
> > ImageIO est une bibliothèque générique, qui quand on fait du JP EG, passe
> > par com.sun.image.codec.jpeg.

> > Accessoirement, ImageIO fait partie de la bibliothèque de base Java , et
> > garantit de ne pas changer ou disparaître sans prévenir, ce qui n 'est
> > pas le cas du codec en question (il pourrait être remplacé par un autre,
> > si ça chante à celui qui implémente la bibliothèque de base.)

> > À part ça, je n'ai pas d'explication. C'est peut-être un bug co nnu, de
> > Java, de X11, de la façon qu'a Java de gérer X11, des extensions 3D ou
> > damage, ou je ne sais quoi. Ça a peut-être été réparé dan s une version
> > récente de Java. Mais je doute que ça ait un rapport avec la
> > bibliothèque utilisée pour enregistrer en JPEG. À vérifier av ec du PNG,
> > ou en réaffichant la même image à côté.

> > --
> > Mayeul

> --
> Christian Laborde
> La Révolution citoyenne, c'est sur :http://c.lab.over-blog.com/
> Le forum des électrons libres :http://electrons-libres.forumactif.fr
> Les citoyens qui voient Net :http://www.netoyens.info
> True E-mail : remove -no-spam-
> Sentier des Vinches
> CH 1091 Grandvaux
> Suisse

ci-joint le code :
            Dimension dim = parentframe.getSize();
            BufferedImage bi = new BufferedImage
(dim.width,dim.height,BufferedImage.TYPE_INT_BGR);
            Graphics bg = bi.getGraphics();
            parentframe.paintAll(bg);           // avec la barre de menu et le cadre
            // recherche de la meilleure qualité
        Iterator iter = ImageIO.getImageWritersByFormatName("JP G");
        if (iter.hasNext()) {
            ImageWriter writer = (ImageWriter) iter.next();
            ImageWriteParam iwp = writer.getDefaultWritePar am();
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLI CIT);
            float values[] = iwp.getCompressionQualityValue s();
            // Write one for each compression values
            float maxvalue=Float.MIN_VALUE;
            for (int i = 0, n = values.length; i < n; i++ ) {
                maxvalue=Math.max(maxvalue, values[i]);
            }
            iwp.setCompressionQuality(maxvalue);

            File outFile = new File(_filename);
            FileImageOutputStream output = new FileImageOut putStream(
                    outFile);
            writer.setOutput(output);
            IIOImage image = new IIOImage(bi, null, null);
            writer.write(null, image, iwp);
        }

Jean-Marie



le problème est identique avec le format PNG
Avatar
Mayeul
wrote:

le problème est identique avec le format PNG



Autrement dit ça ne vient pas du format de sortie.

Je ne suis pas sûr qu'on puisse appeler les méthodes paint() soi-même
(ou ailleurs que dans update(),) avec son propre objet Graphics. C'est
vrai que la javadoc ne dit rien contre ça, et a priori je ne vois pas
pourquoi ça ne marcherait pas, mais je ne suis pas sûr que ça soit un
usage prévu.

Si je voulais faire un screenshot, j'utiliserais plutôt Robot :


Point origin = parentframe.getLocationOnScreen();
Dimension size = parentframe.getSize();

BufferedImage image = (new Robot()).createScreenCapture(new
Rectangle(origin, size));

--
Mayeul
Avatar
jmtrg
On 23 mar, 15:16, Mayeul wrote:
wrote:

> le problème est identique avec le format PNG

Autrement dit ça ne vient pas du format de sortie.

Je ne suis pas sûr qu'on puisse appeler les méthodes paint() soi-mê me
(ou ailleurs que dans update(),) avec son propre objet Graphics. C'est
vrai que la javadoc ne dit rien contre ça, et a priori je ne vois pas
pourquoi ça ne marcherait pas, mais je ne suis pas sûr que ça soit un
usage prévu.

Si je voulais faire un screenshot, j'utiliserais plutôt Robot :

Point origin = parentframe.getLocationOnScreen();
Dimension size = parentframe.getSize();

BufferedImage image = (new Robot()).createScreenCapture(new
Rectangle(origin, size));

--
Mayeul



merci bien pour le tuyau ;
çà marche effectivement sous linux cette fois-ci ;
par contre au niveau de la qualité, le format PNG
parait nettement meilleure que le format JPG

Jean-Marie
Avatar
ownowl
a écrit :
On 23 mar, 15:16, Mayeul wrote:
wrote:

le problème est identique avec le format PNG


Autrement dit ça ne vient pas du format de sortie.

Je ne suis pas sûr qu'on puisse appeler les méthodes paint() soi-même
(ou ailleurs que dans update(),) avec son propre objet Graphics. C'est
vrai que la javadoc ne dit rien contre ça, et a priori je ne vois pas
pourquoi ça ne marcherait pas, mais je ne suis pas sûr que ça soit un
usage prévu.

Si je voulais faire un screenshot, j'utiliserais plutôt Robot :

Point origin = parentframe.getLocationOnScreen();
Dimension size = parentframe.getSize();

BufferedImage image = (new Robot()).createScreenCapture(new
Rectangle(origin, size));

--
Mayeul



merci bien pour le tuyau ;
çà marche effectivement sous linux cette fois-ci ;
par contre au niveau de la qualité, le format PNG
parait nettement meilleure que le format JPG

Jean-Marie



c'est normal, png est utilise un algo de compression sans perte (tout
comme gif). Par contre utiliser png pour des images de type photo avec
moulte détails génère des fichiers potentiellement beaucoup plus gros
que jpeg

Olivier
Avatar
Mayeul
wrote:
On 23 mar, 15:16, Mayeul wrote:
wrote:

le problème est identique avec le format PNG


Autrement dit ça ne vient pas du format de sortie.

Je ne suis pas sûr qu'on puisse appeler les méthodes paint() soi-même
(ou ailleurs que dans update(),) avec son propre objet Graphics. C'est
vrai que la javadoc ne dit rien contre ça, et a priori je ne vois pas
pourquoi ça ne marcherait pas, mais je ne suis pas sûr que ça soit un
usage prévu.

Si je voulais faire un screenshot, j'utiliserais plutôt Robot :

Point origin = parentframe.getLocationOnScreen();
Dimension size = parentframe.getSize();

BufferedImage image = (new Robot()).createScreenCapture(new
Rectangle(origin, size));



merci bien pour le tuyau ;
çà marche effectivement sous linux cette fois-ci ;
par contre au niveau de la qualité, le format PNG
parait nettement meilleure que le format JPG




Vu la méthode que vous utilisez pour trouver la "meilleure qualité" en
enregistrement JPEG, ça ne me surprend guère.

Je ne sais pas vraiment comment régler ça, les réglages par défaut m'ont
toujours bien convenu, mais je suis certain qu'il n'est pas nécessaire
d'itérer sur des ImageWriter.

Je suppose que les enregistrements PNG, eux, se feront toujours sans
perte, donc avec le même résultat.

--
Mayeul