2010-07-20 11 views
3

Ok J'ai cherché partout et je n'arrive pas à trouver la réponse dont j'ai besoin. :-(Comment enregistrer une image en utilisant UIImageWriteToSavedPhotosAlbum après sa transformation

Voici ce que je fais et ce que je dois faire: J'ai un UIImageView que je suis capable de transférer en utilisant UIPanGestureRecognizer, UIRotationGestureRecognizer, et UIPinchGestureRecognizer, tout cela fonctionne très bien. sauver ces transfomations à mon PhotoAlbum. les résultats ne sont pas ce que je suis dans l'attente. jusqu'à présent, voici le code que j'utilise (al-be-très incomplète)

-(IBAction)saveface:(id)sender 
{  

    static int kMaxResolution = 640; 

    CGImageRef imgRef = face.image.CGImage; 
    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat height = CGImageGetHeight(imgRef); 

    CGRect bounds = CGRectMake(0, 0, width, height); 
    if (width > kMaxResolution || height > kMaxResolution) { 
      CGFloat ratio = width/height; 
      if (ratio > 1) { 
       bounds.size.width = kMaxResolution; 
       bounds.size.height = bounds.size.width/ratio; 
      } else { 
       bounds.size.height = kMaxResolution; 
       bounds.size.width = bounds.size.height * ratio; 
      } 
    } 


    UIGraphicsBeginImageContext(bounds.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextScaleCTM(context, 1, -1); 
    CGContextTranslateCTM(context, 0, -height); 


    NSLog(@"SAVE TX:%f TY:%f A:%f B:%f C:%f D:%f", face.transform.tx, face.transform.ty, face.transform.a,face.transform.b,face.transform.c,face.transform.d); 
    CGFloat x = face.transform.tx; 
    CGFloat y = face.transform.ty; 

    CGContextTranslateCTM (context, x,-y); 

    CGContextConcatCTM(context, face.transform); 

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 


    UIImageWriteToSavedPhotosAlbum(imageCopy, self, nil, nil); 


} 

de cette méthode, je suis en mesure d'économiser l'image cependant les coordonnées sont loin.Je peux voir toute échelle que j'ai fait qui fonctionne bien.Je vois ma rotation mais il semble être en arrière et le paning est WAY off

Les coords sont tous faux et pour la vie de moi je ne peux pas comprendre ce qui ne va pas. J'avoue être novice en Objective-C et je n'ai jamais utilisé Quartz 2D auparavant et ma compréhension des matrices de transformation est limitée. Je comprends que mes transformations ne sont pas sur les données d'image elle-même comme essayant de sauver l'image juste sans appliquer ce contexte à rien. Alors, s'il vous plaît, quelqu'un peut-il me mettre au clair?

Répondre

2

Vous souhaitez généralement effectuer une traduction avant de passer à l'échelle.

Vous avez inversé votre système de coordonnées mais vous affectez toujours les anciennes valeurs x et y. Je pense que vous devriez avoir:

CGFloat y = face.transform.tx; 
CGFloat x = face.transform.ty; 

L'objet face ne définit pas ce code. Si c'est éteint, tout le reste sera éteint. S'il s'agit d'une propriété, vous devez utiliser le formulaire de référence self.face pour vous assurer que l'accès est correct.

Je recommanderais d'effectuer la transformation de l'échelle en dernier.

Si rien de tout cela ne fonctionne. Commentez toutes sauf une transformation et voyez si cette transformation unique fonctionne. Puis ajoutez les autres jusqu'à ce qu'il échoue.

0

Ce type de travail est beaucoup plus facile si vous l'image dans un UIView, transformer, redimensionner et ensuite rendre le calque. Il sauve toutes sortes de tracas plus tard.

Quelque chose comme:

CGSize vscaledSize = myOriginalImage.size; 

//add in the scaled bits of the view 
//scaling 
CGFloat wratio = vscaledSize.width/self.pictureView.frame.size.width; 
CGFloat vhightScaled = self.pictureView.frame.size.height * wratio; 
vscaledSize.height = vhightScaled; 

CGFloat hratio = vscaledSize.height/self.pictureView.frame.size.height; 

//create context 
UIGraphicsBeginImageContext(myOriginalImage.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(context); //1 original context 

// translate/flip the graphics context (for transforming from CG* coords to UI* coords 
CGContextTranslateCTM(context, 0, vscaledSize.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

//original image 
CGContextDrawImage(context, CGRectMake(0,0,vscaledSize.width,vscaledSize.height), myOriginalImage.CGImage); 

CGContextRestoreGState(context);//1 restore to original; 

//scale context to match view size 
CGContextSaveGState(context); //1 pre-scaled size 
CGContextScaleCTM(context, wratio, hratio); 

//render 
[self.pictureView.layer renderInContext:context]; 

CGContextRestoreGState(context);//1 restore to pre-scaled size; 

UIImage *exportImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Vous remarquerez que je feuillette le système coord pour l'image de rendu, mais la restaurer au système de coordonnées d'origine pour le rendu UIView.layer.

Espérons que cela aide

Questions connexes