comment vous faites pour récupérer les pixels d'un objet Image et les stocker dans un byte[]?
(et vice versa si possible)
Version imprimable
comment vous faites pour récupérer les pixels d'un objet Image et les stocker dans un byte[]?
(et vice versa si possible)
Dans un int[] plutot si tu veux envoyer l'image/bitmap telle qu'elle. Tout simplement avec la version longue de BufferedImage.getRGB(x, y, ...). Ou en itérant sur la taille de l'image et en utilisant la version courte de la méthode.
Pour un byte[] ca serait avec la forme compressée de l'image : sauvegarder l'image dans un fichier temporaire ou un ByteArrayOutputstream au format png et mettre le contenu de ce fichier/flux dans un byte[]. Sur le client utiliser le procédé inverse pour décoder l'image.
Le 2nd cas peut-être intéressant car la forme compressée de l'image prend nettement moins de place.
ok, j'avais deja testé avec getRGB mais bizzarement, ca me donne un tableau de 0.
Je comprend pas trop comment m'y prendre avec le ByteArrayInputStream.
Si t'as un exemple concret ca m'aiderai beaucoup
Aurais-tu mis scansize à 0 ? Pour une récupération complète de l'image : taille du tableau = h*w, offset = 0, scansize = w.Citation:
ca me donne un tableau de 0.
Un truc comme ca (pas testé) :Citation:
Si t'as un exemple concret ca m'aiderai beaucoup
Code:
1
2
3
4
5
6
7 import java.io.*; import javax.imageio.*; ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.writeImage(image, 'png", out); byte[] bytes = out.toByteArray();
write(RenderedImage im, String formatName, OutputStream output)
cela suppose que image est de type RenderedImage. Je n'ai qu'un simple objet java.awt.Image.Code:
1
2 ImageIO.writeImage(image, 'png", out);
ImageRendered est une interface, j'y comprend rien lol
un peu plus d'aide stp
Si ton image est une instance de BufferedImage ou de RenderedImage) alors => cast !
(Note : BufferedImage hérite de RenderedImage).
Sinon créer une nouvelle BufferedImage et recopier l'image originale dedans avec graphics.drawIlmage().
C'est pas bien dur !!!! :lol:
ok thx :)
Une fonction vite-faite, pas optimisée :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 public static BufferedImage toBufferedImage(Image source) throws IllegalArgumentException { if (source == null) { return null; } else if (source instanceof BufferedImage) { return (BufferedImage) source; } int width = source.getWidth(null); int height = source.getHeight(null); if ((width <= 0) || (height <= 0)) { throw new IllegalArgumentException("Bad size !!!"); } // Si source a de la transparence utiliser TYPE_INT_ARGB à la place. BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // Inutile dans le cas d'images opaques : met le fond de l'image à la couleur transparente. /* for (int j = 0 ; j < height ; j++) { for (int i = 0 ; i < width ; i++) { result.setRGB(i, j, 0); } } */ Graphics graphics = result.createGraphics(); graphics.drawImage(source, 0, 0, null); graphics.dispose(); return result; }