如何使用3D效果调整ios中的图像大小。

时间:2016-11-09 14:01:05

标签: ios iphone image-processing swift3 image-resizing

我想通过挑选任何角落来调整图像大小并拉伸图像。 供参考Check Video。我想使用CGContext或使用BazirPath在ios native中开发相同的效果。

请告诉我如何在ios中做这样的事情。提供任何参考来进行这种图像操作。我的项目很快3.所以这是我的首选。

3 个答案:

答案 0 :(得分:2)

github上有一个库:(它是用Objective-C开发的,但你可以在你的Swift 3项目中使用它)

如果从头开始,这种转变并不那么容易,即使CoreGraphic功能强大,学习坡度也很难。

https://github.com/agens-no/AGGeometryKit

正如您在此处所看到的,它基于CoreGraphic,因此您可以使用CGContext和UIBezierPath

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIKit.h>

#import "AGKBaseDefines.h"

AGK_EXTERN_C_BEGIN

CGImageRef CGImageDrawWithCATransform3D_AGK(CGImageRef imageRef,
                                            CATransform3D transform,
                                            CGPoint anchorPoint,
                                            CGSize size,
                                            CGFloat scale) CF_RETURNS_RETAINED;

AGK_EXTERN_C_END

答案 1 :(得分:1)

CIPerspectiveTransform过滤器可让您执行此操作,只需更改角落即可。如果您希望能够将所有网格点编辑为像photoshop中的bezier路径并且要调整图像扭曲,那么您需要进行一些3D数学运算,将补丁镶嵌到三角形并将图像作为纹理应用于产生几何。

无论如何,这里有一个操场,说明如何使用CIPerspective转换:

    import UIKit
    import PlaygroundSupport

    let uiImage = UIImage(named: "a.png")!
    let image = CIImage(image: uiImage)!
    let filter = CIFilter(name: "CIPerspectiveTransform")!
    let topLeft = CGPoint(x: -10, y: 0)
    let bottomLeft = CGPoint(x: 100, y: uiImage.size.height)
    let topright = CGPoint(x: uiImage.size.width, y: -20)
    let bottomright = CGPoint(x: uiImage.size.width, y:uiImage.size.height)

    filter.setValue(CIVector(cgPoint:topLeft), forKey: "inputTopLeft")
    filter.setValue(CIVector(cgPoint:topright), forKey: "inputTopRight")
    filter.setValue(CIVector(cgPoint:bottomright), forKey: "inputBottomRight")
    filter.setValue(CIVector(cgPoint:bottomLeft), forKey: "inputBottomLeft")
    filter.setValue(image, forKey: kCIInputImageKey)
    let transformedImage = UIImage(ciImage: filter.outputImage!)

    PlaygroundPage.current.liveView = UIImageView(image: transformedImage)

答案 2 :(得分:0)

您可以设置水平效果和垂直效果:

垂直效果

<div id="mychatcontainer"></div>

横向效果

let verticalMotionEffect = UIInterpolatingMotionEffect(keyPath: "center.y",
type: .TiltAlongVerticalAxis)
verticalMotionEffect.minimumRelativeValue = -10
verticalMotionEffect.maximumRelativeValue = 10