2012-01-02 4 views

ответ

3

Я не уверен, что вы хотите обрезать, но вместо этого вы хотите замаскировать изображение. Это довольно легко сделать, но в конечном итоге вы обнаружите, что оно работает для некоторых изображений, а не для других. Это связано с тем, что вам нужно иметь надлежащий альфа-канал в изображении.

Вот код, который я использую, который я получил от stackoverflow. (Problem with transparency when converting UIView to UIImage)

CGImageRef CopyImageAndAddAlphaChannel(CGImageRef sourceImage) { 
CGImageRef retVal = NULL; 

size_t width = CGImageGetWidth(sourceImage); 
size_t height = CGImageGetHeight(sourceImage); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 
                 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); 

if (offscreenContext != NULL) { 
    CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage); 

    retVal = CGBitmapContextCreateImage(offscreenContext); 
    CGContextRelease(offscreenContext); 
} 

CGColorSpaceRelease(colorSpace); 

return retVal; 
} 

- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 
CGImageRef maskRef = maskImage.CGImage; 
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef sourceImage = [image CGImage]; 
CGImageRef imageWithAlpha = sourceImage; 
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...) 
//this however has a computational cost 
// needed to comment out this check. Some images were reporting that they 
// had an alpha channel when they didn't! So we always create the channel. 
// It isn't expected that the wheelin application will be doing this a lot so 
// the computational cost isn't onerous. 
//if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) { 
imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage); 
//} 

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 
CGImageRelease(mask); 

//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel 
if (sourceImage != imageWithAlpha) { 
    CGImageRelease(imageWithAlpha); 
} 

UIImage* retImage = [UIImage imageWithCGImage:masked]; 
CGImageRelease(masked); 

return retImage; 
} 

И вы называете это так:

customImage = [customImage maskImage:customImage withMask:[UIImage imageNamed:@"CircularMask.png"]]; 

В этом случае я использую круглую маску, чтобы сделать круглое изображение. Вам нужно будет сделать нерегулярную маску, которая соответствует вашим потребностям.

+0

спасибо за ваш повтор, но моя проблема в другом. У меня есть 4 разных точки, например, трапеция. Пользователь также может изменить эту точку и сделать форму собственным стилем. Теперь я хочу обрезать изображение как ту же форму, которую пользователь создал точка драки –

+0

Можете ли вы взять 4 очка, отнести их к маске, а затем использовать приведенный выше код? –

+0

жаль, что я новичок в разработке IOS. Я не могу понять вашу точку зрения. Например, у меня есть четыре точки CGPoint firstPoint, secondPoint, thirdPoint и 4thPoint трапеции, а затем как я использую приведенный выше код. Спасибо –

Смежные вопросы