- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在努力在 iOS 10 中添加对宽幅彩色照片的支持。当用户从相机拍摄照片时,我需要使用支持新色彩空间的新 API 来保存照片数据 - UIGraphicsImageRenderer
的 jpegData
而不是 UIImageJPEGRepresentation
。
我在图像方向方面遇到了一些麻烦。在我的 iPad 上拍摄纵向照片时,图像绘制不正确。请参阅以下评论:
旧 API:
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let imageData = UIImageJPEGRepresentation(image, 1)
新 API:
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let cgImage = image.cgImage!
let ciImage = CIImage(cgImage: cgImage)
let format = UIGraphicsImageRendererFormat()
format.scale = 1
format.prefersExtendedRange = true
let renderer = UIGraphicsImageRenderer(bounds: ciImage.extent, format: format)
let imageData = renderer.jpegData(withCompressionQuality: 1, actions: { context in
context.cgContext.draw(cgImage, in: ciImage.extent) //draws flipped horizontally
//image.draw(at: .zero) //draws rotated 90 degrees leaving black at bottom
//image.draw(in: ciImage.extent) //draws rotated 90 degrees stretching and compressing the image to fill the rect
})
将 UIImageJPEGRepresentation
替换为 UIGraphicsImageRenderer
的 jpegData
的正确方法是什么?
最佳答案
UIImage
可以根据相机旋转具有不同的方向。您可以根据该方向动态解析需要应用于图像的转换,如下所示:
let renderer = UIGraphicsImageRenderer(size: image.size, format: format)
let imageData = renderer.jpegData(withCompressionQuality: 1, actions: { context in
var workSize = image.size;
workSize.width = floor(workSize.width / image.scale)
workSize.height = floor(workSize.height / image.scale)
// No-op if the orientation is already correct
// if image.imageOrientation == .up { draw image }
// We need to calculate the proper transformation to make the image upright.
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
var transform = CGAffineTransform.identity
switch image.imageOrientation
{
case .down, .downMirrored:
transform = transform.translatedBy(x: workSize.width, y: workSize.height)
transform = transform.rotated(by: CGFloat(Double.pi))
break
case .left, .leftMirrored:
transform = transform.translatedBy(x: workSize.width, y: 0.0)
transform = transform.rotated(by: CGFloat(Double.pi / 2.0))
break
case .right, .rightMirrored:
transform = transform.translatedBy(x: 0.0, y: workSize.height)
transform = transform.rotated(by: CGFloat(-Double.pi / 2.0))
break
case .up, .upMirrored:
break
}
switch image.imageOrientation
{
case .upMirrored, .downMirrored:
transform = transform.translatedBy(x: workSize.width, y: 0.0)
transform = transform.scaledBy(x: -1.0, y: 1.0)
break
case .leftMirrored, .rightMirrored:
transform = transform.translatedBy(x: workSize.height, y: 0.0);
transform = transform.scaledBy(x: -1.0, y: 1.0);
break
case .up, .down, .left, .right:
break
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
let ctx = context.cgContext
ctx.concatenate(transform)
switch image.imageOrientation {
case .left, .leftMirrored, .right, .rightMirrored:
ctx.draw(image.cgImage!, in: CGRect(x: 0.0, y:0.0, width: workSize.height, height: workSize.width))
break;
default:
ctx.draw(image.cgImage!, in: CGRect(origin: .zero, size: workSize))
break;
}
})
关于ios - 用 UIGraphicsImageRenderer 的 jpegData 替换 UIImageJPEGRepresentation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666258/
private func scale(image ciImage: CIImage?, for scale: CGFloat) -> UIImage { guard let ciImage =
问题 : 在我截取屏幕截图后,通过缩放检查时图像模糊。放大时图像内的文字似乎模糊不清。 我知道这个问题已经被提出很多次了,但他们都没有想要的解决方案。我已经检查了很多帖子,例如 this one 迄今
我想给照片加一个白色边框,同时保持照片的质量,所以我用UIGraphicsImageRenderer画了一个白色的背景,然后把照片画上去,结果是内存占用急剧增加,有没有更好的道路? 原图分辨率为403
使用我们的设备相机拍摄的图像比 iOS 设备上的屏幕大。通常,当我们在 iOS 中渲染图像时,我看到人们将渲染大小设置为主视图或 ImageView 的大小。 如this stack overflow
我有以下代码从 UIImage 获取像素数据,这适用于大多数图像,但是当我使用 UIGraphicsImageRenderer 创建图像时不起作用。我希望有人知道解决这个问题的方法。 我当前的代码生成
UIGraphicsImageRenderer是在 iOS 10 中新引入的。我想知道是否有可能用它旋转 UIImage(任何自定义角度)。我知道有 classic way使用 CGContextRo
默认情况下,UIGraphicsImageRenderer 将比例设置为设备的屏幕比例,在 iPhone 6s 上是 2x,在 iPhone 6s Plus 上是 3x,因此即使你给它一个尺寸为 30
我很喜欢使用来自 UIGraphicsImageRenderer 的新 API自 iOS 10 以来引入,但现在我想知道是否有可能获得灰度 Data来自其 pngData方法。 假设我有一个名为“ma
我正在尝试截取 SCNView 的屏幕截图以在其他地方显示。由于SCNView继承自UIView,我想我可以use a UIGraphicsImageRenderer : extension UIVi
我目前正在使用这种非常流行的方法来捕获 View ,以便用户分享它或将它保存到他的照片库中: let renderer = UIGraphicsImageRenderer(size: CGSize(w
UIGraphicsImageRenderer 是 iOS 10 创建图像上下文并绘制到其中的新方法。我正在尝试使用 UIGraphicsImageRenderer 绘制一个简单的图像: let si
我想在裁剪时对图像应用羽化效果,但我想使用 UIGraphicsImageRenderer 渲染图像渲染为零(iOS 9.3)是否有任何其他选项可以在 iOS 9.3 中渲染图像 这是我的代码: UI
我正在努力在 iOS 10 中添加对宽幅彩色照片的支持。当用户从相机拍摄照片时,我需要使用支持新色彩空间的新 API 来保存照片数据 - UIGraphicsImageRenderer 的 jpegD
当我尝试在 watchOS 应用程序中使用 UIGraphicsImageRenderer 时,编译器抛出错误。 entry in the documentation看起来它只适用于 iOS 和 tv
我有一个自定义的 UIView 类,它使用 UIGraphicsImageRenderer 绘制一些线条,我有一些 slider 来更改用于绘制线条的点,但这样做并没有不要删除旧线,它只是在它们上面绘
我正在将 UIView 转换为 UIImage,以将其设置为导航栏背景。 那个 View 有一个渐变层,当我使用 setBackgroundImage(_ backgroundImage: UIIma
我是一名优秀的程序员,十分优秀!