绘制UIImage的选定区域

7

我有一个UIImage,其中包含一张图像,上面有许多小图片(本质上是包含精灵的图像条)。我想在我的UIView上绘制一个单独的精灵。

我似乎找不到一种方法只将UIImage的一部分绘制到视图上。是否有一种可以做到这一点的方法?

3个回答

8
我想你可能正在寻找CGImageCreateWithImageInRect()。您可以使用同名属性UIImage中获取CGImage
编辑:另一个选项是SpriteKit,它在2014年推出,而2009年没有。根据需要使用精灵表的情况,这可能会很有用。

不错 @Sixten,我认为这更像他想要的 +1 - Brock Woolf
完美运行(除了在绘制时CGImages被翻转带来的一些头痛)。谢谢。 - rein
2
我为处理精灵表编写了一个UIImage类别。看看这个链接,可能会有所帮助:http://reecon.wordpress.com/2011/11/19/uiimage-sprite-additions-objective-c/ - Rafał Sroka
这种方法会影响性能,特别是在绘图密集的情况下。有没有一种方法可以不重新创建图像的部分,而只是使用给定UIImage实例中可用的位图数据? - vir us
文档的措辞强烈暗示这个函数确实重用了现有的位图数据,只是改变了该数据中哪些部分“在”图像中的边界。但是肯定有Quartz函数可以访问底层位图数据。 - Sixten Otto

3

2

没错,你可以使用Quartz实现。

这里有一个教程,向您展示如何获取UIImage并对其进行遮罩处理。

http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

以下是该页面上的代码(以防该页面因某些原因而关闭)

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
        CGImageGetHeight(maskRef),
        CGImageGetBitsPerComponent(maskRef),
        CGImageGetBitsPerPixel(maskRef),
        CGImageGetBytesPerRow(maskRef),
        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
    return [UIImage imageWithCGImage:masked];

}

这是很棒的东西,我一定会收藏它,但我不想为此创建一个遮罩。我只想做类似于:[[UIImage imageNamed:@"myimage"] drawInRect:CGMakeRect(10,10,50,50) fromRect:CGMakeRect(60,60,50,50)]; 的事情。 - rein

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