非常に大きなJPGマップ画像をスライスする、49000* 34300ピクセル
質問
MapViewerを書きたい、大きなマップ画像ファイルの小さなタイルを作業する必要があり、大きな画像をタイル張りにする必要があります。今では、大きな画像を小さなタイル(250 * 250ピクセルまたはこのサイズのように)にタイリングすることです。さらに、私はそれを行うために画像プログラムを使用しましたが、今では問題がありました。ジャワのジャイと一緒に行うことはできますか?どうやって?
解決
Javaで自分でやってみましたか?私はこれを試しました(警告、大きな画像、あなたのブラウザをクラッシュさせ、「保存として...」を使用できます) この画像. 。しかし、余分なメモリで実行する必要がありました(-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ファイルのロスレス編集を最適に提供します。画像をレンダリングする必要がないため、これはより速いだけでなく、画像が再圧縮されていないため、品質も維持します。
ロスレス編集は、通常は16px正方形のブロックで動作します。一部のアプリケーションでは制限がありますが、これはマッピングに適しているようです。画像をサイズのピースに最初に紛失してトリミングすることにより、さまざまなズームレベルでタイルを実装できます。 (これは、画像がレンダリングされていないため、迅速です。)これにより、フルツーム用のタイルが得られます。低レベルのズームを作成するには、2x2タイルを組み合わせて、これらを1タイルのサイズまで縮小します。次のレベルでは、4x4タイル、8x8などを使用するたびに、毎回1タイルにスケーリングします。タイルの数が大きすぎるある時点で、ズームしたタイルをベースリソースとして使用することを選択できます。たとえば、ズームレベル8では、256x256タイルが必要です。これは処理するには多すぎるかもしれないので、ズームレベル4から16x16タイルを使用できます。
ウィキペディアは持っています もっと ロスレス編集、およびいくつかの実装ライブラリへのリンク。
ImageMagickは使用してタイル張りをします -タイル. 。それはイメージのより多くの繰り返しですが、特に役立つかもしれません。あなたがすでにそれを使用しているので。ただし、生成されたシームレスなタイリングを意味する場合は、ImageMagickがそれを行うことができるかどうかはわかりません。
gdal GDAL2TILES.pyというスクリプトが付属しています。これは、Googleマップ、OpenLayersなどで使用するタイルをフォーマットするなど、必要なことを正確に実行します。
新しいバージョンがあるようです gdal2tiles 同じように。
aはどうですか Megatexture 効率的なアクセスのためのRツリー付き?どうやら画像128000x128000ピクセルを使用できます。
Jaiはプラットフォームに依存しており、今日の死んだプロジェクトのようです。
オープンソースプログラムを使用することをお勧めします ImageMagick. 。プラットフォームに依存していますが、Jaiと同じプラットフォームで利用できますが、コミュニティの完全なサポートがあります。
ImageMagickについての大きな画像に関するトリックは、それを使用しています」ストリーム「 - の代わりに 変換 指図。ストリームは、画像の関連部分のみを読み取り、抽出された部分を生データとして保存します。次に、小さな生データをJPEGとして保存するために「変換」する必要があります。
例0x0からtile.jpegまでのサイズ800x600のlarge.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-Imagesのみを使用する場合、Apache サンセラン 正しい選択かもしれません - それは純粋なジャバイメージングLibです。また、JaiにはTIFF用のプラットフォーム独立コーデックが含まれているようです。