使用掩码获取图像像素 [英] Get image pixels using mask

查看:360
本文介绍了使用掩码获取图像像素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一些原始形象。

So i have some original image.

我需要使用特定的掩码获取和显示此图像的某些部分。掩码不是矩形或形状。它包含不同的多边形和形状。

I need to get and display some part of this image using specific mask. Mask is not a rectangle or a shape. It contains different polygons and shapes.

有没有任何方法或教程如何实现?或从哪里开始做这个?我会写一些小的着色器或者比较图像的合适像素或类似的东西吗?

Are there any methods or tutorials how to implement that? Or from where to start to make this? Shall i write some small shader or compare appropriate pixels of the images or something like this?

很高兴任何建议。

谢谢

推荐答案

您可以将图片放在UIImageView并为该图像视图添加一个掩码

You can put your image in a UIImageView and add a mask to that image view with something like

myImageView.layer.mask = myMaskLayer;

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

To draw your custom shapes, myMaskLayer should be an instance of your own subclass of CALayer that implements the drawInContext method. The method should draw the areas to be shown in the image with full alpha and the areas to be hidden with zero alpha (and can also use in between alphas if you like). Here's an example implementation of a CALayer subclass that, when used as a mask on the image view, will cause only an oval area in the top left corner of the image to be shown:

@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

将此遮罩图层应用于图像视图,你可以使用这样的代码

To apply such a mask layer to an image view, you might use code like this

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

现在,如果你想从像这样的渲染中获取像素数据,最好渲染到一个CGContext由位图控制像素缓冲区的位图。您可以在渲染后检查缓冲区中的像素数据。这里有一个例子,我创建一个位图上下文并渲染一个图层和掩码到该位图上下文中。因为我为像素数据提供了自己的缓冲区,所以我可以在缓冲区中打开,在渲染后获得RGBA值。

Now, if you want to get pixel data from a rendering like this it's best to render into a CGContext backed by a bitmap where you control the pixel buffer. You can inspect the pixel data in your buffer after rendering. Here's an example where I create a bitmap context and render a layer and mask into that bitmap context. Since I supply my own buffer for the pixel data, I can then go poking around in the buffer to get RGBA values after rendering.

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);

这篇关于使用掩码获取图像像素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆