【问题标题】:How to show in UIImage just a part of image?如何在 UIImage 中只显示图像的一部分?
【发布时间】:2012-12-26 16:37:24
【问题描述】:

我有 UIImageView,我在其中显示 50x100 图像。

我只想显示 50x50 图像的一部分(顶部)?

我该怎么做?

【问题讨论】:

标签: iphone objective-c ios uiimageview uiimage


【解决方案1】:

在UIImageView中移动大图的非常简单的方法如下。

让我们有一个大小为 (100, 400) 的图像,它代表某张图片的 4 种状态。我们想在大小为 (100, 100) 的正方形 UIImageView 中显示第二张 offsetY = 100 的图片。 解决办法是:

UIImageView *iView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
CGRect contentFrame = CGRectMake(0, 0.25, 1, 0.25);
iView.layer.contentsRect = contentFrame;
iView.image = [UIImage imageNamed:@"NAME"];

这里 contentFrame 是相对于真实 UIImage 大小的标准化框架。 所以,“0”意味着我们从左边框开始图像的可见部分, “0.25”意味着我们有垂直偏移100, “1”表示我们要显示图像的全宽, 最后,“0.25”表示我们只想显示图像高度的 1/4。

因此,在局部图像坐标中,我们显示以下帧

CGRect visibleAbsoluteFrame = CGRectMake(0*100, 0.25*400, 1*100, 0.25*400)
or CGRectMake(0, 100, 100, 100);

【讨论】:

  • 这个问题的一个问题是,如果行数和列数不是 2 的幂,那么分数将不准确,并且“visibleSbsoluteFrame”不会在精确的整数坐标上
【解决方案2】:

您可以使用CGImageCreateWithImageInRect 裁剪图像,这是在 CGImageRef 上工作的 Quartz 原语,因此您会得到类似的东西:

CGImageRef imageRef = CGImageCreateWithImageInRect(originalImage.CGImage, cropRect);
UIImage* outImage = [UIImage imageWithCGImage:imageRef scale:originalImage.scale orientation:originalImage.imageOrientation]]; 
CGImageRelease(imageRef);

在计算cropRect时,请记住它应该以像素而不是点为单位给出,即:

float scale = originalImage.scale;
CGRect cropRect = CGRectMake(0, 0,
                         originalImage.size.width * scale, originalImage.size.height * 0.5 * scale);

0.5 因素说明您只想要上半部分。

如果您不想使用低级别,可以将图像添加到UIView 作为背景颜色,并使用clipToBounds CALayer 属性进行剪切:

myView.backgroundColor = [UIColor colorWithBackgroundPattern:myImage];
myView.layer.clipToBounds = YES;

另外,相应地设置myView 边界。

【讨论】:

  • 这对内存使用不是很不利吗?因为我会每 10 秒使用一次。
  • 嗯,它的计算成本并不高,我会试一试,看看会发生什么。最后,10 秒对于一个需要毫秒执行的操作来说是很长的时间......
  • 伟大的塞尔吉奥,对不起,但我不想搞乱内存使用。 Srikar 接近解决方案。
【解决方案3】:

我可能会为您提供解决方案。看看这是否有效。在 Interface Builder 中有一个关于图像内容填充属性的选项。您可以将其设置为top-left。按照界面生成器中的图像 -

在此之后将UIImageView 的大小设置为 50x50,并选中“clip-subviews”...

【讨论】:

  • 这是一个很好的解决方案,正是我想要的,但有一个小问题。原始图像为 120x60。 :(所以我首先需要设置为 100x50,而不是只显示顶部 50x50。有什么解决方案吗?
  • 太酷了!很高兴我的解决方案有所帮助。回答您的评论。我相信您根本不需要按照其他解决方案进行任何调整大小。只需在 50x50 uiimageview 中渲染您的图像,设置为从顶部填充。为该 imageView 选择剪辑子视图。这样,50x50 正方形之外的任何图像部分都将被剪裁。这几乎把所有繁重的工作都交给了 iOS。
猜你喜欢
  • 2020-05-24
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多