Я начал работать в небольшом программном обеспечении для обработки изображений. В настоящее время мне просто нужно установить изображение в черно-белое и пропустить его пиксели и создать отчет счетчика, координат и цвета каждого пикселя (#, 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;
}
Это, вероятно, ваша проблема
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")));
Удачи! :)
getRGB()
возвращает int, я использовал if(image.getRGB(x, y)==Color.WHITE)
matrix
массив? Вы также можете экспортировать строку без этого массива.