Я пытаюсь преобразовать NSImage
в данные PNG в приложении Какао. Я делаю это, используя NSBitmapImageRep.representation(using: .png, properties: [:])
. Это отлично работает в первый раз, но я заметил, что когда я делаю это дважды, получающееся изображение становится слишком ярким.
Цепочка выглядит следующим образом:
jpeg data → NSImage → данные PNG → NSImage (ок) → данные PNG → NSImage (слишком яркий)
Пример входного изображения (JPEG):

После первого прохода (1-й png):

После второго прохода (2-й png):

Изображение становится ярче. Почему это так?
Пример кода (расширение NSImage):
func dataOfType(_ type:NSBitmapImageRep.FileType) -> Data? {
let bitmapImageRep:NSBitmapImageRep
if let firstBitmapImageRep = representations.first(where: { $0 is NSBitmapImageRep }) as? NSBitmapImageRep {
bitmapImageRep = firstBitmapImageRep
} else if let tiffRepresentation = self.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiffRepresentation) {
bitmapImageRep = bitmap
bitmapImageRep.size = self.size
} else {
return nil
}
return bitmapImageRep.representation(using: type, properties: [:])
}
Воспроизвести:
func testConvertToPng() throws {
let sourceImage = NSImage(contentsOf: Bundle(for: ImageConversionTests.self).url(forResource: "landscape", withExtension: "jpeg")!)!
let firstPngData = sourceImage.dataOfType(.png)!
let firstImage = NSImage(data:firstPngData)!
let secondPngData = firstImage.dataOfType(.png)!
let secondImage = NSImage(data: secondPngData)!
// Use Xcode preview to view the images
}