Мне нужно сделать сценарий параллельной обработки изображений в Java, идея состоит в том, чтобы разделить изображения на плитки любого размера, обработать их и собрать окончательное изображение.
На данный момент я создал функцию:
public static BufferedImage readImg (String path, int startx, int starty, int w, int h)
, который возвращает область изображения как BufferedImage, затем я обработаю его и хочу разместить эту область в правильном положении конечного изображения.
Итак, я попытался создать функцию writeImg, которая использует метод replacePixels для записи только в правильном положении без загрузки всего изображения в память:
public static void writeImg (String path, int startx, int starty, BufferedImage image){
File output = new File(path);
ImageOutputStream ios = null;
try {
ios = ImageIO.createImageOutputStream(output);
} catch (IOException e){
e.printStackTrace();
}
Iterator iter = ImageIO.getImageWritersByFormatName("JPEG");
ImageWriter writer = (ImageWriter)iter.next();
writer.setOutput(ios);
try{
if(writer.canReplacePixels(0)){
System.out.println("True");
}else{
System.out.println("False");
}
}catch (IOException e) {
e.printStackTrace();
}
ImageWriteParam param = writer.getDefaultWriteParam();
Point destinationOffset = new Point(startx,starty);
param.setDestinationOffset(destinationOffset);
try {
writer.replacePixels(image, param);
} catch (IOException e) {
e.printStackTrace();
}
}
Проблема в том, что canReplacePixels всегда устанавливается в значение false, и я понятия не имею, что я должен использовать для этого.
Изображения могут быть очень большими, поэтому невозможно загрузить все изображение в память, так как это вызовет исключение OutOfMemory.