2010-09-08 3 views
0

Comment autoriser l'utilisateur de mon application iphone à découper un UIImage par un CGPath généré dynamiquement? Fondamentalement, j'affiche un rectangle superposé sur un UIImageView et l'utilisateur peut déplacer les 4 coins du rectangle pour obtenir un polygone avec 4 côtés. Le rectangle n'est pas rempli de sorte que vous voyez quatre lignes superposées sur une image.écrêtage d'un UIImage selon un polygone

L'utilisateur devrait être en mesure de découper tout ce qui est en dehors des 4 lignes.

Toute aide ou pointeur est très appréciée.

+0

Quelle est votre question? Avez-vous besoin d'aide pour quoi? Dessiner le rectangle? – vfn

+0

J'ai besoin d'aide pour afficher un UIImage écrêté. Le rectangle est bien dessiné. Je reçois également un CGPath correctement chaque fois que l'utilisateur déplace l'une des 4 extrémités du rectangle. Comment puis-je l'utiliser pour découper l'UIImage en arrière-plan? –

Répondre

1

Si vous avez déjà le CGPath, il vous suffit d'utiliser CGContextAddPath et CGContextClip, et après cela vous pouvez dessiner votre UIImage dans ce contexte. Si vous voulez simplement afficher l'image découpée, ce contexte pourrait être le contexte actuel de la méthode DrawRect de votre vue. Si vous voulez vraiment avoir les données d'image rognées, le contexte serait probablement un CGBitmapContext, quelque chose comme ceci:

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

(l'exemple de code est un bitmap en échelle de gris parce que j'avais ce code prêt, mais il est alors pour dessiner réellement l'image découpée dans le contexte bitmap, vous feriez quelque chose comme ça (j'écris ce code de la mémoire, donc il y a peut-être être quelques erreurs):

// 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

Ne semble pas fonctionner. Mon image n'apparaît que là où se trouve le chemin, au lieu de la région que le chemin contourne. – jjxtra

0

Laissez-moi donner du code pour que le problème soit mieux compris. Avec le code ci-dessous, je vois la même image dessinée sur l'écran dans le cadre de délimitation donné par le polygone CGPath. Mais je veux découper l'image originale à la place. Le problème est avec CGContextClip. Je ne pense pas que cela fonctionne comme il se doit. Appréciez les pointeurs.

-

> (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

que se passe-t-il si vous utilisez CGContextClip sans le pathBoundingBox (utilisez simplement rect à la place)? – filipe

+0

rien. Je ne vois aucune image sur l'écran. Voici le code modifié dans le prochain commentaire (seulement la dernière partie). Il dessine une image png vide dans le répertoire des documents. Je sais que CGPath est correct car je peux y remplir une couleur. –

+0

CGContextClosePath (ctx); \t CGContextAddPath (ctx, chemin); \t CGContextClip (ctx); \t CGContextDrawImage (ctx, [self frame], [sourceImage CGImage]); \t clippedImage = UIGraphicsGetImageFromCurrentImageContext(); \t UIGraphicsEndImageContext(); \t NSString * pngPath = [NSHomeDirectory() stringByAppendingPathComponent: @ "Documents/Test.png"]; \t [UIImagePNGRepresentation (clippedImage) writeToFile: pngPath atomiquement: YES]; –