2011-01-07 2 views
2

파일 시스템에서 투명도가 적용된 이미지가 일부 있습니다 (UIImageView 개). 내 목적을 위해 나는 UIImageView에있는 이미지를 파일 시스템의 파일과 비교할 필요가있다. 그래서 나는 다음과 같은 것을합니다 :다른 바이트를 반환하는 UIImagePNGRepresentation()

NSString *directoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *imageFile = [NSString stringWithFormat:@"%@/image.png", directoryPath]; 

if ([[NSData dataWithContentsOfFile:imageFile] isEqualToData:UIImagePNGRepresentation([imageView image])]) { 
    NSLog(@"Equal"); 
} else { 
    NSString *dataDescription = [[[NSData dataWithContentsOfFile:feltFile] description] substringToIndex:100]; 
    NSString *imageDescription = [[UIImagePNGRepresentation([backgroundImageView image]) description] substringToIndex:100] 
    NSLog(@"Unequal: %@ %@", dataDescription, imageDescription); 
} 

나는 그것이 PNG 이미지라는 것을 알고 있습니다. 둘 다 설명을 인쇄 할 때 NULL입니다. 그러나 그들은 불평등합니다.

왜 이런 일이 발생합니까?

답변

5

비트 단위로 동일한 이미지를 PNG로 표현할 수 없습니다. 동일한 이미지를 인코딩하는 데는 여러 가지 방법이 있으며 인코딩간에 변경할 수있는 메타 데이터도있을 수 있습니다.

대신 픽셀 단위로 이미지를 비교할 수 있습니다. UIImage의 픽셀 데이터를 가져 오는 방법은 다음을 참조하십시오. How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

+0

다니엘 감사합니다! –

1

UIImagePNGRepresentation()은 일반적인 유형에 관계없는 형식의 이미지를 표준화 된 설정으로 PNG로 변환합니다. 여러 PNG 파일은 동일한 이미지를 인코딩 할 수 있으며 PNG로 읽을 때 연관된 메타 데이터를 잃게됩니다. 그러면 새 PNG 파일을 쓸 때 (잠재적으로 다르게) 다시 만들어집니다.

달성하려는 목표는 무엇입니까? 우리에게 알려 주시면 문제에 대한 더 나은 해결책을 제시 할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 여기에 내가 뭘하려고하는지 : 나는 md5 해시와 함께 저장되어있는 리소스 목록을 가지고 있으며,이 해시를 기반으로 선택된 이미지를 검색해야합니다. 내가 사용하는 md5 메소드에는 NSData 객체가 필요합니다. 따라서 문제 : 'NSData'가 해시 값과 같지 않으면 일치하는 리소스가 없습니다. –

+2

당신은 정교 할 수 있습니까? 새로운 이미지를 작성하는 것은 리소스 집약적이며 드물게 정답을 줄 수 있기 때문에 리소스를 찾는 방법을 다시 생각해야합니다. –

+0

고마워요 조나단 - 새 이미지를 쓰는 대신 현재 이미지를 찾고있었습니다. 난 당신의 대답과 다니엘의 내가 생각할 수있는 (별도의) 배열에 이미지의 해시를 저장해야합니다 기반으로 생각합니다. –