2012-12-01 2 views
2

컨텍스트 내부에 사각형에 해당하는 CGImage을 만드는 방법이 있는지 궁금합니다. 컨텍스트에서 서브 이미지 만들기

내가 지금 뭐하는 거지 : 나는 상황에서 CGImage를 만들 CGBitmapContextCreateImage을 사용하고

. 그런 다음 서브 이미지를 추출하려면 CGImageCreateWithImageInRect을 사용합니다.

아닐

답변

4

이 시도 :

static CGImageRef createImageWithSectionOfBitmapContext(CGContextRef bigContext, 
    size_t x, size_t y, size_t width, size_t height) 
{ 
    uint8_t *data = CGBitmapContextGetData(bigContext); 
    size_t bytesPerRow = CGBitmapContextGetBytesPerRow(bigContext); 
    size_t bytesPerPixel = CGBitmapContextGetBitsPerPixel(bigContext)/8; 
    data += x * bytesPerPixel + y * bytesPerRow; 
    CGContextRef smallContext = CGBitmapContextCreate(data, 
     width, height, 
     CGBitmapContextGetBitsPerComponent(bigContext), bytesPerRow, 
     CGBitmapContextGetColorSpace(bigContext), 
     CGBitmapContextGetBitmapInfo(bigContext)); 
    CGImageRef image = CGBitmapContextCreateImage(smallContext); 
    CGContextRelease(smallContext); 
    return image; 
} 

나이 :

static CGImageRef createImageWithSectionOfBitmapContext(CGContextRef bigContext, 
    size_t x, size_t y, size_t width, size_t height) 
{ 
    uint8_t *data = CGBitmapContextGetData(bigContext); 
    size_t bytesPerRow = CGBitmapContextGetBytesPerRow(bigContext); 
    size_t bytesPerPixel = CGBitmapContextGetBitsPerPixel(bigContext)/8; 
    data += x * bytesPerPixel + y * bytesPerRow; 
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data, 
     height * bytesPerRow, NULL); 
    CGImageRef image = CGImageCreate(width, height, 
     CGBitmapContextGetBitsPerComponent(bigContext), 
     CGBitmapContextGetBitsPerPixel(bigContext), 
     CGBitmapContextGetBytesPerRow(bigContext), 
     CGBitmapContextGetColorSpace(bigContext), 
     CGBitmapContextGetBitmapInfo(bigContext), 
     provider, NULL, NO, kCGRenderingIntentDefault); 
    CGDataProviderRelease(provider); 
    return image; 
} 
+0

그건 꽤 우아한 해결책이고 내 경우에는 효과가 있습니다! 감사. –

+0

첫 번째 기능에 버그가있었습니다. 나는 그것을 고쳤다. 아마 두 번째 기능을 사용하고 있었을 것입니다. –

+0

첫 번째 기능을 사용하고있었습니다. 그래, 그 벌레를 보았지 만, 그 주된 생각은 내가 빌린 것이었다. 감사! 나는 한 가지를 지적해야합니다. 나는 이전의 구현 (질문에서 언급 한 바와 같이)과 사용자 경험 측면에서 많은 차이를 볼 수 없었다. 아마도 병목 현상이 다른 곳에서 발생했을 것입니다. –

0

here 언급 한 바와 같이 다음과 같이 예를 들어

, 자른 이미지를 만들 수 있습니다 : -

UIImage *image = //original image 
CGRect rect = //cropped rect 
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect); 
UIImage *img = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 

당신이 위의 코드를 사용하는 상황에서의 CGImage를 얻을 필요 그것을 자르십시오. 질문에서 언급 한대로 CGBitmapContextCreateImage을 사용할 수 있습니다. 여기에 the documentation.

+0

나는'CGContext'에서 이미지 데이터를 가지고있다. 그 문맥 안의 직사각형 영역에서 이미지를 만들고 싶습니다. UIImage 내부가 아닌. –

+0

그럴 경우 먼저 CGImage를 만든 다음 위의 코드를 사용하여 자르기해야합니다. – iDev

+0

오버 헤드가 많은 것처럼 보입니다. 그렇지 않니? 실시간으로 터치 나 비슷한 것을 기반으로 컨텍스트를 동적으로 변경하려면 경험이 저하되는 경향이 있습니다. –

0

할당 한 버퍼로 CGBitmapContext를 만들고 동일한 버퍼를 사용하여 처음부터 CGImage를 만들 수 있습니다. 컨텍스트와 버퍼를 공유하는 이미지를 사용하여 컨텍스트에 그려 넣은 다음 마스터 이미지의 해당 섹션을 사용하여 CGImage를 만들 수 있습니다.

나중에 동일한 컨텍스트를 그리면 잘린 이미지가 실제로 변경 사항을 인식 할 수 있습니다 (복사 대신 공유 대신 참조가 내부적으로 진행되는 정도에 따라 다름). 당신이하고있는 것에 따라, 당신은 이것이 바람직 할 수도 있고 그렇지 않을 수도 있습니다.

+0

'CGImage'는 변경할 수 없습니다. 하나를 만들면 비트 맵 데이터의 개인 복사본을 만듭니다. –