图像在视网膜设备上调整大小

时间:2013-02-18 13:07:58

标签: objective-c macos cocoa nsimage

我正在开发适用于Mac OS X的应用程序。我正在尝试将任何NSImage调整为特定大小,例如200x300。 它适用于非视网膜Mac。 但对于Retina Mac来说,它正在将图像调整为400x600,这只是我们预期的两倍。 我的项目需要是按照给定的大小调整图像大小,无论应用程序运行的设备是视网膜还是非视网膜。 我怎样才能达到目标。

我曾尝试测量scale属性,对于视网膜而言,比例为2.0,因此我们只需将图像的大小调整为一半。

但是当我们连接到显示器时,一个是视网膜,另一个不是视网膜,它再次产生同样的问题。

以下是我用于调整大小的代码:

-(void)resizeImage:(NSImage *)sourceImage newSize:(CGSize)newSize
{


    NSString *newImagePath = [[[Utility documentPath] stringByAppendingPathComponent:imagefolder] stringByAppendingPathComponent:@"imageName"];



    [sourceImage setScalesWhenResized:YES];
    [sourceImage setSize:newSize];


    NSImage *newImage = [[NSImage alloc] initWithSize:newSize];

    [newImage lockFocus];

    NSRect frame = NSMakeRect(0, 0, newSize.width, newSize.height);

    [NSGraphicsContext saveGraphicsState];

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:frame xRadius:0 yRadius:0];
    [path addClip];

    [sourceImage drawInRect:frame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

    [NSGraphicsContext restoreGraphicsState];

    [newImage unlockFocus];

    CGImageRef CGImage = [newImage CGImageForProposedRect:nil context:nil hints:nil];
    NSBitmapImageRep *imgRep = [[[NSBitmapImageRep alloc] initWithCGImage:CGImage] autorelease];


        NSData *data = [imgRep representationUsingType:NSPNGFileType properties: nil];
        [[NSFileManager defaultManager] createFileAtPath:newImagePath contents:data attributes:nil];

    [newImage release];

}

提前致谢。

1 个答案:

答案 0 :(得分:5)

我通过将目标大小除以屏幕比例(screenScale)来解决了这个问题。 ScreenScale在正常屏幕上为1.0,在视网膜屏幕上为2.0:

CGFloat screenScale = [[NSScreen mainScreen] backingScaleFactor];
float targetScaledWidth = sourceImage.size.width*scale/screenScale;
float targetScaledHeight = sourceImage.size.height*scale/screenScale;