Код в основном правильный, но слишком сложный.Вы можете просто использовать Set
и добавить к нему значение int
, так как существующие значения игнорируются.Вам также не нужно вычислять значения RGB для каждого цвета, так как значение int
, возвращаемое getRGB
, само по себе уникально:
Set<Integer> colors = new HashSet<Integer>();
BufferedImage image = ImageIO.read(new File("test.png"));
int w = image.getWidth();
int h = image.getHeight();
for(int y = 0; y < h; y++) {
for(int x = 0; x < w; x++) {
int pixel = image.getRGB(x, y);
colors.add(pixel);
}
}
System.out.println("There are "+colors.size()+" colors");
«Странное» количество цветов, которое вы получаетеиз-за сжатия изображения (JPEG в вашем примере) и, возможно, других причин, таких как сглаживание вашего программного обеспечения для редактирования изображений.Даже если вы рисуете только красным и белым, получающееся изображение может содержать много цветов между этими двумя значениями по краям.
Это означает, что код вернет число real цветов, используемых в определенном изображении.Возможно, вы также захотите взглянуть на различные форматы файлов изображений и алгоритмы сжатия без потерь и с потерями.