нарезка очень большого jpg изображения карты, 49000* 34300 пикселей

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


person sirvan    schedule 15.04.2010    source источник
comment
Вы думали о том, чтобы положиться на что-то вроде Zoomify? zoomify.com   -  person Keith Adler    schedule 16.04.2010
comment
нет, что можно сделать? я думаю, что это не может сделать плитку... я должен нарезать изображение на маленькую плитку...   -  person sirvan    schedule 16.04.2010
comment
откуда вы взяли 140 000 x 125 000 jpg? Какое программное обеспечение/система создала это? Это 17,5 миллиардов пикселей. При 32 битах на пиксель этому зверю потребовалось бы 69 ГБ памяти без сжатия. Каков размер этой картинки после сжатия в JPG? Как вы его перенесли? Может ли ImageMagick просто, скажем, преобразовать его? В любом случае, если вы планируете манипулировать таким гигантским объемом данных с помощью Java-апплета, вас ждет серьезная травма.   -  person SyntaxT3rr0r    schedule 16.04.2010
comment
извините, вы правы, это была ошибка, истинный размер 49000 * 34300 пикселей и 105 МБ, я хочу разработать веб-базовый просмотрщик карт (проект AVL), поэтому мне нужно разбить это изображение (и большее изображение тоже) с разным увеличением уровень, мы замостили его с помощью ImageMagic до 250*230 тайлов, мы так и делаем, но размер созданного маленького тайла был 49000*230 вместо 250*230 (?)   -  person sirvan    schedule 16.04.2010


Ответы (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")); 
            }
        }
    }
}
person dacwe    schedule 03.06.2010

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

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

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

person mdma    schedule 27.04.2010

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

person Jamie    schedule 16.04.2010

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

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

person Daniel Pryden    schedule 28.04.2010

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

person filinep    schedule 15.05.2010

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.

person mischka    schedule 18.01.2012
comment
JAI не зависит от платформы, он поставляется только с чистой версией Java. Нативные расширения предназначены только для дополнительного ускорения определенных вещей. - person Alexander Klimetschek; 25.10.2013
comment
Чтобы уточнить: сам JAI имеет версию только для Java, а JAI-imageio также имеет большую часть только для Java, но некоторым читателям/писателям требуется собственный код (clibwrapper_jiio). AFAICS это форматы jpeg, png, jpeg 2K, g3fax и g4fax. - person Alexander Klimetschek; 02.11.2013