Я хочу написать программу просмотра карт, я должен работать с маленькой плиткой файла изображения большой карты, и мне нужно разбить большое изображение, теперь проблема заключается в том, чтобы разбить большое изображение на маленькие плитки (250 * 250 пикселей или примерно такой размер), поэтому Я использовал программу ImageMagic, чтобы сделать это, но теперь возникла проблема. Есть ли другой метод программирования или приложение, которое выполняет мозаику? Могу ли я сделать это с помощью JAI в Java? как?
нарезка очень большого jpg изображения карты, 49000* 34300 пикселей
Ответы (6)
Вы сами пробовали сделать это на 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 без потерь. Это не только быстрее, поскольку изображение не нужно рендерить, но и сохраняет качество, поскольку изображение не подвергается повторному сжатию.
Редактирование без потерь работает с блоками, обычно квадратными размером 16 пикселей. Несмотря на ограничения для некоторых приложений, это кажется подходящим для картографирования. Вы можете реализовать разбиение на разные уровни масштабирования, сначала без потерь обрезав изображение на кусочки определенного размера. (Это быстро и эффективно, поскольку изображение не визуализируется.) Это дает вам плитки для полного масштабирования. Чтобы создать более низкие уровни масштабирования, объедините плитки 2x2 и уменьшите их до размера 1 плитки. На следующем уровне используются плитки 4x4, 8x8 и так далее, каждый раз уменьшаясь до одной плитки. В какой-то момент, когда количество плиток становится слишком большим, вы можете использовать увеличенные плитки в качестве базового ресурса. Например, при уровне масштабирования 8 для этого потребуется плитка размером 256x256. Это может быть слишком сложно, поэтому вы можете использовать плитки 16x16, начиная с уровня масштабирования 4.
В Википедии есть дополнительные сведения о редактировании без потерь и ссылки на некоторые реализующие библиотеки.
imagemagick создает мозаику с помощью -tile. Это скорее повторение изображения, но может быть полезно, особенно. так как вы уже используете его. Однако, если вы имеете в виду сгенерированную бесшовную мозаику, я не уверен, может ли imagemagick это сделать или нет.
GDAL поставляется со скриптом gdal2tiles.py, который делает именно то, что вам нужно, включая форматирование плиток для использования с Google Maps, OpenLayers и т.д.
Кажется, есть и более новая версия GDAL2Tiles.
Как насчет мегатекстуры с r-деревом для эффективного доступа? Судя по всему, он может использовать изображения размером 128000x128000 пикселей.
JAI зависит от платформы и сегодня кажется мертвым проектом.
Я советую использовать программу с открытым исходным кодом imagemagick. Хотя он зависит от платформы, он доступен для тех же платформ, что и JAI, но при полной поддержке сообщества.
Трюк с большими изображениями в imagemagick заключается в использовании команды «stream" вместо команды < команду href="http://www.imagemagick.org/script/convert.php" rel="nofollow">convert. Stream считывает только соответствующую часть изображения и сохраняет извлеченную часть как необработанные данные. Затем вам нужно «конвертировать», чтобы сохранить небольшие необработанные данные в формате jpeg.
Пример сохранения тайла из large.jpeg размером 800x600 с позиции 0x0 в tile.jpeg:
stream -extract 800x600+0+0 large.jpeg tile.rgb
convert -depth 8 -size 800x600 rgb:tile.rgb tile.jpeg
(При работе в Windows обязательно используйте Convert.exe ImageMagick, так как есть команда Windows с именем «convert».)
При работе только с TIFF-изображениями apache Sanselan может быть правильным выбором — это чисто Java библиотека изображений. Кроме того, JAI, похоже, содержит независимый от платформы кодек для TIFF.