【问题标题】:Resize CGSize to the maximum with keeping the aspect-ratio在保持纵横比的情况下将 CGSize 调整到最大
【发布时间】:2016-10-26 01:42:55
【问题描述】:

我有一个CGSize 需要发送到我的服务器的对象。我可以发送到服务器的最大尺寸为 900*900(900 宽/900 高)。

有些对象比 900*900 更大,我想编写一个函数将它们调整到最大值(正如我已经说过的,最大值为 900*900),但要保持纵横比。

例如:如果我有一个 1,000 像素宽和 1,000 像素高的对象,我希望函数返回一个 900*900 的对象。如果我有一个宽度为 1920 像素、高度为 1080 像素的对象,我希望它在保持比率的情况下返回可能的最大尺寸。

有人知道我该怎么做吗?

谢谢!

OriginalUser2 答案:

我试过这段代码:

let aspect = CGSizeMake(900, 900)
let rect = CGRectMake(0, 0, 1920, 1080)

let final = AVMakeRectWithAspectRatioInsideRect(aspect, rect)

final{x 420 y 0 w 1,080 h 1,080},我不明白为什么x = 420,但无论如何1080*10801920*1080 的纵横比不同,而且比900*900 大。

你能再解释一下吗?

【问题讨论】:

  • @originaluser2 我不需要它来适应CGRect,只是为了获得最大尺寸
  • 好的,所以传入CGPointZero作为原点,然后输出大小
  • @originaluser2 嘿,谢谢,我已经编辑了我的问题并为您提供了答案,请看一下,谢谢!

标签: objective-c c swift algorithm cocoa-touch


【解决方案1】:

您可以使用 AVFounation 框架中的 AVMakeRect(aspectRatio:insideRect:) 函数来执行此操作。

您的代码的问题是值的舍入方式错误。 insideRect: 参数应该是适合您大小的矩形,aspectRatio: 应该是您想要在保持纵横比的情况下缩放的原始大小。

例如:

import AVFoundation

// Original size which you want to preserve the aspect ratio of.
let aspect = CGSize(width: 1920, height: 1080)

// Rect to fit that size within. In this case you don't care about fitting
// inside a rect, so pass (0, 0) for the origin.
let rect = CGRect(x: 0, y: 0, width: 900, height: 900)

// Aspect fitted size, in this case (900.0, 506.25)
let result = AVMakeRect(aspectRatio: aspect, insideRect: rect).size

【讨论】:

  • 更改为 *import AVKit - 这太棒了
  • @n13 我在AVKit docs 中看不到AVMakeRect(aspectRatio:insideRect:) - 仅作为AVFoundation's functions 的一部分。
  • ^ 你是对的。我使用了 import AVKit 因为 AVFoundation 出现了一个删除线,好像它已被弃用(它不是,只是检查过)。删除了 AVKit,它仍然有效。 XCode 8 / 斯威夫特 3.
【解决方案2】:

这段代码可以大大减少和修改,但为了清楚起见:

if myImage.width == myImage.height {
    // New image will be 900px by 900px
    newImage.width = (900 / myImage.width) * myImage.width
    newImage.height = (900 / myImage.height) * myImage.height
} else if myImage.width > myImage.height {
    // New image will have width of 900px
    newImage.width = (900 / myImage.width) * myImage.width
    newImage.height = (900 / myImage.width) * myImage.height
} else {
    // New Image will have height of 900px
    newImage.width = (900 / myImage.height) * myImage.width
    newImage.height = (900 / myImage.height) * myImage.height
}

在这个 sn-p 中,900 是调整后图像的最大宽度和高度,但这个值可以抽象为你想要的任何值的变量。

【讨论】:

  • 问题是我没有图像大小,我传递PHImageManagerMaximumSize,所以我需要先获取完整图像,然后获取所需的大小并再次获取?
  • 首先,您需要在问题中说明这一点。其次,我不确定你的意思;最初获取图像后,您不能使用此代码吗?
  • 哦,对不起。我的意思是我使用fetchImage(asset: size:),所以我需要提前提供尺寸。在您在评论中写的方法中,我需要知道图像的完整尺寸。那么我是否需要获取完整尺寸的图像,他们调用您的方法并获取新的CGSize,然后以新尺寸再次获取图像?
  • 我不熟悉PHImageManager 类。如果有一种方法可以在不获取整个图像的情况下检索图像的尺寸(例如getImageSize(asset: ) 或其他东西),那么您应该使用它。如果没有,你将不得不按照你说的那样去做。
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 2021-07-21
  • 2010-12-03
  • 2013-05-12
  • 1970-01-01
  • 2020-06-14
  • 2013-06-26
相关资源
最近更新 更多