Having some issues with the Raster class, I think the API could be design much more friendly
private BufferedImage filterImage(final BufferedImage bufferedImage) {
int width = bufferedImage.getWidth();
Raster raster = bufferedImage.getData();
WritableRaster writableRaster = bufferedImage.getData().createCompatibleWritableRaster();
for (int y=0; y<1000; y++) {
// logger.info("Row: "+y);
byte row[] = new byte[width];
byte writeRow[] = new byte[width];
Object elementRead = raster.getDataElements(0, y, width, 1, row);
Object elementWrite = writableRaster.getDataElements(0, y, width, 1, writeRow);
for (int i=0; i<row.length; i++) {
// int value = Byte.toUnsignedInt(row[i]);
// writeRow[i] = Integer.valueOf(value).byteValue();
writeRow[i] = row[i];
}
}
BufferedImage filteredImage = new BufferedImage(bufferedImage.getColorModel(), writableRaster, false, new Hashtable<>());
return filteredImage;
}
I try to copy bytes and it blacks out the screen instead of copying the bytes
This seems to work, kind of looks like an Eclipse, fitting being in the Eclipse IDE
private boolean toggleFilterOn = false;
private BufferedImage filterImage(final BufferedImage bufferedImage) {
int width = bufferedImage.getWidth();
Raster raster = bufferedImage.getData();
WritableRaster writableRaster = bufferedImage.getData().createCompatibleWritableRaster();
for (int y=0; y<1000; y++) {
// logger.info("Row: "+y);
int row[] = new int[width];
int writeRow[] = new int[width];
Object elementRead = raster.getDataElements(0, y, width, 1, row);
Object elementWrite = writableRaster.getDataElements(0, y, width, 1, writeRow);
for (int i=0; i<row.length; i++) {
// int value = Byte.toUnsignedInt(row[i]);
// writeRow[i] = Integer.valueOf(value).byteValue();
writeRow[i] = row[i]+50;
}
writableRaster.setDataElements(0,y,width,1, writeRow);
}
BufferedImage filteredImage = new BufferedImage(bufferedImage.getColorModel(), writableRaster, false, new Hashtable<>());
return filteredImage;
}
Updated to draw the background including the mountain only once. Less reprocessing and capitalizing on processing that has already completed can be powerful. Had an issue where setData on BufferedImage was not working as fast. The following seems to work faster.
public static BufferedImage copyImage(final BufferedImage bufferedImage) {
// Appears to work faster than setData at least currently
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
Raster raster = bufferedImage.getData();
WritableRaster writableRaster = bufferedImage.getData().createCompatibleWritableRaster();
for (int y=0; y<height; y++) {
int row[] = new int[width];
int writeRow[] = new int[width];
raster.getDataElements(0, y, width, 1, row);
writableRaster.setDataElements(0,y,width,1, row);
}
BufferedImage filteredImage = new BufferedImage(bufferedImage.getColorModel(), writableRaster, false, new Hashtable<>());
return filteredImage;
}