使用CATiledLayer,渲染时Tiles之间的细线,使用ImageMagick生成的切片

时间:2010-11-19 17:26:46

标签: iphone uiscrollview imagemagick tiles catiledlayer

使用Apple和I​​mageMagick的PhotoScroller示例,我设法构建了我的目录应用程序。

但我有一个渲染错误。平铺图像在它们之间用细线渲染。

我使用ImageMagick的简单脚本是:

#!/bin/sh

file_list=`ls | grep JPG`

for i in 100 50 25; do 
 for file in $file_list; do
  convert $file -scale ${i}%x -crop 256x256 -set filename:tile "%[fx:page.x/256]_%[fx:page.y/256]" +repage +adjoin "${file%.*}_${i}_%[filename:tile].${file#*.}"
 done
done

Apple的代码是一样的。奇怪的是,他们提供的图像就像一个魅力一样,在同一个运行时间,与我的图像并排:(

我的第一个猜测是,磁贴的大小与代码上的计算不匹配,但更改大小无法修复,无论是在我的脚本还是在代码中。我的图像通常比苹果提供的图像小,实际上只有一半。

任何人都有同样的问题吗?

3 个答案:

答案 0 :(得分:9)

我遇到两种解决方案都有问题。 Damien的方法并没有完全消除所有缩放比例的线条,布伦特的解决方案删除了​​线条,但在瓷砖边框添加了一些文物。

在谷歌搜索了一段时间之后,我终于找到了一个适合我的解决方案:http://openradar.appspot.com/8503490(由 zephyr.renner评论)。

毕竟,Apple假设CTM.a == CTM.d似乎并不“安全”......

答案 1 :(得分:8)

我在这里使用PhotoScroller代码有完全相同的问题。如果scale中的- (void)drawRect:(CGRect)rect不正确,则会出现问题。

您需要围绕scale ... scale = 1.0f / roundf(1.0f / scale);之后添加CGFloat scale = CGContextGetCTM(context).a;(它还可以防止图片被绘制两次)。

并绘制1个像素的图块...在tileRect.size.width += 1; tileRect.size.height += 1;之后添加tileRect = CGRectIntersection(self.bounds, tileRect);

答案 2 :(得分:2)

我遇到了同样的PhotoScroller问题,Damien的解决方案非常接近,但需要进行一次小修正才能完全消除那些讨厌的接缝。

对于我来说,绘制一个大一个像素的图块并不适用于所有缩放级别。原因是我们以原始分辨率绘制图像,然后CTM将其缩放到屏幕分辨率。

因此,当我们在屏幕上以25%的缩放级别绘制时,我们添加的1个像素实际上变为1/4像素。

因此,要在屏幕上将图块放大一个像素,我们需要在宽度/高度上添加1.0 /比例。 (这应该在调用CGRectIntersection之前完成)

tileRect.size.width += 1.0/scale; tileRect.size.height += 1.0/scale;
tileRect = CGRectIntersection(self.bounds, tileRect);