Соедините несколько изображений в одно большое изображение

6
задан Linor 24 September 2008 в 08:20
поделиться

6 ответов

Возможно Вы ищете что-то вроде этого: Автоматическое Расположение Журнала.

3
ответ дан 17 December 2019 в 22:15
поделиться

Appearantly, который это назвало 'проблемой упаковки', которая является чем-то часто используемым в игровом программировании. Для заинтересованных, вот некоторые предложенные реализации:

Упаковывая Карты освещенностей, Прямоугольную упаковку и Прямоугольное Размещение

2
ответ дан 17 December 2019 в 22:15
поделиться

Я создал алгоритм для этого, это - на самом деле вариант NP-трудныйУпаковка мусорного ведрапроблемы , но с бесконечным размером мусорного ведра.

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

Если Вам не нужно лучшее решение, но всего одно решение, Вы могли бы избежать скота, вызывающего все комбинации. Я создал программу, которая сделала это однажды также.

Описание:

Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
  1. Отсортируйте массив Изображений так, чтобы самое большое изображение было наверху.
  2. Вычислите общий размер своих изображений и инициализируйте ResultMap так, чтобы это был размер, 1.5 раза общий размер Ваших изображений (Вы могли сделать этот шаг более умным для лучшего использования памяти и производительности). Сделайте ResultMap тем же размером и заполните его Ложными значениями.
  3. Затем добавьте первое изображение в левых Вашего FinalImage и установите все булевские переменные в ResultMap, верном от 0,0 до ImageHeight, ImageWidth.

ResultMap используется, чтобы быстро проверить, можно ли соответствовать изображению на текущем FinalImage. Вы могли оптимизировать его, чтобы использовать int32 и использовать каждый бит для одного пикселя. Это уменьшит память и увеличит производительность, потому что можно проверить 32 бита сразу (использующий маску). Но это станет более трудным, потому что необходимо будет думать о маске, которую необходимо будет сделать для краев изображения.

Теперь я опишу реальный цикл "алгоритма".

  1. Поскольку каждое изображение в массиве пытается найти, что место было этим, будет соответствовать. Вы могли записать цикл, который посмотрит канавка, которую ResultMap выстраивают и ищут ложное значение и, чем начинают видеть, остается ли ложью в обоих направлениях для размера изображения помещать.
    • Если Вы находите место, копируете изображение в FinalImage и обновляете корректные булевские переменные в ResultMap
    • Если Вы, плавиковый шпат находит место, увеличивают размер FinalImage как раз (так посмотрите на края, где минимальное количество дополнительного пространства необходимо), и также синхронизируйте это с ResultMap
  2. GOTO 1 :)

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

0
ответ дан 17 December 2019 в 22:15
поделиться

Непрограмматическим способом можно использовать Вставку "функции MS Paint От" т.е. Вставку (JPEG) файл в mspaint область изображения. Используя это можно расположить отдельные изображения, и создать заключительное большое изображение и сохранить его как JPEG/GIF/Raw-BMP формат.

- AD.

-3
ответ дан 17 December 2019 в 22:15
поделиться

Optimal packing is hard, but there might be simplifications available to you depending on the details of your problem domain. A few ideas:

  1. If you can carve up your bitmaps into equally sized tiles, then packing is trivial. Then, on-demand, you'd reassemble the bitmaps from the tiles.

  2. Sort your images largest to smallest, then, for each image use a greedy-allocator to select the first available sub-rectangle that fits the image.

  3. Use a genetic algorithm. Start with several randomly-selected layouts. Score them based on how tightly they're packed. Mix solutions from the top scoring ones, and iterate until you get to an acceptable score.

0
ответ дан 17 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

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