如何在 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
图像,结果:
如何镜像 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
图像,结果: