【发布时间】:2017-03-24 18:26:03
【问题描述】:
我想要做的是取一个正方形的图像视图,并使其成为一个 5 点的图像视图,顶部和底部的 3 点三角形形状到底部的点。
public func shapeImage(with bezierPath: UIBezierPath, size: CGSize, fillColor: UIColor? = UIColor.clear,
strokeColor: UIColor? = nil, strokeWidth: CGFloat = 0.0) -> UIImage! {
UIGraphicsBeginImageContext(size)
let context = UIGraphicsGetCurrentContext()
var image = UIImage(data: try! Data(contentsOf: URL(string:"https://a248.e.akamai.net/secure.meetupstatic.com/photos/member/5/3/5/e/highres_260901342.jpeg")!))!
if let context = context {
context.saveGState()
context.addPath(bezierPath.cgPath)
if let strokeColor = strokeColor {
strokeColor.setStroke()
context.setLineWidth(strokeWidth)
} else {
UIColor.clear.setStroke()
}
fillColor?.setFill()
context.drawPath(using: .fillStroke)
image = UIGraphicsGetImageFromCurrentImageContext()!
context.restoreGState()
UIGraphicsEndImageContext()
}
return image
}
我想把顶部做得更大,并保持下半部分的大小相同。我不想屏蔽或剪切原始图像的某些部分。我想通过拉伸而不是遮罩来使图像更大。我在这个网站上没有看到任何解释如何做到这一点或如果可能的话。
【问题讨论】:
-
假设“绿色”部分是图像——即使不是——如果没有某种掩蔽,这可能是不可能的。从 4 点四边形到 5 点六边形(原文如此?)几乎必须包括遮罩或裁剪。您是否有机会为您正在尝试做的事情添加更多细节?现在,我最好的想法是以某种方式使用 CIPerspectiveCorrection - 但即使这样也使用 4 点四边形。 (您甚至可能需要深入研究几何细节。)
-
不关心是否使用掩码。我只是不想剪掉图像的任何部分。
-
仔细想想,透视校正也无济于事。您需要一种通过拖动单个点来“拉伸”图像的方法。我确信它可以完成 - 但它很可能需要像素级别的 OpenGL 脚本语言 (GLSL)。我做了一些编码,但不是那个特别的东西。如果你知道它,它可能需要所谓的 CI 扭曲内核,因为你需要知道“拉伸”的周围像素。希望我能提供更多帮助(你给了我一个应用程序的想法)!希望其他人的答案比我好得多。
-
杰森,你的例子解释性不够。假设图像不是简单的固定颜色,而是像代码中的图像更复杂的东西,你期望得到什么?例如,如果原始图像很简单 linear gradient 并且新的中上点位于原始图像的 2 倍高度,那么新图像应该是什么样子?在原始顶部边框的中间会是黄色(渐变的中间)吗?
-
@SergGr 使用您的线性渐变示例,所有可能发生的情况是相同的线性结构会更大。我看起来你的盒子是 300 x 300。我试图只在 300 x 500 的五边形中制作同样的东西。我主要是在尝试遵循这个例子,但这是在 swift 2 stackoverflow.com/questions/33163317/…。
标签: ios swift swift3 imageview shape