我怎样才能动态地使用 CGRect()?
How can I use CGRect() dynamically?
我有以下 scene example,我可以在其中根据选择(红色方块)裁剪图像。
该正方形具有动态高度和宽度 - 基于这一事实,我想使用选定的高度和宽度来裁剪红色正方形内部的内容。
我用于裁剪的函数来自 Apple developer,看起来像这样:
func cropImage(_ inputImage: UIImage, toRect cropRect: CGRect, viewWidth: CGFloat, viewHeight: CGFloat) -> UIImage?
{
let imageViewScale = max(inputImage.size.width / viewWidth,
inputImage.size.height / viewHeight)
// Scale cropRect to handle images larger than shown-on-screen size
let cropZone = CGRect(x:cropRect.origin.x * imageViewScale,
y:cropRect.origin.y * imageViewScale,
width:cropRect.size.width * imageViewScale,
height:cropRect.size.height * imageViewScale)
// Perform cropping in Core Graphics
guard let cutImageRef: CGImage = inputImage.cgImage?.cropping(to:cropZone)
else {
return nil
}
// Return image to UIImage
let croppedImage: UIImage = UIImage(cgImage: cutImageRef)
return croppedImage
}
现在。我想使用给定的高度和宽度来裁剪该选区。
let croppedImage = cropImage(image!, toRect: CGRect(x:?? , y:?? , width: ??, height: ??), viewWidth: ??, viewHeight: ??)
为了根据上述动态选择裁剪图像,这些参数应该填写什么?
好的,我们假设您的图像位于 imageView
中,它位于您屏幕的某个位置。 rect
是一个变量,您选择的帧(与 imageView.frame 相关)存储在其中。所以结果是:
let croppedImage = cropImage(image!, toRect: rect, viewWidth: imageView.width, viewHeight: imageView.height)
好的,因为您只有 width
和 height
裁剪形状的信息。 x
和 y
需要您自己计算。
首先,让我们考虑这些信息:
// let's pretend this is a sample of size that your crop tool provides to you
let cropSize = CGSize(width: 120, height: 260)
接下来,您需要获取图像的显示 大小(width
和height
)。此处的显示尺寸是图像的帧尺寸,而不是图像本身的尺寸。
// again, lets pretend it's just a frame size of your image
let imageSize = CGSize(width: 320, height: 480)
有了这些信息,您就可以获得x
和y
组成一个CGRect
,然后提供给您想要的裁剪功能。
let x = (imageSize.width - cropSize.width) / 2
let y = (imageSize.height - cropSize.height) / 2
现在,您可以创建一个矩形来像这样裁剪图像:
let cropRect = CGRect(x: x, y: y, width: cropSize.width, height: cropSize.height)
使用 cropRect
,您可以在问题中提到的 cropping
或 cropImage
函数上使用。
我已经使用了您所有答案中的信息,尤其是@matt 的评论,这是最终解决方案。
使用我的红色方块返回的输入值,我将原来的 Crop 函数应用到这个:
func cropImage(_ inputImage: UIImage, width: Double, height: Double) -> UIImage?
{
let imsize = inputImage.size
let ivsize = UIScreen.main.bounds.size
var scale : CGFloat = ivsize.width / imsize.width
if imsize.height * scale < ivsize.height {
scale = ivsize.height / imsize.height
}
let croppedImsize = CGSize(width:height/scale, height:width/scale)
let croppedImrect =
CGRect(origin: CGPoint(x: (imsize.width-croppedImsize.width)/2.0,
y: (imsize.height-croppedImsize.height)/2.4),
size: croppedImsize)
let r = UIGraphicsImageRenderer(size:croppedImsize)
let croppedIm = r.image { _ in
inputImage.draw(at: CGPoint(x:-croppedImrect.origin.x, y:-croppedImrect.origin.y))
}
return croppedIm
}
我有以下 scene example,我可以在其中根据选择(红色方块)裁剪图像。
该正方形具有动态高度和宽度 - 基于这一事实,我想使用选定的高度和宽度来裁剪红色正方形内部的内容。
我用于裁剪的函数来自 Apple developer,看起来像这样:
func cropImage(_ inputImage: UIImage, toRect cropRect: CGRect, viewWidth: CGFloat, viewHeight: CGFloat) -> UIImage?
{
let imageViewScale = max(inputImage.size.width / viewWidth,
inputImage.size.height / viewHeight)
// Scale cropRect to handle images larger than shown-on-screen size
let cropZone = CGRect(x:cropRect.origin.x * imageViewScale,
y:cropRect.origin.y * imageViewScale,
width:cropRect.size.width * imageViewScale,
height:cropRect.size.height * imageViewScale)
// Perform cropping in Core Graphics
guard let cutImageRef: CGImage = inputImage.cgImage?.cropping(to:cropZone)
else {
return nil
}
// Return image to UIImage
let croppedImage: UIImage = UIImage(cgImage: cutImageRef)
return croppedImage
}
现在。我想使用给定的高度和宽度来裁剪该选区。
let croppedImage = cropImage(image!, toRect: CGRect(x:?? , y:?? , width: ??, height: ??), viewWidth: ??, viewHeight: ??)
为了根据上述动态选择裁剪图像,这些参数应该填写什么?
好的,我们假设您的图像位于 imageView
中,它位于您屏幕的某个位置。 rect
是一个变量,您选择的帧(与 imageView.frame 相关)存储在其中。所以结果是:
let croppedImage = cropImage(image!, toRect: rect, viewWidth: imageView.width, viewHeight: imageView.height)
好的,因为您只有 width
和 height
裁剪形状的信息。 x
和 y
需要您自己计算。
首先,让我们考虑这些信息:
// let's pretend this is a sample of size that your crop tool provides to you
let cropSize = CGSize(width: 120, height: 260)
接下来,您需要获取图像的显示 大小(width
和height
)。此处的显示尺寸是图像的帧尺寸,而不是图像本身的尺寸。
// again, lets pretend it's just a frame size of your image
let imageSize = CGSize(width: 320, height: 480)
有了这些信息,您就可以获得x
和y
组成一个CGRect
,然后提供给您想要的裁剪功能。
let x = (imageSize.width - cropSize.width) / 2
let y = (imageSize.height - cropSize.height) / 2
现在,您可以创建一个矩形来像这样裁剪图像:
let cropRect = CGRect(x: x, y: y, width: cropSize.width, height: cropSize.height)
使用 cropRect
,您可以在问题中提到的 cropping
或 cropImage
函数上使用。
我已经使用了您所有答案中的信息,尤其是@matt 的评论,这是最终解决方案。
使用我的红色方块返回的输入值,我将原来的 Crop 函数应用到这个:
func cropImage(_ inputImage: UIImage, width: Double, height: Double) -> UIImage?
{
let imsize = inputImage.size
let ivsize = UIScreen.main.bounds.size
var scale : CGFloat = ivsize.width / imsize.width
if imsize.height * scale < ivsize.height {
scale = ivsize.height / imsize.height
}
let croppedImsize = CGSize(width:height/scale, height:width/scale)
let croppedImrect =
CGRect(origin: CGPoint(x: (imsize.width-croppedImsize.width)/2.0,
y: (imsize.height-croppedImsize.height)/2.4),
size: croppedImsize)
let r = UIGraphicsImageRenderer(size:croppedImsize)
let croppedIm = r.image { _ in
inputImage.draw(at: CGPoint(x:-croppedImrect.origin.x, y:-croppedImrect.origin.y))
}
return croppedIm
}