如何使用Open GL ES裁剪图像?

时间:2014-11-01 12:25:58

标签: ios iphone opengl-es uiimage ios8

因此,当我处理图像裁剪时,我遇到了一些问题。我知道有两种可能的方法:UIGraphicsBeginImageContextWithOptions结合drawAtPoint:blendMode:方法和CGImageCreateWithImageInRect。它们都有效但有一些严重的缺点:第一种方式需要花费很多时间(在我的情况下约为7秒)和内存(我收到内存警告)(假设我裁剪了用​​iPhone相机拍摄的图像);第二个以旋转的图像结束,这样你就需要放一堆代码来打败我不想要的这种行为。我想知道的是,例如,苹果内置的“照片”应用程序的编辑功能,或Aviary或任何其他照片编辑器。考虑到苹果的编辑器(iOS 8),你可以旋转图像,更改裁剪矩形,它们在裁剪矩形之外也有模糊(!)等等,但是当你应用裁剪时,它需要最多8 mb的内存并立即发生。他们是如何做到的?

我唯一的想法是他们使用GPU的潜力(例如Aviary)。因此,如果我们将所有这些问题合二为一,那么我如何使用Open GL来减少操作的痛苦?我从来没有使用它,所以任何tuts,链接和来源都是受欢迎的。谢谢你。

1 个答案:

答案 0 :(得分:0)

如前所述,这很可能不是用openGL完成的,但即使......

大多数人的问题是得到应该显示图像的矩形,解决方案看起来像这样:

- (CGRect)fillSizeForSource:(CGRect)source target:(CGRect)target
{
    if(source.size.width/source.size.height > target.size.width/target.size.height)
    {
        // keep target height and make the width larger
        CGSize newSize = CGSizeMake(target.size.height * (source.size.width/source.size.height), target.size.height);
        return CGRectMake((target.size.width-newSize.width)*.5f, .0f, newSize.width, newSize.height);
    }
    else
    {
        // keep target width and make the height larger
        CGSize newSize = CGSizeMake(target.size.width, target.size.width * (source.size.height/source.size.width));
        return CGRectMake(.0f, (target.size.height-newSize.height)*.5f, newSize.width, newSize.height);
    }
}

- (CGRect)fitSizeForSource:(CGRect)source target:(CGRect)target
{
    if(source.size.width/source.size.height < target.size.width/target.size.height)
    {
        // keep target height and make the width smaller
        CGSize newSize = CGSizeMake(target.size.height * (source.size.width/source.size.height), target.size.height);
        return CGRectMake((target.size.width-newSize.width)*.5f, .0f, newSize.width, newSize.height);
    }
    else
    {
        // keep target width and make the height smaller
        CGSize newSize = CGSizeMake(target.size.width, target.size.width * (source.size.height/source.size.width));
        return CGRectMake(.0f, (target.size.height-newSize.height)*.5f, newSize.width, newSize.height);
    }
}

我没有测试过这个。

或者,因为您在iOS上,只需创建一个具有所需大小的图像视图,向其添加图像,然后获取图像的屏幕截图。