2010-09-08 1 views
0

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

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

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

+0

, что ваш вопрос? Вам нужна помощь для чего? Рисование прямоугольника? – vfn

+0

Мне нужна помощь для отображения обрезанного UIImage. Прямоугольник нарисован отлично. Я также получаю CGPath правильно каждый раз, когда пользователь перемещает любой из четырех концов прямоугольника. Как я могу использовать это для обрезания фона UIImage? –

ответ

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

Кажется, не работает. Мое изображение появляется только там, где находится путь, а не область, в которой проходит путь. – jjxtra

0

Позвольте мне привести код, чтобы проблема была понята лучше. В приведенном ниже коде я вижу одно и то же изображение, которое отображается на экране в ограничивающей рамке, заданной полигоном CGPath. Но вместо этого хочу скопировать исходное изображение. Проблема в CGContextClip. Я не думаю, что он работает так, как должен. Цените любые указатели.

-

> (void)drawRect:(CGRect)rect {  
> 
> 
> CGContextRef ctx = UIGraphicsGetCurrentContext(); 
> boundary = rect;  
    CGFloat w = 
> rect.size.width; CGFloat h = 
> rect.size.height; 
> CGContextTranslateCTM (ctx, w, h); 
> CGContextRotateCTM (ctx, M_PI); 
> 
> CGMutablePathRef path = CGPathCreateMutable(); 
> CGContextBeginPath (ctx); 
>   ...... 
> 
>   .... 
> // attach a 4-sided polygon via CGPath 
> CGRect pathBoundingBox = CGPathGetPathBoundingBox (path); 
> CGContextClosePath(ctx); 
> CGContextAddPath(ctx, path); 
> //CGContextClip(ctx); <-- Works if 
> //this is commented out but I see the 
> //entire image redrawn in a rectangle. Instead I would 
> //like to clip that portion. 
> CGPathRelease(path); 
> CGContextDrawImage(ctx, pathBoundingBox, [sourceImage CGImage]); // now I see the original image being redrawn in the rectangle but I want to clip out just the portion I want. 
+0

Что произойдет, если вы используете CGContextClip без pathBoundingBox (просто используйте rect вместо)? – filipe

+0

ничего. Я не вижу изображения на экране. Вот модифицированный код в следующем комментарии (только последняя часть). Он рисует пустой файл png в каталоге документов. Я знаю, что CGPath является правильным, поскольку я могу заполнить его цвет. –

+0

CGContextClosePath (ctx); \t CGContextAddPath (ctx, path); \t CGContextClip (ctx); \t CGContextDrawImage (ctx, [self frame], [sourceImage CGImage]); \t clippedImage = UIGraphicsGetImageFromCurrentImageContext(); \t UIGraphicsEndImageContext(); \t NSString * pngPath = [NSHomeDirectory() stringByAppendingPathComponent: @ "Documents/Test.png"]; \t [UIImagePNGRпредставление (clippedImage) writeToFile: pngPath atomically: YES]; –