使用蒙版获取图像像素

所以我有一些原始的形象。

我需要使用特定的蒙版来显示这个图像的一部分。 蒙版不是矩形或形状。 它包含不同的多边形和形状。

有没有任何方法或教程如何实现? 还是从哪里开始做到这一点? 我应该写一些小的着色器或比较图像的适当像素或类似的东西?

对任何build议感到高兴。

谢谢

你可以把你的图像放在一个UIImageView中,并用类似的东西添加一个蒙版到图像视图

myImageView.layer.mask = myMaskLayer; 

为了绘制自定义形状,myMaskLayer应该是您自己的CALayer子类的一个实现drawInContext方法的drawInContext 。 该方法应该绘制区域显示在图像中的完整的alpha和要隐藏的零区域(也可以在alpha之间使用,如果你喜欢的话)。 下面是CALayer子类的一个示例实现,在图像视图中用作掩码时,将只显示图像左上angular的一个椭圆形区域:

 @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 

要将这种遮罩层应用于图像视图,您可以使用这样的代码

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

现在,如果您想从像这样的渲染中获取像素数据,最好将其渲染为由控制像素缓冲区的位图支持的CGContext。 渲染后,您可以检查缓冲区中的像素数据。 这是一个例子,我创build了一个位图上下文,并将一个图层和蒙版渲染到该位图上下文中。 由于我为像素数据提供了自己的缓冲区,因此我可以在缓冲区中四处寻找渲染后的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);