Проход по пикселям изображения приводит к сбою моей программы

1

Я начал работать в небольшом программном обеспечении для обработки изображений. В настоящее время мне просто нужно установить изображение в черно-белое и пропустить его пиксели и создать отчет счетчика, координат и цвета каждого пикселя (#, x, y, color).

Он отлично работает с крошечными изображениями, которые я создаю для тестирования, но когда я использую реальную картинку, это занимает несколько минут или даже сбой моего программного обеспечения. Мой код внутри цикла кажется простым в сбое.

Любой совет о том, как я могу его улучшить? Заранее спасибо!

void processImage(BufferedImage image) {
        exportStr = "#,x,y,color"+ newline;     

        Color c = new Color(0);
        int imgW = image.getWidth();
        int imgH = image.getHeight();
        matrix = new int[imgW][imgH]; 

        int currentPx = 1;

        for(int x=0; x < imgW; x++) 
        {
            for(int y=0; y < imgH; y++) 
            {
                c = new Color(image.getRGB(x, y));

                if(c.equals(Color.WHITE))
                { 
                    matrix[x][y] = 1;                   
                }

                String color = matrix[x][y]==1 ? "W" : "B";
                exportStr += formatStringExport(currentPx, x, y, color); // just concatenate values
                currentPx++;
            }
        }

        return img;
}
  • 0
    Почему вы используете matrix массив? Вы также можете экспортировать строку без этого массива.
  • 0
    @Braj, эта матрица мне понадобится позже, хотя сейчас я ее не использую
Теги:
image-processing
performance
image
swing

1 ответ

3
Лучший ответ

Это, вероятно, ваша проблема

exportStr += formatStringExport(currentPx, x, y, color);

Вместо этого используйте StringBuilder:

StringBuilder sb = new StringBuilder(imgW  * imgH * <String size per pixel>);

....

sb.append(formatStringExport(currentPx, x, y, color));

Проверьте StringBuilder документацию для деталей. Кроме того, вы можете попытаться уменьшить количество создаваемых объектов. Так, например, замените:

c = new Color(image.getRGB(x, y));

String color = matrix[x][y]==1 ? "W" : "B";

от...

if(image.getRGB(x, y).equals(...))

sb.append(formatStringExport(currentPx, x, y, (matrix[x][y]==1 ? "W" : "B")));

Удачи! :)

  • 1
    StringBuilder действительно улучшил производительность. Спасибо! Так как getRGB() возвращает int, я использовал if(image.getRGB(x, y)==Color.WHITE)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню