ПРИМЕЧАНИЕ. Это не то, о чем просил OP (поскольку он не уменьшает использование памяти), но я оставлю это здесь, так как людям нравится этот ручной подход к пикселям,Вместо этого я покажу, как точно рассчитать цвет в градациях серого.
Это довольно просто.Идея состоит в том, чтобы перебрать каждый пиксель изображения и изменить его на эквивалент в градациях серого.
public static void makeGray(BufferedImage img)
{
for (int x = 0; x < img.getWidth(); ++x)
for (int y = 0; y < img.getHeight(); ++y)
{
int rgb = img.getRGB(x, y);
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb & 0xFF);
// Normalize and gamma correct:
float rr = Math.pow(r / 255.0, 2.2);
float gg = Math.pow(g / 255.0, 2.2);
float bb = Math.pow(b / 255.0, 2.2);
// Calculate luminance:
float lum = 0.2126 * rr + 0.7152 * gg + 0.0722 * bb;
// Gamma compand and rescale to byte range:
int grayLevel = (int) (255.0 * Math.pow(lum, 1.0 / 2.2));
int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel;
img.setRGB(x, y, gray);
}
}
Однако это не уменьшает объем памяти.Чтобы эффективно уменьшить использование памяти, выполните тот же процесс, но используйте в качестве выходных данных BufferedImage в градациях серого.