使用stretchableImageWithLeftCapWidth调整图片大小

7
我正在尝试使用stretchableImageWithLeftCapWidth调整图片大小,它在模拟器上可以正常工作,但在设备上会出现垂直绿条。

我已经尝试使用imageNamed、imageWithContentOfFile和imageWithData来加载图像,但都没有改变。

UIImage *bottomImage = [[UIImage imageWithData:
     [NSData dataWithContentsOfFile:
    [NSString stringWithFormat:@"%@/bottom_part.png", 
     [[NSBundle mainBundle] resourcePath]]]] 
       stretchableImageWithLeftCapWidth:27 topCapHeight:9];

UIImageView *bottomView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 200+73, 100, 73)];
[self.view addSubview:bottomView];
UIGraphicsBeginImageContext(CGSizeMake(100, 73));
[bottomImage drawInRect:CGRectMake(0, 0, 100, 73)];
UIImage *bottomResizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
bottomView.image = bottomResizedImage;

看一下结果:绿色的条不应该出现,它们在模拟器上没有出现。 alt文本 http://www.quicksnapper.com/files/5161/96232162149F1C14751048_m.png
7个回答

11

你解决了这个问题吗?

似乎这可能是使用UIGraphicsGetImageFromCurrentImageContext时出现的错误。如果我绘制具有透明度的图像,我会得到红色/绿色伪影。这些只在设备上出现(而不是模拟器中)。另外,如果我从图像中删除透明度,这些伪影就会消失。

更新:还有一些奇怪的事情。之前我使用的是PNG格式,所以我尝试改用透明的gif。使用GIF,则在模拟器上显示伪影问题。

胜利!找到了一个解决方案:

在项目的构建设置中关闭“压缩PNG文件”选项。禁用此选项可以使PNG透明度正常工作,没有任何伪影。


5

看起来你写了很多不必要的代码,但可能是因为缺乏上下文和我所遗漏的更多内容。

获取图片的方法:

[[UIImage imageName: @"bottom_part.png"] stretchableImageWithLeftCapWidth: 27 topCapHeight: 9];

您在哪个代码部分显示此图像?即,在哪个方法调用中绘制上面的图像?

为什么不使用UIImageView并将图像放入其中?然后您就不需要执行任何图像上下文绘制操作等。


1
在我的情况下,我有一个UIImageView,我将其水平拉伸。我发现拉伸后的图像中有一条奇怪的垂直白线。
上面的解决方案对我没有用。然而,以下方法有效:
将宽度值转换为int值:
myNewViewFrame.size.width = (int)newWidth;
myView.frame = myNewViewFrame;

希望这对你们也有用...

谢谢 Henrik,我刚遇到同样的问题,这个解决了它。 - Echelon

0
昨晚我花了5个小时来调试,但在Xcode中禁用PNG压缩对我没有任何作用。
对于遇到UIImage API中stretchableImageWithLeftCapWidth方法出现垂直绿色条纹/线条/伪影的其他人 - 这篇文章是为你准备的。
我有一个21x30的自定义barbutton背景,我想要扩展它,但得到了与OP相同的绿色条纹。我发现使用Photoshop创建的PNG文件可以正常工作 - 我的是用Gimp制作的。 无论如何,从文件中删除所有块(除了三个必要的块)都没有任何区别。禁用PNG压缩也没有用。
对我有用的是:
  1. 在我的图像上方添加一个空行(现在是21x31)。
  2. 创建缩放图像时将topCapHeight设置为0。
  3. 当我使用我的缩放图像时,我会绘制到CGContext中,稍后用于制作UIImage。我使用以下代码进行绘制: [image drawInRect:CGRectMake(0,-2,width,32)];
这使问题消失了(对我而言)。
我认为这个错误/问题与绘制时垂直缩放有关,因此我强制缩放第一个源图像行(分成两行),这些行在我的组合之外绘制。
希望这能帮助某人节省5个小时。
/Krisb

0

我尝试像Nate建议的那样禁用PNG压缩,但这对我没有起作用(iOS 3.1.3)。然后我尝试使用TIFF图像代替PNG,这个方法有效。


0

当使用(0.5, 0.5, 0, 0)的值时,我发现在任何绘制内容的UIView上都存在contentStretch类似的问题,即在中心像素上进行拉伸。

我发现只有iPhone 3G(可能是2G)存在这个问题。iPhone 4和3GS没有问题。因此,我认为这是旧图形硬件的问题。

我找到的解决方法是在稍大的中心区域上进行拉伸。

例如(0.4, 0.4, 0.1, 0.1)


我同意并看到这些问题在3G上发生,但不会在3GS和4上出现。 - yeahdixon

0
我停止使用stretchableImageWithLeftCapWidth,转而使用UIView的更加良好的contentStretch属性。我从未见过你所描述的绿色条纹,但总的来说,我建议使用contentStretch而不是stretchableImageWithLeftCapWidth。

如何使用contentStretch获取端盖? - Adam

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