0

我有以下目标 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 宽)的位图

我完全不知道为什么会发生这种情况。有没有人有任何见解?

4

1 回答 1

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.
于 2016-01-05T23:21:01.063 回答