Подсчитайте количество цветов изображений - PullRequest
6 голосов
/ 01 марта 2011

У меня есть три разных изображения (JPEG или BMP).Я пытаюсь предсказать сложность каждого изображения на основе количества цветов каждого.Как я мог сделать это возможным с Java?Спасибо.

ОБНОВЛЕНИЕ: Эти коды не работают .. на выходе отображается 1312 цветов, даже только красный и белый

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;

import javax.imageio.ImageIO;

public class clutters {
    public static void main(String[] args) throws IOException {

        ArrayList<Color> colors = new ArrayList<Color>();

        BufferedImage image = ImageIO.read(new File("1L.jpg"));    
        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);     
                int red   = (pixel & 0x00ff0000) >> 16;
                int green = (pixel & 0x0000ff00) >> 8;
                int blue  =  pixel & 0x000000ff;                    
                Color color = new Color(red,green,blue);     

                //add the first color on array
                if(colors.size()==0)                
                    colors.add(color);          
                //check for redudancy
                else {
                    if(!(colors.contains(color)))
                        colors.add(color);
                }
            }
        }
system.out.printly("There are "+colors.size()+"colors");
    }
}

Ответы [ 3 ]

7 голосов
/ 10 марта 2011

Код в основном правильный, но слишком сложный.Вы можете просто использовать 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 цветов, используемых в определенном изображении.Возможно, вы также захотите взглянуть на различные форматы файлов изображений и алгоритмы сжатия без потерь и с потерями.

0 голосов
/ 01 марта 2011
BufferedImage bi=ImageIO.read(...);
bi.getColorModel().getRGB(...);
0 голосов
/ 01 марта 2011

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html#getRGB%28int,%20int%29

имеет метод getRGB, который может быть полезен.Но, как вы можете видеть в этом классе.Подсчет цветов - это не тривиальная вещь, поскольку существует множество цветовых кодировок, а также есть альфа-каналы для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...