2016-02-06 66 views
2

我花了幾個小時在谷歌搜索這個答案和嘗試的代碼片段,但我一直沒有找到一。我也認識到,這是一個很多次被問到的問題,但我不知道現在還有什麼要做。顯示一個640x852像素的500x500像素圖像NSImageView沒有任何種類或模糊(OS X上的Swift)

我可以從Met Offices的DataPoint API訪問500x500像素的降雨雷達圖像,覆蓋英國。它們必須以640x852像素區域顯示(NSImageView,我目前將縮放屬性設置爲獨立軸),因爲這是爲圖像覆蓋的邊界生成的地圖的正確大小。我想使用最近鄰居算法並以別名格式以640x852的放大尺寸顯示它們。這可以通過轉到Image> Image Size ...並將resample設置爲最近鄰居(硬邊緣)來實現。源圖像應保持在500x500像素,我只想在更大的視圖中顯示它們。

我已經嘗試將NSImageView.layer的magnificationFilter設置爲全部三個不同的kCAFilter選項,但這沒有什麼區別。我也嘗試將NSImageView.layer的shouldRasterize屬性設置爲true,這也沒有效果。圖像總是最終被平滑或反鋸齒,這是我不想要的。

最近來自C#,可能有一些我錯過了,因爲我沒有很長時間在Swift編程。在C#中(使用WPF),我可以通過將圖像元素的BitmapScalingOptions設置爲NearestNeighbour來獲得我想要的。總之,我想用一個像素化的形式在一個640x852像素的NSImageView中顯示一個500x500像素的圖像,而不需要使用Swift進行任何平滑處理(不管顯示是否是視網膜)。感謝你給與我的幫助。

下面是圖片來源: this is the image source

下面是實際結果(截圖從5K的iMac): this is the actual result 這是通過簡單的設置上NSImageSource圖像屬性用的tableViewSelectionDidChange事件創建我的NSTableView的用於選擇時間顯示的圖像,使用:

let selected = times[timesTable.selectedRow] 

let formatter = NSDateFormatter() 
formatter.dateFormat = "d/M/yyyy 'at' HH:mm" 
let date = formatter.dateFromString(selected) 
formatter.dateFormat = "yyyyMMdd'T'HHmmss" 

imageData.image = NSImage(contentsOfFile: basePathStr + 
    "RainObs_" + formatter.stringFromDate(date!) + ".png") 

下面是我希望它看起來像(忽略背景和裁剪出的部分)。如果您保存的圖像你自己,你會看到它是像素化和別名: this is what I want it to look like

下面是信號源顯示在地圖(源只在一NSImageView放在包含地圖的另一個NSImageView的頂部): enter image description here

+0

您應該發佈圖像源,實際和期望的結果。 –

+0

不要忘記顯示使用的代碼 –

+0

@LeoDabus完成! – HenryHunt

回答

2

嘗試使用自定義子類NSView而不是NSImageView。這將需要一個image財產與didSet觀察員設置needsDisplay。在drawRect()方法,或者:

  • 使用NSImagedrawInRect(_:fromRect:operation:fraction:respectFlipped:hints:)方法與hints字典的[NSImageHintInterpolation:NSImageInterpolation.None],或
  • 保存的NSGraphicsContext.currentContext.imageInterpolation的電流值,將其改爲.None,與任何繪製NSImagedraw...(...)方法,然後恢復上下文的原始值imageInterpolation
+0

在Swift 4中,'hints'字典看起來像'[.interpolation:NSImageInterpolation.none.rawValue]'。 – zneak