Эффективное рендеринг множества изображений на едином холсте - PullRequest
0 голосов
/ 30 ноября 2010

Я потерян и нуждаюсь в направлении.

Мы пытаемся отрисовать кучу маленьких изображений (X) на одном унифицированном холсте, используя imagemagick.

РазличныеX могут быть одного из пяти различных размеров: 20x20, 40x40, 60x60, 80x80 или 100x100 каждый.Ширина большого изображения всегда устанавливается на 600, но высоту можно регулировать по мере необходимости.

Мы можем использовать от 10 до 10000 X в любой данный момент.

В настоящее время простое доказательство концепции, с которой мы работаем, выглядит примерно так:

images.each do |image|

      image = Magick::Image.read("#{RAILS_ROOT}/public/images/#{image}").first

      w = image.columns
      h = image.rows

      pixels = image.export_pixels(0, 0, w, h, "RGB")

      img.import_pixels(x, y, w, h, "RGB", pixels)

      x += w

end

... это просто и глупо, но выдает серию изображений, объединенных в одно.Почти там; -)

Кто-нибудь знает эффективный алгоритм, с помощью которого мы можем перебирать много X и размещать их рядом, занимая несколько строк и все же оптимизируя пространство? Цель здесь - создать единое изображение без пробелов, построенное из всех маленьких изображений.

Как уже говорилось, мне очень хотелось бы услышать любые ваши отзывы об этом.Указатели?Идеи?Примеры?

Спасибо.

1 Ответ

0 голосов
/ 30 ноября 2010

Кажется, прямо сейчас изображения - это шум. Вы хотите решить проблему с плитками. Плитки имеют фиксированный размер, и вы хотите разместить их на поверхности фиксированной ширины и минимальной высоты. Это можно сделать глобально с помощью DFS, BFS, A * и т. Д. Вы также можете взглянуть на некоторый локальный метод, такой как имитация отжига или восхождение на гору, в зависимости от того, нужен ли вам глобальный оптимум или просто хорошее, разумное решение. Реализации этих методов можно найти в онлайн-хранилище для AIMA .

.

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

...