отсечение UIImage по полигону

Как я могу позволить пользователю моего приложения для iphone обрезать UIImage с помощью динамически сгенерированного CGPath. В основном я отображаю прямоугольник, наложенный на UIImageView, и пользователь может перемещать 4 угла прямоугольника, чтобы получить многоугольник с 4 сторонами. Прямоугольник не заполнен, поэтому вы видите четыре линии, наложенные на изображение.

Пользователь должен иметь возможность вырезать все, что находится за пределами 4 строк.

Любая помощь или указатели очень ценятся.


person John Qualis    schedule 08.09.2010    source источник
comment
какой у Вас вопрос? Вам нужна помощь для чего? Рисовать прямоугольник?   -  person vfn    schedule 08.09.2010
comment
Мне нужна помощь, чтобы отобразить обрезанный UIImage. Прямоугольник рисуется нормально. Я также правильно получаю CGPath каждый раз, когда пользователь перемещает любой из 4 концов прямоугольника. Как я могу использовать это для обрезки фонового UIImage?   -  person John Qualis    schedule 08.09.2010


Ответы (1)


Если у вас уже есть CGPath, вам просто нужно использовать CGContextAddPath и CGContextClip, и после этого вы можете нарисовать свой UIImage в этом контексте. Если вы просто хотите отобразить обрезанное изображение, этот контекст может быть текущим контекстом в методе DrawRect вашего представления. Если вы действительно хотите получить обрезанные данные изображения, контекст, вероятно, будет CGBitmapContext, что-то вроде этого:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

size_t bytesPerPixel = 1;
size_t bytesPerRow = bmpWidth * bytesPerPixel;
size_t bmpDataSize = ( bytesPerRow * bmpHeight);

unsigned char *bmpData = malloc(bmpDataSize);
memset(bmpData, 0, bmpDataSize);

CGContextRef bmpCtx = CGBitmapContextCreate(bmpData, bmpWidth, bmpHeight, 8, bytesPerRow, colorSpace, kCGImageAlphaNone | kCGBitmapByteOrderDefault);

(пример кода предназначен для растрового изображения в градациях серого, потому что у меня был готов этот код, но нетрудно понять, что нужно изменить для растрового изображения RGB.)

затем, чтобы на самом деле нарисовать обрезанное изображение в контексте растрового изображения, вы должны сделать что-то вроде этого (я пишу этот код по памяти, поэтому могут быть некоторые ошибки):

// theContext could be
// UIGraphicsGetCurrentContext()
// or the bmpCtx

CGContextAddPath(theContext, yourCGPath);
CGContextClip(theContext);

// not sure you need the translate and scale...
CGContextTranslateCTM(theContext, 0, bmpHeight);
CGContextScaleCTM(theContext, 1, -1);

CGContextDrawImage(theContext, rect, yourUIImage.CGImage);
person filipe    schedule 08.09.2010
comment
Не работает. Мое изображение появляется только там, где находится путь, а не в области, вокруг которой проходит путь. - person jjxtra; 21.03.2013