нарезка очень большого изображения карты jpg, 49000 * 34300 пикселей - PullRequest
4 голосов
/ 16 апреля 2010

Я хочу написать программу просмотра карт, мне нужно работать с небольшим фрагментом файла изображения большой карты, и существует необходимость в разбиении большого изображения на части, теперь проблема заключается в разбиении большого изображения на небольшие фрагменты (размером 250 * 250 пикселей или тому подобное). размер) и так далее, я использовал программу ImageMagic, но была проблема Теперь есть какой-либо другой метод программирования или приложения, которые делают плитки? Могу ли я сделать это с JAI в Java? как?

Ответы [ 6 ]

5 голосов
/ 03 июня 2010

Вы сами пытались делать это в 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")); 
            }
        }
    }
}
3 голосов
/ 27 апреля 2010

Для больших размеров изображений, которые у вас есть, вам лучше всего подойдет редактирование файлов JPEG без потерь. Это не только быстрее, поскольку изображение не нужно отображать, но и сохраняет качество, поскольку изображение не сжимается повторно.

Редактирование без потерь работает с блоками, обычно с квадратом 16px. Несмотря на ограниченность для некоторых приложений, это хорошо подходит для картирования. Вы можете реализовать мозаику с разным уровнем масштабирования, сначала обрезая изображение без потерь по размеру. (Это быстро и эффективно, так как изображение не отображается.) Это дает вам плитки для полного увеличения. Чтобы создать более низкие уровни масштабирования, объедините плитки 2х2 и уменьшите их до размера 1 плитки. На следующем уровне используются плитки 4х4, 8х8 и т. Д., Каждый раз уменьшая до одного тайла. В какой-то момент, когда количество плиток становится слишком большим, вы можете использовать увеличенные плитки в качестве базового ресурса. Например, на уровне масштабирования 8 это потребует 256x256 плиток. Это может быть слишком много для обработки, так что вы можете использовать плитки размером 16x16 с уровнем масштабирования 4.

В Википедии есть больше по редактированию без потерь и ссылки на некоторые библиотеки реализации.

0 голосов
/ 18 января 2012

JAI зависит от платформы и сегодня кажется мертвым проектом.

Я советую использовать программу с открытым исходным кодом imagemagick . Хотя он зависит от платформы, он доступен для тех же платформ, что и JAI, но с полной поддержкой сообщества.

Уловка больших изображений в imagemagick заключается в использовании команды stream вместо команды 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 обязательно используйте ImageMagick's convert.exe, поскольку есть команда windows с именем «convert».)

При работе только с TIFF-изображениями, Apache Sanselan может быть правильным выбором - это библиотека изображений с чисто Java. Кроме того, JAI, похоже, содержит независимый от платформы кодек для TIFF.

0 голосов
/ 15 мая 2010

Как насчет мегатекстуры с r-деревом для эффективного доступа? Видимо, он может использовать изображения 128000x128000 пикселей.

0 голосов
/ 29 апреля 2010

GDAL поставляется со скриптом gdal2tiles.py, который делает именно то, что вам нужно, включая форматирование плиток для использования с Google Maps, OpenLayers и т. Д.

Похоже, что есть более новая версия GDAL2Tiles .

0 голосов
/ 16 апреля 2010

imagemagick делает мозаику, используя -tile . Это скорее повторение изображения, но может быть полезным, особенно. так как вы уже используете его. Тем не менее, если вы имеете в виду сгенерированное бесшовное мозаичное представление, я не уверен, что imagemagick сможет это сделать или нет.

...