2010-11-19 6 views
7

AppleとImageMagickによるPhotoScrollerの例を使用して、カタログアプリケーションを構築することができました。レンダリング時のタイル間の細い線、ImageMagickで生成されたタイル

しかし、レンダリングのバグがあります。タイル画像は、それらの間に細い線でレンダリングされます。

の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 

は同じです。奇妙なことは、彼らがすでにタイル張った画像は、同じランタイムで、私の画像と並んで、魅力的に動作することです。(

私の最初の推測では、タイルのサイズが一致していなかった私の画像は通常リンゴが提供するものよりも小さく、実際にはサイズの半分です。

誰でも同じ問題がありますか?

+1

おかげで「安全」ではないようです。 :-) –

答えて

9

私は両方のソリューションとの問題を抱えていました。 Damienのアプローチは、すべての拡大/縮小スケールですべてのラインを完全に排除するわけではなく、ブレントのソリューションはラインを削除しましたが、タイル境界線でいくつかのアーティファクトを追加しました。

私は最終的に私のためにうまく機能する解決策を見つけました:http://openradar.appspot.com/8503490(コメントzephyr.renner)。結局のところ

CTM.a == CTM.dそのAppleの仮定は...すべてのシェルスクリプトのための

+1

このソリューションは、すべてのスケールで魅力的に機能します。 Appleのコードのもう一つのポイントは、あなたが部分的なタイルを持っているという前提です。 **画像タイルが正方形のタイルを作成しただけの場合は、このコード行をPhotoScrollerの例から削除する必要があります:drawRectのforループにある 'tileRect = CGRectIntersection(self.bounds、tileRect);' – MiKL

+1

'_scale =(1 /(float)((int)(1/scale))))* 1000;' "解"から。スケールが1より大きい場合、 '_scale'は無限になります。 –

8

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

ラウンドする必要がありますscale ... CGFloat scale = CGContextGetCTM(context).a;の後にscale = 1.0f/roundf(1.0f/scale);を追加してください(タイルが2度描かれないようにすることもできます)。

タイルを1ピクセル大きくする... tileRect = CGRectIntersection(self.bounds, tileRect);の後にtileRect.size.width += 1; tileRect.size.height += 1;を追加します。

+0

クール、これは動作します。私はすでにスケールを丸めなければならなかったし、タイルウェアのいくつかのレベルは呼び出されていませんでした。 –

+0

細い線は25%のズームレベルでのみ発生することがわかりました.tilRectを拡大できないと、ある点で画像の一部のピクセルが隠れてしまいましたか? –

2

このPhotoScrollerの問題が発生しました.Damienのソリューションは非常に近いですが、これらの厄介な縫い目を完全に排除するために小さな修正が必要です。

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

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

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

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

Damienが提案したように1ピクセルを追加すると、私にとってはうまくいきましたが、あなたのソリューションは明らかに洗練されています:)ありがとう! –

+0

あなたは正しい、良い点です! –