私はmapviewerを書きたいです、私は大きな地図画像ファイルの小さなタイルを動かさなければなりません、そして大きな画像を並べる必要があります、問題は今大きな画像を小さなタイル(250 * 250ピクセルまたはこのサイズのようなもの)に並べることです上で、私は ImageMagic プログラムを使用してそれを行いましたが、問題がありました。タイリングを行う他のプログラミング方法またはアプリケーションはありますか? JavaのJAIでできますか?どうやって?
6 に答える
自分でJavaでやってみましたか?(WARNING, big image, can crash your browser, use "save as...") this imageでこれを試しました。ただし、追加のメモリで実行する必要がありました ( -Xmx400M
)。
public class ImageTile {
public static void main(String[] args) throws IOException {
Dimension tileDim = new Dimension(250, 250);
BufferedImage image = ImageIO.read(new File(args[0]));
Dimension imageDim = new Dimension(image.getWidth(), image.getHeight());
for(int y = 0; y < imageDim.height; y += tileDim.height) {
for(int x = 0; x < imageDim.width; x += tileDim.width) {
int w = Math.min(x + tileDim.width, imageDim.width) - x;
int h = Math.min(y + tileDim.height, imageDim.height) - y;
BufferedImage tile = image.getSubimage(x, y, w, h);
ImageIO.write(tile, "JPG", new File("tile-"+x+"-"+y+".jpg"));
}
}
}
}
あなたが持っているような大きな画像サイズの場合、JPEG ファイルのロスレス編集が最適です。画像をレンダリングする必要がないため高速であるだけでなく、画像が再圧縮されないため、品質も維持されます。
可逆編集は、ブロック (通常は 16 ピクセルの正方形) で機能します。一部のアプリケーションには制限がありますが、これはマッピングに適しているようです。最初に画像をロスレスでトリミングして、さまざまなズーム レベルでタイリングを実装できます。(画像がレンダリングされないため、これは迅速かつ効率的です。) これにより、フルズームのタイルが得られます。低レベルのズームを作成するには、2x2 タイルを組み合わせて、これらを 1 タイルのサイズに縮小します。次のレベルでは、4x4 タイル、8x8 などを使用し、毎回 1 つのタイルに縮小します。タイルの数が大きくなりすぎた時点で、ズームされたタイルを基本リソースとして使用することを選択できます。たとえば、ズーム レベル 8 では、256x256 のタイルが必要になります。これは処理するには多すぎる可能性があるため、ズーム レベル 4 の 16x16 タイルを使用できます。
ウィキペディアには、ロスレス編集の詳細と、いくつかの実装ライブラリへのリンクがあります。
効率的なアクセスのための r-tree を備えたメガテクスチャはどうですか? どうやら 128000x128000 ピクセルの画像を使用できるようです。
JAI はプラットフォームに依存しており、今日では死んだプロジェクトのようです。
オープンソース プログラムのimagemagickを使用することをお勧めします。プラットフォームに依存しますが、JAI と同じプラットフォームで利用できますが、完全なコミュニティ サポートがあります。
imagemagick に関する大きな画像に関するトリックは、 convertコマンドの代わりに「 stream 」コマンドを使用することです。ストリームは、画像の関連部分のみを読み取り、抽出された部分を生データとして保存します。次に、小さな生データを jpeg として保存するために「変換」する必要があります。
サイズ 800x600 の large.jpeg からタイルを位置 0x0 から tile.jpeg に保存する例:
stream -extract 800x600+0+0 large.jpeg tile.rgb
convert -depth 8 -size 800x600 rgb:tile.rgb tile.jpeg
(Windows で実行する場合は、「convert」という名前の Windows コマンドがあるため、必ず ImageMagick の convert.exe を使用してください。)
TIFF 画像のみを操作する場合は、apache Sanselanが適切な選択になる可能性があります。これは純粋な Java 画像処理ライブラリです。また、JAI には TIFF 用のプラットフォームに依存しないコーデックが含まれているようです。
imagemagick は-tileを使用してタイリングを行います。これは画像の繰り返しですが、特に役立つ場合があります。すでに使用しているからです。ただし、生成されたシームレスなタイリングを意味する場合、imagemagick がそれを実行できるかどうかはわかりません。
GDALには gdal2tiles.py というスクリプトが付属しており、Google マップや OpenLayers などで使用できるようにタイルをフォーマットするなど、必要なことを正確に実行できます。
GDAL2Tilesの新しいバージョンもあるようです。