2010-07-27 8 views
1

J'utilise le code suivant pour obtenir une capture d'écran de l'écran et l'enregistrer dans les albums photos.UIGetScreenImage() en mode paysage?

CGImageRef screen = UIGetScreenImage(); 
     UIImage *screenImage = [UIImage imageWithCGImage:screen]; 
    UIImageWriteToSavedPhotosAlbum(screenimage, nil, nil), nil); 

Cela fonctionne très bien, mais si mon application est en mode paysage, l'image enregistrée ne sort pas correctement. (Dans le besoin d'un tour de 90 degrés). Qu'est-ce que je dois faire?

+2

Notez que UIGetScreenImage() a été rendu privé par Apple encore, et votre application sera rejetée si elle utilise cette fonction: http://www.drahtwerk.biz/EN/Blog.aspx/iOS-4-updates- retardé /? newsID = 45 –

Répondre

2

Test soit

[UIDevice currentDevice].orientation == UIInterfaceOrientationLandscapeRight 
[UIDevice currentDevice].orientation == UIInterfaceOrientationLandscapeLeft 
(and possibly more orientations) 

faire ensuite les transformations appropriées à l'image.

Cela peut se faire de plusieurs façons, celui-ci ne prend pas beaucoup de code:

/// click action saves orientation & picture: 
-(void)screenshot 
{ 
    self.orientationWhenPicked = [UIDevice currentDevice].orientation; 
    CGImageRef screen = UIGetScreenImage(); 
    self.image = [UIImage imageWithCGImage:screen]; 
    CGImageRelease(screen); 
} 

/// somewhere else we are called for the image 
-(UIImage*)getScreenshot 
{ 
    UIDeviceOrientation useOrientation = self.orientationWhenPicked; 
    UIImage *img = self.image; 

    UIGraphicsBeginImageContext(CGSizeMake(480.0f, 320.0f)); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    if (useOrientation == UIDeviceOrientationLandscapeRight) 
    { 
      CGContextRotateCTM (context, M_PI/2.0f); 
      [img drawAtPoint:CGPointMake(0.0f, -480.0f)]; 
    } else { 
      CGContextRotateCTM (context, -M_PI/2.0f); 
      [img drawAtPoint:CGPointMake(-320.0f, 0.0f)]; 
    } 
    UIImage *ret = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return ret; 
} 

je l'ai modifié un peu avant de poster pour le rendre autonome, mais il devrait fonctionner avec un peu d'effort (par exemple créer self.image etc). Vous pouvez simplement les mélanger en une seule fonction.

+0

Merci beaucoup! Pouvez-vous expliquer ce que fait cette ligne: [img drawAtPoint: CGPointMake (-320.0f, 0.0f)]; Et qu'est-ce que cela a à voir avec la rotation? Merci d'avance, -David – bobbypage

+0

C'est la ligne qui place l'image originale dans le nouveau contexte de l'image. Les coordonnées '(-320,0)' vous assurent de couvrir tout l'écran après une rotation autour de (0,0). – mvds

+0

Qu'est-ce que self.image dans les deux fonctions pour? Et pourquoi getScreenshot est-il une méthode nulle? – malhal