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);
Возможно, вам придется перепутать этот ТИП в первой строке. См. Здесь, чтобы выбрать тип вашего изображения.