отсечение UIImage согласно многоугольнику - PullRequest
0 голосов
/ 08 сентября 2010

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

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

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

1 Ответ

1 голос
/ 08 сентября 2010

Если у вас уже есть 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);
...