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

Appleのコードは同じです。奇妙なことに、彼らがすでにタイル張りした画像は、同じ実行時間で、私の画像と並んで、魅力のように機能します:(

私の最初の推測では、タイルのサイズはコードの計算と一致していませんでしたが、スクリプトでもコードでも、サイズの変更は修正されませんでした。私の画像は通常、アップルが提供する画像よりも小さく、実際には半分のサイズです。

誰かが同じ問題を抱えていますか?

4

3 に答える 3

9

私は両方の解決策に問題がありました。ダミアンのアプローチでは、すべてのズームスケールですべての線が完全に削除されるわけではなく、ブレントのソリューションでは線が削除されましたが、タイルの境界にいくつかのアーティファクトが追加されました。

しばらくグーグルした後、私はついに私にとってうまく機能する解決策を見つけました:http: //openradar.appspot.com/8503490 ( zephyr.rennerによるコメント)。

結局のところ、まったくCTM.a == CTM.d「安全」ではないように見えるAppleの仮定...

于 2011-08-31T10:13:22.113 に答える
8

PhotoScrollerコードを使用して、ここでまったく同じ問題が発生します。scaleが正しくない場合、問題が発生し- (void)drawRect:(CGRect)rectます。

丸める必要があります...後scaleに追加します(タイルが2回描画されるのも防ぎます)。scale = 1.0f / roundf(1.0f / scale);CGFloat scale = CGContextGetCTM(context).a;

そして、タイルを1pix大きく描画します...tileRect.size.width += 1; tileRect.size.height += 1;後に追加しtileRect = CGRectIntersection(self.bounds, tileRect);ます。

于 2010-12-01T17:00:36.237 に答える
2

私はこれと同じPhotoScrollerの問題に遭遇し、Damienの解決策は非常に近いものでしたが、これらの厄介な継ぎ目を完全に排除するには、1つの小さな修正が必要です。

1ピクセル大きいタイルを描画しても、すべてのズームレベルで機能しませんでした。その理由は、元の解像度で画像を描画してから、CTMによって画面解像度にスケーリングされるためです。

したがって、追加した1ピクセルは、画面に25%のズームレベルで描画すると、実際には1/4ピクセルになります。

したがって、画面上でタイルを1ピクセル拡大するには、幅/高さに1.0/スケールを追加する必要があります。(これは、CGRectIntersectionを呼び出す前に実行する必要があります)

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