gpt4 book ai didi

ios - 缩放、旋转和平移后保存编辑后的图像

转载 作者:IT王子 更新时间:2023-10-29 05:43:54 31 4
gpt4 key购买 nike

我已经创建了这个类的 Swift 版本:https://github.com/bennythemink/ZoomRotatePanImageView/blob/master/ZoomRotatePanImageView.m很好用。现在我想将修改后的图像保存到文件中。问题是我想以全分辨率保存它,我还想保存只对用户可见的区域。

让我给你举个简单的例子:

enter image description here

这是它在我的应用程序中的样子。图片是 iOS 模拟器中的几个样本之一。大部分都在屏幕之外。我只想要可见的部分。

不裁剪保存后是这样的:

enter image description here

剪裁后到目前为止还不错。

但现在让我们做一些改变:

enter image description here

保存后:

enter image description here

看起来它被错误的枢轴转换了。我该如何解决?

这是我的保存代码:

UIGraphicsBeginImageContextWithOptions(image.size, false, 0)
let context = UIGraphicsGetCurrentContext()
let transform = imageView.transform
let imageRect = CGRectMake(0, 0, image.size.width, image.size.height)

CGContextSetFillColorWithColor(context, UIColor.blueColor().CGColor) //for debugging
CGContextFillRect(context, imageRect)

CGContextConcatCTM(context, transform)

image.drawInRect(imageRect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()

有一个更简单的方法来实现它:

UIGraphicsBeginImageContextWithOptions(imageContainer.bounds.size, false, 0)
self.imageContainer.drawViewHierarchyInRect(imageContainer.bounds, afterScreenUpdates: true)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()

但是输出图像具有 View 的大小而不是实际图像,我希望它是全分辨率的。

最佳答案

更新代码以处理任何尺寸的图像:

let boundsScale = imageView.bounds.size.width / imageView.bounds.size.height
let imageScale = image!.size.width / image!.size.height

let size = (image?.size)!

var canvasSize = size

if boundsScale > imageScale {
canvasSize.width = canvasSize.height * boundsScale
}else{
canvasSize.height = canvasSize.width / boundsScale
}

let xScale = canvasSize.width / imageView.bounds.width
let yScale = canvasSize.height / imageView.bounds.height

let center = CGPointApplyAffineTransform(imageView.center, CGAffineTransformScale(CGAffineTransformIdentity, xScale, yScale))

let xCenter = center.x
let yCenter = center.y

UIGraphicsBeginImageContextWithOptions(canvasSize, false, 0);
let context = UIGraphicsGetCurrentContext()!

//Apply transformation
CGContextTranslateCTM(context, xCenter, yCenter)

CGContextConcatCTM(context, imageView.transform)

CGContextTranslateCTM(context, -xCenter, -yCenter)

var drawingRect : CGRect = CGRectZero
drawingRect.size = canvasSize

//Transaltion
drawingRect.origin.x = (xCenter - size.width*0.5)
drawingRect.origin.y = (yCenter - size.height*0.5)

//Aspectfit calculation
if boundsScale > imageScale {
drawingRect.size.width = drawingRect.size.height * imageScale
}else{
drawingRect.size.height = drawingRect.size.width / imageScale
}

image!.drawInRect(drawingRect)

let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

模拟器屏幕截图 Simulator

保存的图像 Saved

关于ios - 缩放、旋转和平移后保存编辑后的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281098/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com