概要
画像のリサイズのときImageView
の機能の余計なお世話で勝手に色を補間してしまいますよね.(特にScaling
でProportionally Up or Down
なんか選ぶと)ドット絵を用いる時はこの仕様は邪魔ですね.そこで,画像のリサイズの際,補間をさせずにそのまま拡大する方法を調べて実装してみました.
ソース
resize
というExtension
を書いてみました.
extension NSImage {
public func resize(targetSize: CGSize) -> NSImage? {
let wRatio = targetSize.width / self.size.width
let hRatio = targetSize.height / self.size.height
var newSize: CGSize
if(wRatio > hRatio) {
newSize = CGSize(width: self.size.width * hRatio,
height: self.size.height * hRatio)
} else {
newSize = CGSize(width: self.size.width * wRatio,
height: self.size.height * wRatio)
}
guard let imageData = self.tiffRepresentation else { return nil }
guard let cgImage = NSBitmapImageRep(data: imageData)?.cgImage else { return nil }
guard let bitmapContext = CGContext(data: nil,
width: Int(newSize.width),
height: Int(newSize.height),
bitsPerComponent: 8,
bytesPerRow: 4 * Int(newSize.width),
space: CGColorSpaceCreateDeviceRGB())// DeviceGray(),
bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { return nil }
let rect = CGRect(origin: CGPoint.zero, size: newSize)
bitmapContext.interpolationQuality = CGInterpolationQuality.none
bitmapContext.draw(cgImage, in: rect)
guard let newImageRef = bitmapContext.makeImage() else { return nil }
let newImage = NSImage(cgImage: newImageRef, size: newSize)
return newImage
}
}
使用例
let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 200, height: 100))
let nsImage = NSImage(imageLiteralResourceName: "DotImage")
imageView.image = nsImage.resize(targetSize: imageView.frame.size)