algorithm - emplea - imagenes de html
Reúna varias imágenes en una sola imagen grande (6)
Aparentemente se llama ''problema de embalaje'', que es algo que se usa con frecuencia en la programación de juegos. Para aquellos interesados, aquí hay algunas implementaciones sugeridas:
Mapas de embalaje , Rectángulo de embalaje y colocación de rectángulo
Estoy tratando de juntar varias imágenes en una imagen grande, y estoy buscando un algoritmo que determine la ubicación de la manera más óptima. Las imágenes no se pueden girar ni cambiar de tamaño, pero la posición en la imagen resultante no es importante.
editar: se agregó restricción de cambio de tamaño
Creé un algoritmo para estos, en realidad es una variante del problema de empaque NP-Hard Bin , pero con un tamaño de bandeja infinito.
Podría tratar de encontrar algunos artículos al respecto y tratar de optimizar su algoritmo, pero al final seguirá siendo una forma de fuerza bruta para probar todas las posibilidades y tratar de minimizar el tamaño del contenedor resultante.
Si no necesita la mejor solución, sino solo una solución, podría evitar el uso de fuerza bruta en todas las combinaciones. Creé un programa que también lo hizo una vez.
Descripción:
Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
- Clasifique la matriz Imágenes para que la imagen más grande esté en la parte superior.
- Calcule el tamaño total de sus imágenes e inicie el ResultMap para que su tamaño sea 1,5 veces el tamaño total de sus imágenes (podría hacer que este paso sea más inteligente para mejorar el uso y el rendimiento de la memoria). Haga el ResultMap del mismo tamaño y llénelo con valores falsos.
- A continuación, agregue la primera imagen a la izquierda de su FinalImage y configure todos los booleanos en ResultMap true desde 0,0 hasta ImageHeight, ImageWidth.
El ResultMap se usa para verificar rápidamente si puede caber una imagen en la Imagen final actual. Puede optimizarlo para usar un int32 y usar cada bit para un píxel. Esto reducirá la memoria y aumentará el rendimiento, ya que puede verificar 32 bit a la vez (usando una máscara). Pero será más difícil porque tendrás que pensar en la máscara que necesitarás para los bordes de tu imagen.
Ahora describiré el bucle real del "algoritmo".
- Para cada imagen en la matriz intente encontrar un lugar donde cabría. Podría escribir un bucle que se vería a través de la matriz ResultMap y buscaría un valor falso y luego comenzaría a ver si permanece falso en ambas direcciones para el tamaño de la imagen.
- Si encuentra un lugar, copie la imagen en FinalImage y actualice los booleanos correctos en ResultMap
- Si encuentra un lugar, aumente el tamaño de la imagen final solo lo suficiente (así que mire los bordes donde se necesita la cantidad mínima de espacio adicional) y también sincronícelo con el mapa de resultados.
- GOTO 1 :)
No es óptimo, pero puede resolver el problema de una manera razonablemente óptima (especialmente si hay algunas imágenes más pequeñas para llenar las conversaciones al final).
De forma no programática, puede usar la función MS Paint "Pegar desde", es decir, pegar un archivo (JPEG) en el área de la imagen de mspaint. Con esto puede organizar las imágenes individuales, y crear una imagen final grande y guardarla como formato JPEG / GIF / Raw-BMP.
-ANUNCIO.
Es posible que esté buscando algo como esto: diseño automático de la revista .
El embalaje óptimo es difícil, pero puede haber simplificaciones disponibles para usted dependiendo de los detalles del dominio de su problema. Algunas ideas:
Si puede dividir sus bitmaps en fichas de igual tamaño, entonces el embalaje es trivial. Luego, a pedido, volverías a ensamblar los mapas de bits de las fichas.
Ordene sus imágenes de mayor a menor, luego, para cada imagen, use un ambicioso asignador para seleccionar el primer sub-rectángulo disponible que se ajuste a la imagen.
Usa un algoritmo genético. Comience con varios diseños seleccionados al azar. Puntúalos en función de qué tan apretados estén empaquetados. Mezcle las soluciones de los mejores puntajes e itere hasta obtener un puntaje aceptable.