Как мне отразить файл JPEG в macOS - PullRequest
0 голосов
/ 01 апреля 2019

Как мне отразить файл jpeg, swift, macOS?

Было бы неплохо использовать что-то вроде CGImageSourceCreateWithURL.Я хотел бы изменить свойство, а затем снова записать файл.Не уверен, что это возможно.

Другой способ - нарисовать изображение и записать его в файл.Изображение должно быть масштабировано с масштабом -1 и преобразовано так, чтобы оно все еще правильно отображалось в месте назначения.Я не смог найти быстрый пример этого.Это пример, который не в быстром.Я не могу воспроизвести это быстро.Также использование NSImage требует декодирования, а затем кодирования файла JPEG.Решение, которое не делает этого, было бы лучше. Отразить NSImage по обеим осям

Редактировать: изображение может быть среднего уровня.Это нужно будет заполнить чтением JPEG, но данные можно перевернуть, не «рисуя» их в масштабе -1.Я думаю, что NSImage может быть сделано с использованием initWithContentsOfURL или initByReferencingURL и CGImage, созданным из NSImage с использованием CGImageForProposedRect.Изображение из CGImage?

1 Ответ

1 голос
/ 01 апреля 2019

Чтобы отразить NSImage с помощью подпрограмм зеркалирования vImage , вы можете сделать что-то вроде:

extension NSImage {
    func mirrored() -> NSImage? {
        guard
            let cgImage = cgImage(forProposedRect: nil, context: nil, hints: nil),
            let colorSpace = cgImage.colorSpace else {
                return nil
        }

        var format = vImage_CGImageFormat(bitsPerComponent: UInt32(cgImage.bitsPerComponent),
                                          bitsPerPixel: UInt32(cgImage.bitsPerPixel),
                                          colorSpace: Unmanaged.passRetained(colorSpace),
                                          bitmapInfo: cgImage.bitmapInfo,
                                          version: 0,
                                          decode: nil,
                                          renderingIntent: cgImage.renderingIntent)

        var source = vImage_Buffer()
        var result = vImageBuffer_InitWithCGImage(
            &source,
            &format,
            nil,
            cgImage,
            vImage_Flags(kvImageNoFlags))

        guard result == kvImageNoError else { return nil }

        defer { free(source.data) }

        var destination = vImage_Buffer()
        result = vImageBuffer_Init(
            &destination,
            vImagePixelCount(cgImage.height),
            vImagePixelCount(cgImage.width),
            UInt32(cgImage.bitsPerPixel),
            vImage_Flags(kvImageNoFlags))

        guard result == kvImageNoError else { return nil }

        result = vImageHorizontalReflect_ARGB8888(&source, &destination, vImage_Flags(kvImageNoFlags))
        guard result == kvImageNoError else { return nil }

        defer { free(destination.data) }

        return vImageCreateCGImageFromBuffer(&destination, &format, nil, nil, vImage_Flags(kvImageNoFlags), nil).map {
            NSImage(cgImage: $0.takeRetainedValue(), size: size)
        }
    }

}

Таким образом, сделав снимок экрана вышеупомянутого в моем редакторе, я тогдаmirrored изображение, в результате чего:

enter image description here

...