Java Преобразование байтового массива PPM в изображение JPG

В настоящее время работает над манипулированием изображениями в Java

У меня есть байт array(PPM) размером 921600 (640*480*3)

byte[] image; // PPM

BufferedImage image = ImageIO.read(new ByteArrayInputStream(image));

изображение является нулевым.

Пробовал с ImageMagic а также JAI библиотеки. Но это не помогает мне.

Можно ли получить компоненты RGB из байтового массива и преобразовать его в файл JPG.

Любая помощь приветствуется.

1 ответ

Ниже приведен код (который преобразует PPM(байтовый массив в буферизованное изображение, и вы можете сохранить буферизованное изображение в файл)

// вызов метода

BufferedImage image = ppm(width, height, 255, byte[]);

// Определение метода

static public BufferedImage ppm(int width, int height, int maxcolval, byte[] data){
        if(maxcolval<256){
            BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            int r,g,b,k=0,pixel;
            if(maxcolval==255){                                      // don't scale
                for(int y=0;y<height;y++){
                    for(int x=0;(x<width)&&((k+3)<data.length);x++){
                        r=data[k++] & 0xFF;
                        g=data[k++] & 0xFF;
                        b=data[k++] & 0xFF;
                        pixel=0xFF000000+(r<<16)+(g<<8)+b;
                        image.setRGB(x,y,pixel);
                    }
                }
            }
            else{
                for(int y=0;y<height;y++){
                    for(int x=0;(x<width)&&((k+3)<data.length);x++){
                        r=data[k++] & 0xFF;r=((r*255)+(maxcolval>>1))/maxcolval;  // scale to 0..255 range
                        g=data[k++] & 0xFF;g=((g*255)+(maxcolval>>1))/maxcolval;
                        b=data[k++] & 0xFF;b=((b*255)+(maxcolval>>1))/maxcolval;
                        pixel=0xFF000000+(r<<16)+(g<<8)+b;
                        image.setRGB(x,y,pixel);
                    }
                }
            }
            return image;
        }
        else{


            BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            int r,g,b,k=0,pixel;
            for(int y=0;y<height;y++){
                for(int x=0;(x<width)&&((k+6)<data.length);x++){
                    r=(data[k++] & 0xFF)|((data[k++] & 0xFF)<<8);r=((r*255)+(maxcolval>>1))/maxcolval;  // scale to 0..255 range
                    g=(data[k++] & 0xFF)|((data[k++] & 0xFF)<<8);g=((g*255)+(maxcolval>>1))/maxcolval;
                    b=(data[k++] & 0xFF)|((data[k++] & 0xFF)<<8);b=((b*255)+(maxcolval>>1))/maxcolval;
                    pixel=0xFF000000+(r<<16)+(g<<8)+b;
                    image.setRGB(x,y,pixel);
                }
            }
            return image;
        }
    }

Вы можете использовать WritableRaster чтобы установить пиксели изображения для вас:


Для изображения в градациях серого у вас будет массив байтов, подобный этому:

byte[] arr = new byte[width * height];

Для создания изображения используйте:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
img.getRaster().setDataElements(0, 0, width, height, arr);

Для цветного изображения у вас будет такой массив:

byte[] arr = new byte[width * height * 3];

Итак, чтобы сделать изображение, используйте:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
img.getRaster().setDataElements(0, 0, width, height, arr);

Возможно, вам придется перепутать этот ТИП в первой строке. См. Здесь, чтобы выбрать тип вашего изображения.

Другие вопросы по тегам