2012-03-15 3 views
4

나는 NSImage입니다. 일부 x와 y에서 픽셀에 대해 NSColor을 읽고 싶습니다. Xcode는 NSImagecolorAtX:y: 메서드가있는 것으로 보이지만 NSImage에 해당 메서드가 없다는 오류가 발생합니다. NSBitmapImageRep을 만들고 거기에서 같은 메서드를 호출하는 예제를 보았습니다. 그러나 성공적으로 NSImage를 NSBitmapImageRep으로 변환 할 수 없었습니다. NSBitmapImageRep의 픽셀은 어떤 이유로 인해 다릅니다.코코아 : NSImage의 픽셀 색상을 읽습니다.

이 작업을 수행하는 간단한 방법이 있어야합니다. 이것은 복잡 할 수 없습니다.

+1

"NSBitmapImageRep의 픽셀"은 어떻게 다릅니 까? 나는 그 방법으로 그것을 이전에했고 좋은 결과를 얻었다. – user1118321

+0

아래 Rob Keniger의 답변을 참조하십시오. NSImage의 앵커 포인트 (원점)는 왼쪽 위이고 NSBitmapImageRep은 맨 아래 왼쪽입니다. 이미지를 하나에서 다른 이미지로 변환하면 이미지 좌표가 수직으로 뒤집 힙니다. – mtmurdock

+0

[픽셀과 색상을 NSImage에서 가져 오기] (http://stackoverflow.com/questions/1994082/get-pixels-and-colours-from-nsimage) – smokris

답변

9

코드를 보지 않고 무엇이 잘못되는지 알기가 어렵습니다.

initWithData: 방법을 사용하여 이미지를 NSBitmapImageRep에 그려 넣고 이미지의 TIFFRepresentation을 전달할 수 있습니다. colorAtX:y 방법은을 사용하기 때문에

NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithData:[yourImage TIFFRepresentation]]; 
NSSize imageSize = [yourImage size]; 
CGFloat y = imageSize.height - 100.0; 
NSColor* color = [imageRep colorAtX:100.0 y:y]; 
[imageRep release]; 

참고가 y 값에 대한 조정을해야합니다

그런 다음 NSBitmapImageRep하는 방법이 아닌 NSImage있는 방법 colorAtX:y:를 사용하여 픽셀 값을 얻을 수 있습니다 좌표 시스템은 왼쪽 상단에서 시작하고 NSImage 좌표 시스템은 왼쪽 하단에서 시작합니다.

또는 픽셀이 화면에 표시되는 경우 NSReadPixel() 함수를 사용하여 현재 좌표계의 픽셀 색상을 가져올 수 있습니다.

+0

그래,이 방법을 시도하고 있지만 뭔가가 보인다. 떨어져서. NSBitmapImageRep의 좌표계가 NSImage와 다른가? 모든 것이 수직으로 뒤집힌 것처럼 보입니다. NSImage가 왼쪽 아래에서 그려지는 것처럼 보일 것입니다 (기본적으로 뷰가 기본값 임) NSBitmapImageRep가 왼쪽 상단에서 그리기 때문에 이미지가 뒤집어집니다. 나는 실제로 화면에 그림을 그리지 않아서 나는 볼 수 없다. – mtmurdock

+1

당신이 정확하다고 판단되면, 좌표가 뒤집혀집니다. 내 대답에 대한 계정 코드를 추가했습니다. –

+0

도움을 주셔서 감사합니다. 이미지를 편집하는 동안 다른 도로 블록을 만났고 변경된 NSBitmapImageRep에서 새로운 NSImage 인스턴스를 만들어야한다는 것을 알았습니다. 그래서 내 코드는 NSImage에서 NSBitmapImageRep을 생성하고, 픽셀을 읽고, 픽셀을 변경하고, 변경된 NSBitmapImageRep에서 NSImage를 만들고, 새로운 NSImage를 할당하는 선을 따라 가게되었습니다. 도와 주셔서 감사합니다! – mtmurdock

1

기능 colorAtXNSBitmapImageRep은 장치 색상 공간을 사용하지 않는 것처럼 보이므로 실제로 보는 것과 색상 값이 다를 수 있습니다. 이 코드를 사용하면 현재 장치 색 공간에서 올바른 색을 얻을 수 있습니다.

[yourImage lockFocus]; // yourImage is just your NSImage variable 
NSColor *pixelColor = NSReadPixel(NSMakePoint(1, 1)); // Or another point 
[yourImage unlockFocus]; 
+0

조금 더 자세한 정보를 제공해 주시겠습니까? '항상 정확한 색상으로 이어지지는 않습니다'는 의미는 무엇입니까? – walteronassis

+0

@walteronassis : 내 대답이 조금 바뀌 었습니다. – Ely

관련 문제