2013-06-05 3 views
1

저는 앱을 개발 중이며 스레드에서 스크린 샷을 가져와야합니다. 나는 다음과 같은 코드를 사용하여이 작업을 수행 할 수없는 해요 : 사람이 중복으로이 질문을 표시하려고하면NSThread를 사용하여 UIView의 스크린 샷을 찍는 방법?

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, [[UIScreen mainScreen] scale]); 

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

을, 나는이에 대해 물어 오전이의 관심을 바랍니다 답하고 데리고 나에게 적절한 링크를 제공하십시오 스레드에서 이미지를 생성합니다.

감사합니다.

답변

9

다른 모든 답변과 달리 믿기를 바랍니다. 그건 불가능합니다. UIKit은 스레드로부터 안전하지 않으므로 아무 것도하지 않고 UI를 비트 맵으로 렌더링하는 것만으로도 작동하지 않을 수 있습니다. 당신은 내가 두려워하는 메인 스레드에서해야만합니다.

+0

네, 지금 당면하고있는 모든 시나리오가 있지만 UIView의 UIImage를 만들 수있는 방법이 없습니까? 이제 NSThread 및 NsOperation을 시도하고 - (void) performSelectorInBackground : (SEL) aSelector withObject : (id) arg 메서드를 사용합니다. 하지만 그들 모두에 대한 웹 잠금 오류가 발생하고 내 응용 프로그램이 추락합니다. –

+0

@ Jack_iPhone 아니요, 코드를 다른 스레드로 오프로드하는 방법과 상관없이 가능하지 않습니다. 스크린 샷을 취하는 비트는 주 스레드에서 수행되어야합니다. – JustSid

+0

Apple 설명서에 따르면 모든 UIKit 메서드는 주 스레드에서 호출되어야합니다. 'UIGraphicsGetImageFromCurrentImageContext' (그리고 여러분이 호출하는 다른 모든 메소드)는'UI'로 시작하므로 UIKit 메소드입니다! – lnafziger

0

스레드에서이 작업을 수행 할 수있는 방법을 제공 할 수는 없지만 사용자를 가까이에 배치 할 수는 있습니다.

보기의 크기를 픽셀 단위 (예 : 망막)로 결정한 다음 CGBitmapContextCreate을 사용하여 비트 맵 컨텍스트를 만들고 메모리를 할당 한 다음 스레드에서 모두 설정하십시오. iOS에서 BGRA를 사용하고 싶지만 (리콜 할 때)이 점을 확인하십시오 (빠른 도면에서 적절한 레이아웃 결과 사용).

이제 컨텍스트가 있으므로 기본 스레드에 블록을 게시하고 컨텍스트를 그립니다.

일단 완료되면 백그라운드 큐 (또는 스레드)에 다시 게시하여이 비트 맵을 CGImageRef로 설정하고 UIImage를 얻을 수 있습니다.

편집 : 이것은 내가 AVFoundation와 함께 사용하는 몇 가지 코드에서 가져온 것입니다 - 나는 (의미가있는 옵션에 대한 절대 참조를 찾기 위해 하드를) 확인하려고 다시 당신이 원하는 것 무엇 생각하지만 :

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // same as CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
CGContextRef newContext = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little); 

참고 나는 kCGImageAlphaNoneSkipFirst 있도록 알파에 대한 사용을했다,하지만 당신은 아마 그렇게 kCGImageAlphaFirst를 사용하고 싶을 것이다.

관련 문제