如何镜像jpeg文件,swift,macOS?
使用CGImageSourceCreateWithURL之类的东西会很好。我想更改一个属性,然后再次将文件写出。不知道这是否可能。
另一种方法似乎是绘制图像,然后将其写到文件中。需要使用-1比例缩放图像并进行转换,以使其仍正确显示在目标中。我还没有找到执行此操作的快速示例。这不是一个迅速的例子。我不能迅速复制它。另外,使用NSImage要求先解码,然后再编码JPEG文件。不这样做的解决方案会更好。 Flip NSImage on both axes
编辑: vImage可能是中间立场。这需要通过读取JPEG来填充,但是可以翻转数据而无需以-1的比例“绘制”它。我认为可以使用initWithContentsOfURL或initByReferencingURL来制作NSImage,并使用CGImageForProposedRect从NSImage制作CGImage。用CGImage制作的vImage?
答案 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
生成图像,结果是: