2010-11-29 35 views
0

Je suis perdu et j'ai besoin de direction.Rendu efficace de nombreuses images sur une toile unifiée

Nous essayons de rendre un tas de petites images (X) sur un seul canevas unifié en utilisant imagemagick.

Les différents X peuvent être l'un de cinq tailles différentes: 20x20, 40x40, 60x60, 80x80 ou 100x100 chacun. La largeur de la grande image est toujours définie sur 600, mais la hauteur peut être réglée au besoin.

Nous pouvons utiliser jusqu'à 10 ou 10 000 X à tout moment.

Actuellement, la preuve bare-bones du concept que nous travaillons avec va quelque chose comme:

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 

... il est simple et stupide, mais il ne sortie une série d'images fusionnées en une seule. Presque là ;-)

Est-ce que quelqu'un sait d'un algorithme efficace avec lequel nous pouvons itérer plusieurs X et les placer côte à côte, en couvrant plusieurs lignes et en optimisant toujours l'espace? Le but ici est de créer une seule image sans espace blanc, construite par toutes les petites images.

Comme indiqué, j'aimerais tous les commentaires que vous pourriez avoir à ce sujet. Pointeurs? Des idées? Exemples?

Merci.

Répondre

0

Il semble que maintenant les images sont du bruit. Vous voulez résoudre un problème de tuiles. Les tuiles ont une taille fixe et vous voulez les mettre sur une surface de largeur fixe et de hauteur minimale. Cela peut être fait globalement avec DFS, BFS, A *, etc. Vous pouvez aussi regarder une méthode locale comme le recuit simulé ou l'escalade, selon que vous avez besoin d'un optimum global ou juste d'une bonne solution raisonnable. Vous pouvez trouver des implémentations de ces méthodes dans le online source repository for AIMA. Une fois que vous avez résolu le problème de la tuile, vous pouvez superposer les images, avec un morceau de code similaire à celui que vous montrez.

+0

Merci pour votre réponse carlosdc! J'ai passé la matinée à essayer de trouver des implémentations de référence des méthodes que vous mentionnez en vain. Avez-vous quelque chose en tête? Merci encore. –

+0

J'ai modifié ma réponse un peu. – carlosdc