Как преобразовать массив байтов в изображение в Java SE - PullRequest
5 голосов
/ 17 июля 2009

Как правильно преобразовать необработанный массив байтов в Image в Java SE. массив состоит из байтов, где каждые три байта представляют один пиксель с каждым байтом для соответствующего компонента RGB.

Кто-нибудь может предложить пример кода?

Спасибо, Mike

Ответы [ 4 ]

8 голосов
/ 07 октября 2010

Вы можете сделать это с помощью класса Растр. Это лучше, потому что не требует итерации и копирования байтовых массивов.

 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);
6 голосов
/ 17 июля 2009

Предполагая, что вы знаете высоту и ширину изображения.

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);
}

Грубо. Это предполагает, что данные пикселей кодируются как набор строк; и что длина цветов равна 3 * ширина * высота (которая должна быть действительной).

2 голосов
/ 28 мая 2016
Подход

Folkyatina работает, если ваши значения RGB в порядке B, G, R, но если они в порядке R, G, B, я нашел следующий код для работы:

    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);
1 голос
/ 17 июля 2009

Существует вариант setRGB, который принимает массив значений 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);

Характеристики производительности аналогичны решению CoderTao .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...