2013-03-25 3 views
0

원본 이미지가 있습니다.마스크를 사용하여 이미지 픽셀 가져 오기

특정 마스크를 사용하여이 이미지의 일부분을 표시해야합니다. 마스크는 사각형이나 도형이 아닙니다. 그것은 다른 다각형과 모양을 포함합니다.

구현 방법이나 튜토리얼이 있습니까? 아니면 어디서부터 시작해야할까요? 작은 쉐이더를 작성하거나 이미지의 적절한 픽셀 또는 이와 비슷한 것을 비교해 볼까요?

어떤 조언이 좋을까요?

감사합니다

답변

3

당신은 myMaskLayer 자신의 인스턴스되어야있는 UIImageView에 이미지를 넣어 사용자 정의 모양을 그리려면

myImageView.layer.mask = myMaskLayer; 

처럼 뭔가 그 이미지보기에 마스크를 추가 할 수 있습니다 drawInContext 메서드를 구현하는 CALayer의 하위 클래스입니다. 이 방법은 전체 알파를 사용하여 이미지에 표시 할 영역을 그리고 알파를 0으로 숨길 영역을 그려야합니다 (원하는 경우 알파 사이에 사용할 수도 있음).

@interface MyMaskLayer : CALayer 
@end 

@implementation MyMaskLayer 
- (void)drawInContext:(CGContextRef)ctx { 
    static CGColorSpaceRef rgbColorSpace; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
    }); 

    const CGRect selfBounds = self.bounds; 
    CGContextSetFillColorSpace(ctx, rgbColorSpace); 
    CGContextSetFillColor(ctx, (CGFloat[4]){0.0, 0.0, 0.0, 0.0}); 
    CGContextFillRect(ctx, selfBounds); 
    CGContextSetFillColor(ctx, (CGFloat[4]){0.0, 0.0, 0.0, 1.0}); 
    CGContextFillEllipseInRect(ctx, selfBounds); 
} 
@end 

그러한 마스크를 적용 : 여기에 표시되는 화상보기 마스크로서 사용하면 화상의 왼쪽 상단 만 타원 영역을 일으킬 것이다의 CALayer 서브 클래스의 예시적인 구현이다 당신이 픽셀 버퍼를 제어 비트 맵을 기본으로하는 CGContext로 렌더링하는 것이 가장 좋습니다 이런 렌더링에서 픽셀 데이터를 얻으려면 이미지보기로 레이어, 당신은 지금이

MyMaskLayer *maskLayer = [[MyMaskLayer alloc] init]; 
maskLayer.bounds = self.view.bounds; 
[maskLayer setNeedsDisplay]; 
self.imageView.layer.mask = maskLayer; 

과 같은 코드를 사용할 수 있습니다 . 렌더링 후에 버퍼의 픽셀 데이터를 검사 할 수 있습니다. 다음은 비트 맵 컨텍스트를 만들고 해당 비트 맵 컨텍스트에 레이어와 마스크를 렌더링하는 예제입니다. 픽셀 데이터 용으로 자체 버퍼를 제공하기 때문에 렌더링 후 RGBA 값을 얻기 위해 버퍼에서 파고들 수 있습니다.

const CGRect imageViewBounds = self.imageView.bounds; 
const size_t imageWidth = CGRectGetWidth(imageViewBounds); 
const size_t imageHeight = CGRectGetHeight(imageViewBounds); 
const size_t bytesPerPixel = 4; 
// Allocate your own buffer for the bitmap data. You can pass NULL to 
// CGBitmapContextCreate and then Quartz will allocate the memory for you, but 
// you won't have a pointer to the resulting pixel data you want to inspect! 
unsigned char *bitmapData = (unsigned char *)malloc(imageWidth * imageHeight * bytesPerPixel); 
CGContextRef context = CGBitmapContextCreate(bitmapData, imageWidth, imageHeight, 8, bytesPerPixel * imageWidth, rgbColorSpace, kCGImageAlphaPremultipliedLast); 
// Render the image into the bitmap context. 
[self.imageView.layer renderInContext:context]; 
// Set the blend mode to destination in, pixels become "destination * source alpha" 
CGContextSetBlendMode(context, kCGBlendModeDestinationIn); 
// Render the mask into the bitmap context. 
[self.imageView.layer.mask renderInContext:context]; 
// Whatever you like here, I just chose the middle of the image. 
const size_t x = imageWidth/2; 
const size_t y = imageHeight/2; 
const size_t pixelIndex = y * imageWidth + x; 
const unsigned char red = bitmapData[pixelIndex]; 
const unsigned char green = bitmapData[pixelIndex + 1]; 
const unsigned char blue = bitmapData[pixelIndex + 2]; 
const unsigned char alpha = bitmapData[pixelIndex + 3]; 
NSLog(@"rgba: {%u, %u, %u, %u}", red, green, blue, alpha); 
+0

정말 고맙습니다. 픽셀을 표시하는 것은 어떻습니까? –

+0

@George 문제 없습니다. 이 같은 설정에서 픽셀 데이터를 추출하기위한 샘플 코드를 추가했습니다. –

+0

내 하루를 구했거나 하루 이상을 절약했다고 ​​생각합니다. :) –

관련 문제