Frage

I have problem with rotating and saving JPEG NSImage. I have NSView which is flipped

- (BOOL)isFlipped
{
  return YES;
}

Then I'm applying NSImage rotation with following function:

- (NSImage*)imageRotatedByDegrees:(CGFloat)degrees
{
  // calculate the bounds for the rotated image
  NSRect imageBounds = {NSZeroPoint, [image size]};
  NSBezierPath* boundsPath = [NSBezierPath
                          bezierPathWithRect:imageBounds];
  NSAffineTransform* transform = [NSAffineTransform transform];

  [transform rotateByDegrees:degrees];
  [boundsPath transformUsingAffineTransform:transform];

  NSRect rotatedBounds = {NSZeroPoint, [boundsPath bounds].size};
  NSImage* rotatedImage = [[NSImage alloc]
                        initWithSize:rotatedBounds.size];

  // center the image within the rotated bounds
  imageBounds.origin.x = NSMidX(rotatedBounds) - (NSWidth
                                              (imageBounds) / 2);
  imageBounds.origin.y = NSMidY(rotatedBounds) - (NSHeight
                                              (imageBounds) / 2);

  // set up the rotation transform
  transform = [NSAffineTransform transform];
  [transform translateXBy:+(NSWidth(rotatedBounds) / 2) yBy:+
   (NSHeight(rotatedBounds) / 2)];
  [transform rotateByDegrees:degrees];
  [transform translateXBy:-(NSWidth(rotatedBounds) / 2) yBy:-
   (NSHeight(rotatedBounds) / 2)];

  // draw the original image, rotated, into the new image
  [rotatedImage lockFocus];
  [transform set];
  [image drawInRect:imageBounds fromRect:NSZeroRect
     operation:NSCompositeCopy fraction:1.0] ;
  [rotatedImage unlockFocus];

  return  rotatedImage;
}

Image is now successfully rotated. Later, when I'm trying to save JPEG with following code:

-(void)saveDocument:(id)sender
{
  NSData *imageData = [image TIFFRepresentation];
  NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
  NSDictionary *imageProps = 
    [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:1.0] 
                  forKey:NSImageCompressionFactor];
  imageData = [imageRep representationUsingType:NSJPEGFileType 
                                     properties:imageProps];
  [imageData writeToFile:[_imageURL path] atomically:YES];
}

Result JPEG file is incorrectly flipped... What I'm doing wrong ?

Thanks a lot for any ideas, Petr

War es hilfreich?

Lösung 2

Finally, I did find correct solution.

- (BOOL)isFlipped
{
  return NO;
}

Then it is important to setup NSImage (thanks to pointum !)

[_image lockFocusFlipped:YES];

From now, when I'm saving image, he is correctly rotated and flipped.

Andere Tipps

-[NSImage lockFocusFlipped:] could help.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top