2017-08-07 2 views
0

J'essaye de faire pivoter une image depuis IKImageView. Mais après la rotation et l'enregistrement, j'ai obtenu une image de plus basse résolution.
ci-dessous est le code que j'utilise pour faire tournerEnregistrer l'image après l'avoir fait pivoter. Mais l'image a une résolution plus faible après l'enregistrement

-(NSImage *)imageRotated:(float)degrees{ 
    degrees = fmod(degrees, 360.); 
    if(0 == degrees){ 
     return self; 
    } 
    NSSize size = [self size]; 
    NSSize maxSize; 
    if(90. == degrees || 270. == degrees || -90== degrees || -270. == degrees){ 
     maxSize = NSMakeSize(size.height, size.width); 
    }else if (180. == degrees || -180. == degrees){ 
     maxSize = size; 
    }else{ 
     maxSize = NSMakeSize(20+MAX(size.width, size.height), 20+MAX(size.width, size.height)); 
    } 

    NSAffineTransform *rot = [NSAffineTransform transform]; 
    [rot rotateByDegrees:degrees]; 
    NSAffineTransform *center = [ NSAffineTransform transform]; 
    [center translateXBy:maxSize.width/2 yBy:maxSize.height/2]; 
    [rot appendTransform:center]; 
    NSImage *image = [[NSImage alloc]init]; 
    image = [NSImage imageWithSize:maxSize flipped:NO drawingHandler:^BOOL(NSRect desRect){ 
      [rot concat]; 
      NSRect rect = NSMakeRect(0, 0, size.width, size.height); 
      NSPoint corner = NSMakePoint(-size.width/2, -size.height/2); 
      [self drawAtPoint:corner fromRect:rect operation:NSCompositeCopy fraction:1.0]; 
     return YES; 
    }]; 
    return image; 
} 


puis, je me suis converti l'image bitmap par le code ci-dessous

- (NSBitmapImageRep *)bitmapImageRepresentation{ 
    int width = [self size].width; 
    int height = [self size].height; 

    if(width <1 || height < 1) 
     return nil; 

    NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] 
          initWithBitmapDataPlanes:NULL 
          pixelsWide:width 
          pixelsHigh:height 
          bitsPerSample:8 
          samplesPerPixel:4 
          hasAlpha:YES 
          isPlanar:NO 
          colorSpaceName:NSDeviceRGBColorSpace 
          bytesPerRow:width*4 
          bitsPerPixel:32]; 

    NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:rep]; 
    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:ctx]; 
    [self drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; 
    [ctx flushGraphics]; 
    [NSGraphicsContext restoreGraphicsState]; 
    return rep; 
} 


et je ci-dessous le code pour convertir NSData, puis écrire fichier

- (NSData*)toNSData{ 
    NSImage *imgTemp = [[NSImage alloc]initWithSize:NSMakeSize(self.size.width*2, self.size.height*2)]; 
    imgTemp = self; 
    NSBitmapImageRep *bmprep = [imgTemp bitmapImageRepresentation]; 
    NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:1.0] forKey:NSImageCurrentFrame]; 
    NSData *pngData = [[NSData alloc]init]; 
    pngData = [bmprep representationUsingType:NSPNGFileType properties:imageProps]; 
    return pngData; 
} 

Pourriez-vous me montrer la raison pour laquelle l'image après l'enregistrement a une résolution inférieure?
J'utilise MacBook Pro (Retina, 13 pouces, mi 2014)
Merci beaucoup à l'avance :)

+0

Quel est le problème? L'image après sauvegarde est pivotée. N'est-ce pas ce que tu veux? – FightOn

+0

@FightOn: Bonjour, merci pour vos commentaires à l'avance. J'ai mis à jour ma question à nouveau. Pourriez-vous m'aider à vérifier à nouveau? – NextTrang

Répondre

0

Je pense que vous faire pivoter l'image deux fois.

Dans la méthode rotateLeft

//First rotation 
//Rotate Picture 
     Img = [self imageRotatedByDegrees:Img and:90]; 

//Second rotation 
[_imageView rotateImageLeft:sender]; 

Je crois que vous aurez besoin de bloquer la deuxième rotation et vous débarrasser de votre problème.

+0

Merci pour votre réponse, c'est tellement utile pour moi. Actuellement, je suis confronté à un autre problème. C'est la résolution de l'image diminuée après l'enregistrement. J'ai mis à jour ma question, Pourriez-vous m'aider à nouveau vérifier – NextTrang

+0

Il semble que dans votre question mise à jour il est un code totalement différent que je me souviens, donc je vous conseille de poser une question distincte afin d'obtenir de l'aide de plus de gens. Aussi, n'oubliez pas d'accepter et d'upvote la réponse si elle a résolu votre problème, cela aide à mieux comprendre le problème pour nous. Merci –