如何在 macOS 中镜像 JPEG 文件

How do I mirror a JPEG file in macOS

如何镜像 jpeg 文件,swift,macOS?

使用像 CGImageSourceCreateWithURL 这样的东西会很好。我想改一个属性然后再把文件写出来。不确定这是否可能。

另一种方法似乎是绘制图像,然后将其写入文件。图像需要使用 -1 比例进行缩放并进行转换,以便它仍能正确显示在目的地中。我一直无法找到这样做的 swift 示例。这是 swift 中没有的示例。我无法在 swift 中复制它。此外,使用 NSImage 需要对 JPEG 文件进行解码然后编码。不这样做的解决方案会更好。 Flip NSImage on both axes

编辑: vImage 可能是一个中间立场。这需要通过读取 JPEG 来填充,但数据可以在没有 "drawing" 的情况下以 -1 的比例翻转。我认为可以使用 initWithContentsOfURL 或 initByReferencingURL 制作 NSImage,并使用 CGImageForProposedRect 从 NSImage 制作 CGImage。从 CGImage 制作的 vImage?

要使用 vImage mirroring routines 镜像 NSImage,您可以这样做:

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: [=10=].takeRetainedValue(), size: size)
        }
    }

}

因此,在我的编辑器中截取上面的屏幕快照,然后 mirrored 图像,结果: