2012-02-03 5 views

답변

4

CIGitmapContextCreate를 사용하지 말고 UIGraphicsBeginImageContextWithOptions를 사용하면 훨씬 쉽습니다. 이처럼 사용

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), YES, 1.0f); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

//do your drawing 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEdnImageContext(); 

//your resultant UIImage is now stored in image variable 

세 가지 매개 변수를 UIGraphicsBeginImageContext로는 다음과 같습니다

  1. 이미지의 크기는 -이 이미지 투명도가 있는지 여부는

  2. 원하는 무엇이든 될 수 있습니다

  3. 이미지의 픽셀 크기. 0.0이 기본값이므로 iPhone 3GS에서는 1.0이되고 망막 디스플레이가있는 iPhone 4에서는 2.0이됩니다. 그래도 원하는 크기로 전달할 수 있으므로, Retina 디스플레이의 1 픽셀이 화면의 실제 2x2 픽셀과 같이 5.0을 전달하면 이미지의 각 픽셀 단위가 실제로 비트 맵에서 5x5 픽셀이됩니다.

편집 : 그것은 UIGraphicsBeginImageContext()는 스레드 안전한지 여부의 질문은 조금 논란이 될 것으로 보인다 것으로 나타났다. 백그라운드 스레드에서 동시에이 작업을 수행해야하는 경우 CGBitMapContextCreate()를 사용하여 대체 방법 (다소 복잡한 방법)이 있습니다. UIGraphicsBeginImageContext vs CGBitmapContextCreate

+1

좋은 해결책이 아닙니다. UIGraphicsBeginImageContext 및 기타 UI ... 함수는 스레드 안전하지 않으며 기본 트레드에서 실행됩니다. 이 함수를 사용하면 응용 프로그램의 UI가 고정됩니다. –

+0

스레드에 관해 누가 말했습니까? 어쨌든 스레드 된 컨텍스트에서 사용해야하는 경우 UIGraphicsBeginImageContext()를 @synchronized 블록으로 래핑하고 CGContextRef를 얻은 후 실제 드로잉을 수행 할 수 있습니다. –

+0

@MartinPilch 주 스레드에서 모두 실행된다는 사실 때문에 스레드가 안전하게 만들어집니다. 그들은 오직 하나의 스레드에서만 호출됩니다 ** ** 메인 스레드 ** 그래서 스레드가 들어 가지 않습니다. – Abizern

관련 문제