2012-11-15 1 views
-1

하나의 타일에 여러 개의 타일이있는 BufferedImage이 있습니다.중복 타일 식별

내가 원하는 것은 타일이 서로 다른지 비교하여 타일이 동일한 지 확인하는 것입니다.

그럼 해시 알고리즘에서 비교할 수있는 버퍼링 된 이미지에서 각 타일의 데이터를 어떻게 추출합니까?

+0

무엇을 시도 했습니까? [읽어주세요.] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – durron597

+1

해시가 _ 충돌 할 수 있습니다. 실제 내용을 비교해야합니다. 타일을 한 번에 하나씩 실제로 생성하고 들어오는 모든 구성을 비교하여 이미 해당 데이터를 사용하고 있는지 확인해야합니다. 지금까지 무엇을 얻었습니까? –

+0

나는 그 기사에 동의하지 않는다. 내가이 사이트에 왔을 때 내가 갖고 있지 않은 지식을 찾았습니다. 시행 착오를 위해 여기에 오지 않았습니다. 내가 사용하는 해시 함수 나 데이터의 기능을 알지 못합니다. 알기. – adrix89

답변

1

MessageDigest을 사용할 수 있습니다. 페이지에서 인용 :

MessageDigest 등이 클래스는 SHA-1, SHA-256과 같은 메시지 다이제스트 알고리즘의 기능을 제공한다. 메시지 요약 은 임의의 크기의 데이터를 사용하는 보안 단방향 해시 함수이며 은 고정 길이 해시 값을 출력합니다.

이 클래스를 사용하는 예제를 검색하여 다른 해싱 알고리즘으로 해싱을 구현하는 방법을 검색 할 수 있습니다. 당신은 또한 아파치 커먼즈의 DigestUtils과 같은 간단한 라이브러리를 사용할 수 있습니다. 우리의 경우 위의 예제를 사용합니다 :

먼저 타일에 대한 데이터를 얻습니다. 타일을 만들고 rgb 값을 읽는 픽셀을 살펴 보겠습니다. 그것은 int가 될 것입니다. 메시지 다이제스트에 대해 API를 알면 바이트 배열로 만들고 다이제스트를 업데이트해야합니다. int로부터 byte 배열을 얻는 메소드를 만들 수있다. 또는 int를 문자열로 연결하고 타일의 모든 int를 나타내는 전체 문자열에 대한 전체 배열을 가져올 수 있습니다. 그 문자열로부터 바이트를 얻는다. ... 난 그냥 첫 번째 타일에 대한 시연과 난 등의 예외를 처리하지 않습니다 하드 코딩 된 값을 사용한다 참고 :

StringBuilder firstImageRGBStr=new StringBuilder(); 
for (int i=0; i<32; i++) 
for (int j=0; j<32; j++) 
    firstImageRGBStr.append(img.getRGB(i,j)); 


MessageDigest md = MessageDigest.getInstance("SHA"); 
byte[] firstImageDigest = md.digest(firstImageRGBStr.toString().getBytes()); 

는 이제 미래의 비교에 대한 첫 번째 타일의 해시로 바이트 배열을 저장 . 타일의 해시를 저장 한 후에 모든 타일에 대해 새 MessageDigest를 만들 필요는 없습니다. reset()을 사용하여 다른 타일에 메시지 다이제스트를 다시 사용할 수 있습니다.

해시를 비교하면 이제 해시가 들어있는 바이트 배열을 비교하게됩니다. MessageDigest 클래스에는 단지 isEqual() 인 두 다이제스트를 비교하는 정적 메소드가 있습니다.

2

해시를 비교하지 않으려면 이미지를 픽셀 단위로 검토하는 것이 쉽습니다.

assert imageA.getWidth() == imageB.getWidth(); 
    assert imageA.getHeight() == imageB.getHeight(); 

    for (int x = 0; x < imageA.getWidth(); x++) 
    { 
    for (int y = 0; y < imageA.getHeight(); y++) 
    { 
     assert imageA.getRGB(x, y) == imageB.getRGB(x, y); 
    } 
    } 
+0

내가 의심하는 100 만 건이 될 1024 개의 버퍼가 빠릅니다. 해시가 얼마나 빠릅니다. – adrix89

+0

@ adrix89 전에 구현 한 적이 있지만 충분히 빠릅니다. 해시를 구현 한 경우 여전히 전체 이미지를 읽을 필요가 있습니다. –

+0

우리는 모든 타일을 모든 타일과 비교하여 검사하고 있기 때문에 실제로는 틀리게 기다려주십시오. [32x32 (타일) * 1023] (타일 하나를 확인하십시오) * 1024 (모든 타일에 대해 타일을 확인합니다). 모든 유니크를 가질 때 최악의 시나리오에서 1,072,693,248 이미지입니다 .getRGP (x, y) 멋진 최적화가 가능합니다. – adrix89