7

使用 Apple 和 ImageMagick 的 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

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

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

有人遇到同样的问题吗?

4

3 回答 3

9

我对这两种解决方案都有问题。Damien 的方法并没有完全消除所有缩放比例下的所有线条,Brent 的解决方案删除了​​线条,但在图块边界处添加了一些伪影。

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

毕竟,Apple 的假设CTM.a == CTM.d似乎根本不“安全”……

于 2011-08-31T10:13:22.113 回答
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);.

于 2010-12-01T17:00:36.237 回答
2

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

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

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

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

tileRect.size.width += 1.0/scale; tileRect.size.height += 1.0/scale;
tileRect = CGRectIntersection(self.bounds, tileRect);
于 2011-04-19T09:51:52.603 回答