Java로 작업하고 있습니다.
"페인트 캔"도구가 Flood Fill 알고리즘을 사용하는 페인트 프로그램을 개발하고 있지만 너무 비쌉니다.알고리즘, 홍수 채우기 (깊이 우선 검색)
private int[] dx = { -1, 0, 1, 0 };
private int[] dy = { 0, 1, 0, -1 };
public void floodFill(int x, int y, Color target_color, Color replacement_color) {
Stack<Integer[]> stack = new Stack<Integer[]>();
if (imageBuffer.getRGB(x, y) == replacement_color.getRGB())
return;
stack.push(new Integer[] { x, y });
while (!stack.isEmpty()) {
Integer[] aux = stack.peek();
imageBuffer.setRGB(aux[0], aux[1], replacement_color.getRGB());
stack.pop();
for (int i = 0; i < 4; i++) {
if (imageBuffer.getRGB(aux[0] + dx[i], aux[1] + dy[i]) == target_color.getRGB())
stack.push(new Integer[] { aux[0] + dx[i], aux[1] + dy[i] });
}
}
}
누군가가 나에게이보다 효율적으로 도울 수있다 : 여기
코드인가?(1020x700 픽셀 이미지의 경우) 약 1200ms가 실행됩니다.
나는 중요한 점은 더 나은 알고리즘이 필요하다고 생각합니다. http://en.wikipedia.org/wiki/Flood_fill은 좋은 자료입니다. 당신이 만들 수있는 몇 가지 마이크로 최적화가 있습니다 (예를 들어,'replacement_color.getRGB()'가 매번 평가됩니다,'target_color.getRGB()'처럼) 그러나 나는 이것이 큰 차이를 만들 것이라고 상상하지 못합니다. –