Вызов NSBitmapImageRep.representation (используя: properties :) дважды приводит к более яркому изображению PNG - PullRequest
0 голосов
/ 16 января 2020

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

Цепочка выглядит следующим образом:

jpeg data → NSImage → данные PNG → NSImage (ок) → данные PNG → NSImage (слишком яркий)

Пример входного изображения (JPEG):

Input image

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

first pass

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

second pass

Изображение становится ярче. Почему это так?

Пример кода (расширение 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
}
...