如何在macOS中镜像JPEG文件

时间:2019-03-31 21:41:32

标签: swift macos jpeg

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

使用CGImageSourceCreateWithURL之类的东西会很好。我想更改一个属性,然后再次将文件写出。不知道这是否可能。

另一种方法似乎是绘制图像,然后将其写到文件中。需要使用-1比例缩放图像并进行转换,以使其仍正确显示在目标中。我还没有找到执行此操作的快速示例。这不是一个迅速的例子。我不能迅速复制它。另外,使用NSImage要求先解码,然后再编码JPEG文件。不这样做的解决方案会更好。 Flip NSImage on both axes

编辑: vImage可能是中间立场。这需要通过读取JPEG来填充,但是可以翻转数据而无需以-1的比例“绘制”它。我认为可以使用initWithContentsOfURL或initByReferencingURL来制作NSImage,并使用CGImageForProposedRect从NSImage制作CGImage。用CGImage制作的vImage?

1 个答案:

答案 0 :(得分:1)

要使用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: $0.takeRetainedValue(), size: size)
        }
    }

}

因此,在编辑器中拍摄以上内容的屏幕快照,然后我mirrored生成图像,结果是:

enter image description here