2010-10-06 20 views
5

J'essaie de faire quelque chose qui devrait en théorie être assez simple, mais j'ai été la chasse autour de ma queue pendant des jours maintenant. J'essaie de prendre un événement tactile à partir d'une superposition d'écran, de capturer une image et de recadrer une partie de l'image autour de l'endroit où le doigt a touché.Bonne façon d'utiliser CGImageCreateWithImageInRect, UIImage et UIImagePickerController questions

Maintenant, tout mon code fonctionne bien, la superposition, les événements, le rognage, etc .... Cependant, je ne peux pas sembler obtenir le système de coordonnées de l'événement tactile pour correspondre au système de coordonnées de l'UIImage. J'ai lu tous les documents que je peux trouver, je n'arrive pas à comprendre.

Ma question principale est, ai-je besoin de prendre en compte UIImageOrientation en utilisant CGImageCreateWithImageInRect, ou est-ce que le quartz le comprend? La raison pour laquelle je demande est que j'ai une routine très simple qui recadre des images très bien, mais l'image recadrée ne semble jamais être où mon doigt pressé ??

La majeure partie de la routine est:

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
UIImage *image = =[info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
float scaleX = image.size.width/SCREEN_WIDTH; 
float scaleY = image.size.height/SCREEN_HEIGHT; 
     //lastTouch is saved from touchesBegan method 
float x = (lastTouch.x * scaleX) - (CROP_WIDTH/2); 
float y = (lastTouch.y * scaleY) - (CROP_WIDTH/2); 
if(x < 0) x = 0.0; 
if(y < 0) y = 0.0; 
     CGRect cropArea = CGRectMake(x, y, CROP_WIDTH, CROP_WIDTH); 
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropArea); 
UIImage *swatch = [UIImage imageWithCGImage:imageRef]; 

     //at this point I'm just writing the images to the photo album to see if 
     //my crop is lining up with my touch 
     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 
     UIImageWriteToSavedPhotosAlbum(swatch, nil, nil, nil); 
} 

Ainsi, le problème est que ma région recadrée (vu dans mon album photo) ne correspond jamais à la superficie réelle que je presse (il est toujours une autre partie aléatoire de la photo), ce qui me fait penser que mon système de coordonnées est éteint.

Tous les pointeurs seraient grandement appréciés, même s'il n'y a que des pointeurs vers des documents que je n'ai pas encore trouvés.

Vive Adam

Répondre

0

Vous devez toujours se rappeler que la valeur par défaut du système de coordonnées est différent entre CoreGraphics et UIKit. Alors que UIKit commence avec son origine dans le coin supérieur gauche de la fenêtre, CoreGraphics a ce point en bas à gauche. Je pense que cela peut être assez d'informations pour vous mettre sur la bonne voie, mais juste pour réitérer:

Vous pouvez utiliser ce code pour inverser, ou inverser, votre système de coordonnées.

CGContextTranslateCTM(graphicsContext, 0.0, drawingRect.size.height); 
CGContextScaleCTM(graphicsContext, 1.0, -1.0); 

examen a également Retournement la valeur par défaut Coordonnée Sytem dans le Drawing and Printing Guide for iOS