c# - 使用 GPU(可能是 CIFilters)将图像放置在更大的 Canvas 尺寸上而不使用图像上下文

标签 c# ios xamarin.ios gpu core-image

假设我有一张 100x100 的图片。我想将图像放在更大的 500x500 Canvas 上。

我目前的做法是使用 UIGraphics 创建一个上下文,然后将图像绘制到上下文中。

UIGraphics.BeginImageContext(....);
ImageView.Draw (....);

效果很好,但速度不如我希望的那样快。我注意到 CIFilters 非常快。 有没有一种方法可以使用 CIFilters 或其他使用 GPU 而不是 CPU 的方法将图像放置在更大的 Canvas 上?我已经尝试过 CIFilters CICrop 和 CIPerspectiveTransform 但我可以'似乎得到了我想要的结果......

enter image description here
原始图像 100x100

enter image description here

我想要的结果图像为 500x500。我只是想获取图像并使用 CIFilter 或一些 GPU 操作增加它的 Canvas 大小。

我尝试使用 CICrop 进行“反向裁剪”,但没有成功。请注意,我将 CIVector 的大小指定为 500x500,即使图像本身是 100x100,结果图像完全忽略了额外的空间并在关闭时被截断。这是我的代码:

        CICrop crop = new CICrop();
        crop.Image = ImageView.Image.CGImage;
        crop.Rectangle = new CIVector(0, 0, 500, 500);
        ImageView.Image = new UIImage(crop.OutputImage);
        Console.WriteLine("ImageView.Image.size = "+ ImageView.Image.Size);

最佳答案

裁剪滤镜无法达到您的目的 - 您无法使用裁剪滤镜缩放输入图像的大小。来自维基百科:裁剪是指移除图像的外部部分以改善取景、突出主题或改变纵横比。

您需要的是比例过滤器。要使用 CoreImage 实现此目的,您需要执行以下操作:

CIImage *input = [CIImage imageWithCGImage: ImageView.Image.CGImage]; // input image is 100 X 100
CGAffineTransform transform = CGAffineTransformMakeScale(5.0f, 5.0f); // Scale by 5 times along both dimensions
CIImage *output = [input imageByApplyingTransform: transform];
// output image is now 500 X 500

关于c# - 使用 GPU(可能是 CIFilters)将图像放置在更大的 Canvas 尺寸上而不使用图像上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15990878/

相关文章:

ios - 我使用 coreData 保存数据,但对象仍然为零

c# - 系统.TypeLoadException : 'VTable setup of type AndroidX.AppCompat.View.Menu.MenuItemImpl failed'

c# - 添加 Azure AD 身份验证时出现 CORS 错误

ios - 在整个应用程序中共享 Twitter 详细信息

objective-c - iOS 应用程序可以访问设备视频库中视频的字幕或隐藏式字幕吗?

ipad - 单点触控崩溃: Replace UINavigationController A with B and Push UiViewControllers on B

c# - 如何在asp.net中的jqgrid中的每一行添加一个按钮

c# - 如何从 .net 中的 MySql 过程中选择输出参数

ios - iOS 9 之前的 Xamarin UIStackView

c# - MvvmCross 和 MonoTouch : remove top bar