2009-07-17 7 views
5

Quelle est la bonne façon de convertir tableau brut d'octets en image dans Java SE. Le tableau est constitué d'octets, où chaque octet représente un pixel, avec chaque octet pour le composant RVB correspondant.Comment faire pour convertir le tableau d'octets en image dans Java SE

Quelqu'un peut-il suggérer un échantillon de code?

Merci, Mike

+0

Finalement, Je ne trouve pas quelque chose de mieux: \t \t \t for (int y = 0; y Ma99uS

+0

Quelles sont les dimensions du tableau d'octets? Est-ce un tableau à une dimension, un tableau à deux dimensions ou un tableau à trois dimensions? –

Répondre

6

Supposons que vous connaître la hauteur et la largeur de l'image.

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
for(int r=0; r<height; r++) 
for(int c=0; c<width; c++) 
{ 
    int index=r*width+c; 
    int red=colors[index] & 0xFF; 
    int green=colors[index+1] & 0xFF; 
    int blue=colors[index+2] & 0xFF; 
    int rgb = (red << 16) | (green << 8) | blue; 
    img.setRGB(c, r, rgb); 
} 

Approximativement. Cela suppose que les données de pixel sont codées sous la forme d'un ensemble de lignes; et que la longueur des couleurs est 3 * largeur * hauteur (qui devrait être valide).

+0

donc itérer à travers le tableau est ma meilleure option ici? Il estime qu'il doit y avoir une méthode qui accepte array comme un paramètre et remplit/recréer l'image en une seule fois. Peut-être quelque chose à voir avec la classe Raster? – Ma99uS

+0

Pas à ma connaissance, bien que Raster ne me soit pas familier. Si cela a suivi un format d'image standard, vous pouvez utiliser la classe ImageIO, mais c'est la limite de mes connaissances. – CoderTao

+1

Vous pouvez également faire: 'int rgb = ((int) couleurs [in] << 24) + ((int) couleurs [in + 1] << 8) + (int) couleurs [in]' – notnoop

1

Il existe une variante setRGB qui accepte un tableau int des valeurs RGBA:

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
int[] raw = new int[data.length * 4/3]; 
for (int i = 0; i < data.length/3; i++) { 
    raw[i] = 0xFF000000 | 
     ((data[3 * i + 0] & 0xFF) << 16) | 
     ((data[3 * i + 1] & 0xFF) << 8) | 
     ((data[3 * i + 2] & 0xFF)); 
} 
img.setRGB(0, 0, width, height, raw, 0, width); 

Les caractéristiques de performance est similaire à CoderTao solution de.

8

Vous pouvez le faire en utilisant la classe Raster. C'est mieux car il ne nécessite pas d'itération et de copie des tableaux d'octets.

byte[] raw = new byte[width*height*3]; // raw bytes of our image 
DataBuffer buffer = new DataBufferByte(raw, raw.length); 

//The most difficult part of awt api for me to learn 
SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, width, height, 3, width*3, new int[]{2,1,0}); 

Raster raster = Raster.createRaster(sampleModel, buffer, null); 

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); 
image.setData(raster); 
+0

Merci d'avoir posté cela. Il est vraiment utile! –

2

approche de folkyatina fonctionne si vos valeurs RVB sont en B, G, ordre R, mais si elles sont en R, G, B ordre que j'ai trouvé le code suivant au travail:

DataBuffer rgbData = new DataBufferByte(rgbs, rgbs.length); 

    WritableRaster raster = Raster.createInterleavedRaster(
     rgbData, width, height, 
     width * 3, // scanlineStride 
     3, // pixelStride 
     new int[]{0, 1, 2}, // bandOffsets 
     null); 

    ColorModel colorModel = new ComponentColorModel(
     ColorSpace.getInstance(ColorSpace.CS_sRGB), 
     new int[]{8, 8, 8}, // bits 
     false, // hasAlpha 
     false, // isPreMultiplied 
     ComponentColorModel.OPAQUE, 
     DataBuffer.TYPE_BYTE); 

    return new BufferedImage(colorModel, raster, false, null); 
Questions connexes