2015-04-15 3 views
1

Как я писал в названии, я хотел бы понять, как создать несколько изображений из массива, содержащего байты. Это то, что было написано до сих порСоздайте набор файлов изображений из байт-матрицы

 BufferedImage arrayImage[] = new BufferedImage [depthV]; 
     int arrayIndex = 0; 
     for (int z = 0; z < depthV; z++) 
     { 
      byte byteToImg[] = new byte [widthV*heightV]; 
      for (int x = 0; x < widthV; x++) 
      { 
       for (int y = 0; y < heightV; y++) 
       { 
        byteToImg[x + y] = data3D[0][z][y][x]; 
       } 
      } 
      ByteArrayInputStream byteIn = new ByteArrayInputStream(byteToImg); 
      BufferedImage finalImage= null; 
      try { 
       finalImage = ImageIO.read(byteIn); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 
      arrayImage[arrayIndex]=finalImage; 
      arrayIndex++; 
     } 
     for (int i = 0; i < arrayImage.length; i++) 
     { 
      File outputfile = new File("./Resources/tmp/image"+i+".jpg"); 
      try { 
       ImageIO.write(arrayImage[i], "jpg", outputfile); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

Функция Java заканчивается java.lang.IllegalArgumentException: изображения == NULL! Какая у меня ошибка? Как я могу избежать этой проблемы? Есть лучший способ сделать это?

+0

Заполните полное исключение. Особенно важно здесь, в какой строке было исключено исключение. – mhlz

+0

Я не могу опубликовать все исключения, это слишком долго. Существует заинтересованная строка кода: \t \t \t \t \t \t ImageIO.write (arrayImage [я], "JPG", выходной_файл); –

ответ

1

SCIFIO библиотека, в комплекте с ImageJ, могут сделать это легко:

import io.scif.gui.AWTImageTools; 
... 
byte[] bytes = new byte[width * height]; 
... 
boolean signed = false; 
BufferedImage bi = AWTImageTools.makeImage(bytes, width, height, signed); 

Исходный код для этого метода является here (который вызывает here, который вызывает here) ,

Но на самом деле вам не нужно использовать BufferedImage, если вы используете SCIFIO и/или ImageJ. См. this tutorial для примера того, как выписывать плоскости изображения.

SCIFIO можно приобрести у ImageJ Maven repository. Соответствующие pom.xml фрагменты:

<repositories> 
    <repository> 
     <id>imagej.public</id> 
     <url>http://maven.imagej.net/content/groups/public</url> 
    </repository> 
</repositories> 
... 
<dependency> 
    <groupId>io.scif</groupId> 
    <artifactId>scifio</artifactId> 
    <version>0.22.0</version> 
</dependency> 
0

Вы не можете сделать ImageIO.read для создания изображения из массива байтов. Что работает следующим образом:

public class ByteRasterImage extends BufferedImage { 

    private static final ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
    private static int[] nBits = {8}; 
    private static final ColorModel colorModel = new ComponentColorModel(cs, nBits, false, false, 
             Transparency.OPAQUE, 
             DataBuffer.TYPE_BYTE); 

    private static WritableRaster createWritableRaster(byte[] bytes, final int w, final int h) { 
     final DataBufferByte db = new DataBufferByte(new byte[][] {bytes}, bytes.length); 
     final ComponentSampleModel sm = new ComponentSampleModel(DataBuffer.TYPE_BYTE, w, h, 1, w, new int[] {0}); 
     return Raster.createWritableRaster(sm, db, new Point(0, 0)); 
    } 

    private ByteRasterImage (WritableRaster raster) { 
     super (colorModel, raster, false, null); 
    } 

    /** 
    * Create a ByteRasterImage from the given data 
    * @param bytes the data content to wrap into an image, size w * h 
    * @param w the width of the image 
    * @param h the height of the image 
    */ 
    public ByteRasterImage (byte[] bytes, int w, int h) { 
     this(createWritableRaster(bytes, w, h)); 
    } 
} 
+0

как вы предлагаете я отредактировал код это новый фрагмент кода: \t \t \t \t \t ByteRasterImage finalImage = новый ByteRasterImage (byteToImg, widthV, heightV); \t \t \t \t \t arrayImage [arrayIndex] = finalImage; \t \t \t \t \t arrayIndex ++; \t \t \t \t} \t \t \t \t для (INT I = 0; I

+0

Тогда у вас есть больше ошибок: например, индексирование неверно в 'byteToImg [x + y] = data3D [0] [z] [y] [x];': вам нужно умножить 'y' на ширину изображения. – Bram

Смежные вопросы