如何将imageview转换和放大为一个形状(swift3)

时间:2017-03-24 18:26:04

标签: ios swift swift3 imageview shape

我要做的是采用方形图像视图,使其成为一个5点的图像视图,其顶部和底部为3点三角形,底部为点。

enter image description here

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

}

我想把顶部做得更大,并保持下半部的大小相同。我不想掩盖或剪切原始图像的某些部分。我希望通过拉伸而不是遮蔽来实际塑造更大的图像。我在这个网站上没有看到任何解释如何做到这一点或是否有可能。

3 个答案:

答案 0 :(得分:2)

如果您不想使用蒙版进行裁剪,则会出现非常奇怪的扭曲图像。如果您确实非常确定这是您想要的,您可以使用https://github.com/Ciechan/BCMeshTransformView首先向下移动所有点,然后设置它的动画以仅向上移动中心点。类似的东西:

BCMeshVertex vertices[] = {
    {.from = {0.0, 0.0}, .to= {0.0, 0.5, 0.0}},
    {.from = {1.0, 0.0}, .to= {1.0, 0.5, 0.0}},
    {.from = {1.0, 1.0}, .to= {1.0, 1.0, 0.0}},
    {.from = {0.0, 1.0}, .to= {0.0, 1.0, 0.0}},
};

然后当你想把它变成一个房子时,将矢量更新为:

BCMeshVertex vertices[] = {
    {.from = {0.0, 0.0}, .to= {0.0, 0.5, 0.0}},
    {.from = {0.5, 0.0}, .to= {0.0, 0.0, 0.0}},
    {.from = {1.0, 0.0}, .to= {1.0, 0.5, 0.0}},
    {.from = {1.0, 1.0}, .to= {1.0, 1.0, 0.0}},
    {.from = {0.0, 1.0}, .to= {0.0, 1.0, 0.0}},
};

这将产生一个奇怪的网格,像Warp \ bend effect on a UIView?这样的扭曲效果 - 这非常肯定会看起来非常难看。但这就是你要求的。 (使用CAShapeLayer屏蔽图像有一个更简单的解决方案。)

答案 1 :(得分:0)

你可以参考

this answer

当我的任何问题为此提供代码但是,现在你表明帮助与否..我尽我所能..

示例:

// This form will have user name which is a string
import { Storage } from '@ionic/storage';
logForm(form) {
    if (form.valid) {
        console.log(form.value);
        this.myData = form.value;
        this.setData();
    }
}
setData(){
    this.storage.set('userObj', JSON.stringify(this.myData));
    this.getData();
}
getData(){ 
    this.storage.get('userObj').then((data) => {
        console.log("get data", JSON.parse(data));

    });

}

答案 2 :(得分:0)

我真的没有看到在新的BezierPath中再创建一个点并使用相同的fillColor,Stroke等绘制新图像的问题。 你可以使用像这样的扩展......

public class 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()
    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
}