我有一个大小为 W
xH
的 NSBitmapImageRep
。
我创建了一个 NSImage
并调用了 addRepresentation:
。然后我需要调整 NSImage
的大小。
我尝试使用 setSize
方法,但它不起作用。我该怎么办?
我有一个大小为 W
xH
的 NSBitmapImageRep
。
我创建了一个 NSImage
并调用了 addRepresentation:
。然后我需要调整 NSImage
的大小。
我尝试使用 setSize
方法,但它不起作用。我该怎么办?
import AppKit
extension NSImage {
/**
Resizes the image to the given size.
*/
func resize(withSize targetSize: NSSize) -> NSImage {
let newImage = NSImage(size: targetSize)
newImage.lockFocus()
draw(in: CGRect(origin: .zero, size: targetSize), from: CGRect(origin: .zero, size: size), operation: .sourceOver, fraction: 1.0)
newImage.unlockFocus()
return newImage
}
/**
Resizes the image to the given size maintaining its original aspect ratio.
*/
func resizeMaintainingAspectRatio(withSize targetSize: NSSize) -> NSImage {
let newSize: NSSize
let widthRatio = targetSize.width / size.width
let heightRatio = targetSize.height / size.height
if(widthRatio > heightRatio) {
newSize = NSSize(width: floor(size.width * widthRatio), height: floor(size.height * widthRatio))
} else {
newSize = NSSize(width: floor(size.width * heightRatio), height: floor(size.height * heightRatio))
}
return resize(withSize: newSize)
}
}
根据Marco的回答:
在我的情况下,使用提议的方法无法对bitsPerSample进行重采样和保留(我的8 bps灰度图像变为64 bps)。通过进行小的修改,我成功使其工作。
如果有人遇到相同的问题,这是我的解决方案:
- (NSImage*) resizeImage:(NSImage*)smallImage newSize:(NSSize)newSize {
NSBitmapImageRep *resizeRep =
[[NSBitmapImageRep alloc]
initWithBitmapDataPlanes: nil
pixelsWide: newSize.width
pixelsHigh: newSize.height
bitsPerSample: 8
samplesPerPixel: 1
hasAlpha: NO
isPlanar: NO
colorSpaceName: NSCalibratedWhiteColorSpace
bytesPerRow: 0
bitsPerPixel: 8];
[resizeRep setSize: newSize];
[smallImage setSize: newSize]; // ADDITION
[NSGraphicsContext saveGraphicsState];
NSGraphicsContext *newCurrentContext = [NSGraphicsContext graphicsContextWithBitmapImageRep: resizeRep];
[newCurrentContext setImageInterpolation:NSImageInterpolationHigh]; // ADDITION
[NSGraphicsContext setCurrentContext: newCurrentContext];
[smallImage drawAtPoint:NSZeroPoint fromRect:CGRectMake(0, 0, newSize.width, newSize.height) operation:NSCompositingOperationCopy fraction:1.0];
[NSGraphicsContext restoreGraphicsState];
NSImage *resizedImage = [[NSImage alloc] initWithSize:newSize];
[resizedImage addRepresentation: resizeRep];
return resizedImage;