Как объединить несколько PNG в один большой файл PNG?

Стандарт HTML, похоже, указывает, что первая кнопка отправки будет принята, если пользователь нажмет клавишу «Ввод».

Нет, использование клавиши ввода не определено, это собственное расширение, которое было добавлено в различных интерпретациях. Вы получите различное поведение в разных браузерах (и это может стать очень опасным, когда вы начнете смешивать различные культурные или пользовательские соглашения относительно порядка опций слева направо / справа налево).

Если в форме есть только 1 кнопка, то все основные браузеры выполняют одно и то же поведение - они отправляют форму, как если бы эта кнопка была нажата (buttonName = buttonValue входит в данные формы). Конечно, это не означает, что обработчик кнопок onclick будет срабатывать - это поведение зависит от браузера.

Когда есть несколько кнопок, это полный отстой. Некоторые браузеры решают , что была нажата первая кнопка (и определение первой может отличаться - большинство используют первую, упомянутую в дереве HTML, в то время как другие пытаются использовать положение экрана) и используют ее в представлении, в то время как другие браузеры (особенно некоторые версии IE) делают одинаково правильное предположение, что не была нажата определенная кнопка , и поэтому не включают buttonName = buttonValue (остальная часть формы отправляется нормально).

29
задан soc 13 October 2010 в 13:18
поделиться

3 ответа

Как уже отмечали другие, использование Java не обязательно является лучшим выбором.

Если вы собираетесь использовать Java, ваш лучший выбор - при условии, что у вас недостаточно места в памяти, чтобы вы не могли прочитать весь набор данных в память несколько раз, а затем записать его снова, - это реализовать RenderedImage с классом, который будет читать ваши PNG с диска по требованию. Если вы просто создадите свой новый BufferedImage, а затем попытаетесь записать его, программа записи PNG создаст дополнительную копию данных. Если вы создаете свой собственный RenderedImage, вы можете передать его в ImageIO.write(myImageSet,"png",myFileName). Вы можете скопировать SampleModel и ColorModel информацию из вашего первого PNG - надеюсь, они все одинаковые.

Если вы притворяетесь, что все изображение состоит из нескольких плиток (по одной плитке на исходное изображение), то ImageIO.write создаст WritableRaster, который является размером всего набора данных изображения, и вызовет вашу реализацию RenderedImage.copyData, чтобы заполнить его данными. Если у вас достаточно памяти, это простой способ (потому что вы получаете огромный целевой набор данных и можете просто сбросить в него все данные вашего изображения - используя метод setRect(dx,dy,Raster)) - и тогда вам не нужно переживай еще раз). Я не проверял, экономит ли это память, но мне кажется, что так и должно быть.

В качестве альтернативы, если вы притворяетесь, что все изображение представляет собой одну плитку, ImageIO.write затем, используя getTile(0,0), запросит растр, соответствующий этому целому изображению. Таким образом, вы должны создать свой собственный растр, который, в свою очередь, заставляет вас создавать свой собственный DataBuffer. Когда я попробовал этот подход, минимальное использование памяти, которое успешно записало 15360x25600 RGB PNG, было -Xmx1700M (в Scala, между прочим), что составляет чуть более 4 байтов на пиксель записанного изображения, поэтому очень мало служебной информации над одним полным изображением в памяти.

Сам по себе формат данных PNG не требует полного изображения в памяти - он будет нормально работать в блоках - но, к сожалению, реализация по умолчанию для устройства записи PNG предполагает, что в памяти будет весь массив пикселей.

3
ответ дан 28 November 2019 в 00:57
поделиться

Я не вижу, как это было бы возможно «без обработки и перекодирования». Если вы настаиваете на использовании Java, тогда я просто предлагаю вам использовать JAI (страница проекта здесь ). При этом вы создадите один большой BufferedImage , загрузите меньшие изображения и начертите их на более крупном .

Или просто используйте ImageMagick montage:

montage *.png output.png

Для получения дополнительной информации о montage см. Использование .

6
ответ дан 28 November 2019 в 00:57
поделиться

Возможно, вам лучше отразить все в другом формате изображения (без потерь). PPM очень прост в использовании (и для помещения плиток программно; это просто большой массив на диске, так что вам нужно будет хранить не более одного ряда плиток), но это очень бесполезно расходует место (12 байт на пиксель!).

Затем используйте стандартный конвертер (например, ppm2png), который принимает промежуточный формат и превращает его в гигантский PNG.

1
ответ дан 28 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: