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

如何在ios中使用3D效果调整图像大小。,ios,iphone,image-processing,swift3,image-resizing,Ios,Iphone,Image Processing,Swift3,Image Resizing,我想调整图像大小,并通过拾取任意角拉伸图像。 供参考。我想在ios native中使用CGContext或BazirPath开发相同的效果 请让我知道如何在ios中做这样的事情。提供进行此类图像操作的任何参考。我的项目在swift 3中。所以这是我的首选 如果您只想更改角点,则过滤器将允许您执行此操作。如果您希望能够像在photoshop中那样以bezier路径编辑所有网格点,并调整图像扭曲,则需要执行一些3D数学,将面片细分为三角形,并将图像作为纹理应用于生成的几何体 无论如何,这里有一个游乐

我想调整图像大小,并通过拾取任意角拉伸图像。 供参考。我想在ios native中使用CGContext或BazirPath开发相同的效果

请让我知道如何在ios中做这样的事情。提供进行此类图像操作的任何参考。我的项目在swift 3中。所以这是我的首选

如果您只想更改角点,则过滤器将允许您执行此操作。如果您希望能够像在photoshop中那样以bezier路径编辑所有网格点,并调整图像扭曲,则需要执行一些3D数学,将面片细分为三角形,并将图像作为纹理应用于生成的几何体

无论如何,这里有一个游乐场,演示了如何使用密码透视变换:

    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)

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

如果从零开始,这种转换就不那么容易,即使CoreGraphic功能强大,学习的过程也很艰难

正如您在这里看到的,它基于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
#导入
#进口
#进口
#导入“AGKBaseDefines.h”
开始吧
CGImageRef CgImageDrawwith CATTransferorM3D_AGK(CGImageRef imageRef,
CATTransformorM3D转换,
CGPoint主播点,
CGSize大小,
CGFloat scale)CF_返回保留的值;
AGK_EXTERN_C_END

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

垂直效应

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

let group = UIMotionEffectGroup()
group.motionEffects = [horizontalMotionEffect, verticalMotionEffect]
myBackgroundView.addMotionEffect(group)
水平效应

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

let group = UIMotionEffectGroup()
group.motionEffects = [horizontalMotionEffect, verticalMotionEffect]
myBackgroundView.addMotionEffect(group)

看看我的答案。这是同样的事情,但问题是关于使用WindowsGDI而不是iOS的核心图形。但是,答案与平台无关。@答案图像中的user1118321是正确的。但是我想要openGL中的源代码或任何参考。