Получить пиксели изображения с помощью маски

У меня есть оригинальное изображение.

Мне нужно получить и отобразить некоторую часть этого изображения с помощью определенной маски. Маска не является прямоугольником или формой. Он содержит различные полигоны и формы.

Есть ли методы или учебные пособия, как это реализовать? Или с чего начать это делать? Должен ли я написать небольшой шейдер или сравнить соответствующие пиксели изображений или что-то вроде этого?

Будем рады любым советам.

Спасибо

0

Решение

Вы можете поместить свое изображение в UIImageView и добавить маску к этому виду изображения с чем-то вроде

myImageView.layer.mask = myMaskLayer;

Чтобы нарисовать ваши пользовательские фигуры, myMaskLayer должен быть экземпляром вашего собственного подкласса CALayer, который реализует drawInContext метод. Метод должен рисовать области, которые будут показаны на изображении с полной альфой, и области, которые должны быть скрыты с нулевой альфой (и может также использоваться между альфами, если хотите). Вот пример реализации подкласса CALayer, который при использовании в качестве маски в представлении изображения будет отображать только овальную область в верхнем левом углу изображения:

@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, поддерживаемый битовой картой, где вы управляете пиксельным буфером. Вы можете проверить данные пикселей в вашем буфере после рендеринга. Вот пример, где я создаю растровый контекст и отображаю слой и маску в этот растровый контекст. Так как я предоставляю свой собственный буфер для данных пикселей, я могу затем покопаться в буфере, чтобы получить значения 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);
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector