Я постараюсь придерживаться как можно ближе к тому, что у вас уже есть. Итак, я предполагаю, что вы ищете способ обработки на уровне пикселей на Image
, а не просто метод, который работает для преобразования в оттенки серого.
Первый шаг - вам нужно, чтобы изображение было BufferedImage
. Это то, что вы получаете по умолчанию от ImageIO
, но если у вас есть какой-то другой тип изображения, вы можете создать BufferedImage
и сначала нарисовать в нем другое изображение:
BufferedImage buffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffer.createGraphics();
g.drawImage(image, 0, 0);
g.dispose()
Затем вы можете работать с пикселями следующим образом:
public void makeGrey(BufferedImage image) {
for(int x = 0; x < image.getWidth(); ++x) {
for(int y = 0; y < image.getHeight(); ++y) {
Color c1 = new Color(image.getRGB(x, y));
int grey = (int)(c1.getRed() * 0.3
+ c1.getGreen() * 0.59
+ c1.getBlue() * .11
+ .5);
Color newGrey = new Color(grey, grey, grey);
image.setRGB(x, y, newGrey.getRGB());
}
}
}
Обратите внимание, что этот код ужасно медленный. Гораздо более быстрый вариант - извлечь все пиксели из BufferedImage в int[]
, обработать его, а затем установить обратно в изображение. При этом используются другие версии методов setRGB()
/ getRGB()
, которые вы найдете в javadoc.