使用GPU(可能是CIFilters)在不使用Image Context的情况下将图像放置在较大画布尺寸上

3

假设我有一张100x100的图片。我想把这张图片放到一个更大的500x500的画布上。

我的目前方法是使用UIGraphics创建一个Context,然后将图片绘制到该Context上。

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

这很好,但对于我正在进行的工作来说速度还不够快。我注意到CIFilters非常快。有没有一种方法可以使用CIFilters或其他使用GPU而不是CPU的方法将图像放置在较大的画布上?我已经尝试使用CIFilters的CICrop和CIPerspectiveTransform,但似乎无法获得所需的结果...
我的期望结果是一个500x500的图像。我只想使用CIFilters或某些GPU操作来扩展图像的画布大小。
我尝试使用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);
1个回答

4

裁剪滤镜不能达到您的目的 - 您无法使用裁剪滤镜缩放输入图像的大小。 根据维基百科:裁剪是指去除图像的外部部分,以改善构图,突出主题或更改宽高比。

您需要的是缩放滤镜。 要使用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

我确实知道如何裁剪。我只是试图想出一个巧妙的方式,通过使用CIFilters来改变图像的画布大小,因为CI Filters 很快!缩放实际上不能实现我想要实现的目标。缩放会缩放整个图像,我希望图像本身保持相同的大小/尺寸,但只增加画布(即向图像添加空白或空白空间)。可以将其视为在Photoshop中打开100x100图像,然后将画布大小更改为500x500的操作。 - LampShade
@LampShade - 对不起,我想我误解了你的问题!我认为你可以通过使用source-over合成滤镜(https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html#//apple_ref/doc/filter/ci/CISourceOverCompositing)来实现你所需要的效果。Source-Over过滤器背景图像= [CIImage imageWithColor:white]; 输入图像=您的100X100图像; 然后将此滤镜链接到500X500裁剪滤镜。裁剪滤镜的输出应该是你要找的东西? - terapixel
听起来应该可以,但我一直在苦苦挣扎的是如何将100x100的图像精确地定位到我想要的位置?在Source-Over滤镜之后,100x100的图像位置总是X-0,Y-0。如果我想让它成为X-50,Y-152怎么办?我似乎无法定位它...有什么想法吗?误解不用担心! - LampShade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接