NSBitmapImageRep -initWithFocusedViewRect是图像大小加倍

时间:2016-01-05 22:32:31

标签: objective-c nsbitmapimagerep

我有以下Objective-C函数,用于将NSBitmapImageRep调整为指定大小。

目前,当处理大小为2048x1536的图像并尝试将其调整为300x225时,此函数会不断返回大小为600x450的NSBitmapImageRep。

- (NSBitmapImageRep*) resizeImageRep: (NSBitmapImageRep*) anOriginalImageRep toTargetSize: (NSSize) aTargetSize
{
    NSImage* theTempImageRep = [[[NSImage alloc] initWithSize: aTargetSize ] autorelease];
    [ theTempImageRep lockFocus ];
    [NSGraphicsContext currentContext].imageInterpolation = NSImageInterpolationHigh;
    NSRect theTargetRect = NSMakeRect(0.0, 0.0, aTargetSize.width, aTargetSize.height);
    [ anOriginalImageRep drawInRect: theTargetRect];
    NSBitmapImageRep* theResizedImageRep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect: theTargetRect ] autorelease];
    [ theTempImageRep unlockFocus];

    return theResizedImageRep;
}

调试它,我发现theTargetRect的大小合适,但对initWithFocusedRec的调用返回600x450像素(高x宽)的位图

我完全不知道为什么会这样。有没有人有任何见解?

1 个答案:

答案 0 :(得分:1)

您的技术不会生成调整大小的图像。首先,方法initWithFocusedViewRect:从聚焦窗口读取位图数据,并用于创建屏幕抓取。

您应该使用所需大小的新NSBitmapImageRep或NSImage创建新的图形上下文,然后将图像绘制到该上下文中。

像这样。

NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithBitmapImageRep:theTempImageRep];

if (context)
{
    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:context];

    [anOriginalImageRep drawAtPoint:NSZeroPoint];
    [anOriginalImageRep drawInRect:theTargetRect];

    [NSGraphicsContext restoreGraphicsState];
}
// Now your temp image rep should have the resized original.