Esta es la respuesta más correcta que encomtrarás dar, pero obsérvala pausadamente y analiza si se puede adaptar a tu proyecto.
Solución:
Editar: creo que esta respuesta perdió la intención de cortar una imagen en rectángulos en columnas y filas. Esta respuesta se corta solo en filas. Parece que otras respuestas están cortadas en columnas y filas.
Más simple que todo esto es usar una rueda que alguien más inventó 🙂 Puede ser más complicado configurarlo, pero luego es muy fácil de usar.
Estas instrucciones son para Windows 7; es posible que deban adaptarse a otros sistemas operativos.
Obtén e instala pip desde aquí.
Descargue el archivo de instalación y extráigalo a su directorio raíz de instalación de Python. Abra una consola y escriba (si no recuerdo mal):
python get-pip.py install
Luego obtenga e instale el módulo image_slicer a través de pip, ingresando el siguiente comando en la consola:
python -m pip install image_slicer
Copie la imagen que desea dividir en el directorio raíz de Python, abra un shell de Python (no la “línea de comando”) e ingrese estos comandos:
import image_slicer
image_slicer.slice('huge_test_image.png', 14)
La belleza de este módulo es que
- esta instalado en python
- Puede invocar una imagen dividida con dos líneas de código
- Acepta cualquier número par como parámetro de corte de imagen (por ejemplo, 14 en este ejemplo)
- Toma ese parámetro y divide automáticamente la imagen dada en tantos cortes, y guarda automáticamente los mosaicos numerados resultantes en el mismo directorio, y finalmente
- Tiene una función para volver a unir los mosaicos de la imagen (que aún no he probado); Aparentemente, los archivos deben tener el nombre de la convención que verá en los archivos divididos después de probar la función image_slicer.slice.
from PIL import Image
def crop(path, input, height, width, k, page, area):
im = Image.open(input)
imgwidth, imgheight = im.size
for i in range(0,imgheight,height):
for j in range(0,imgwidth,width):
box = (j, i, j+width, i+height)
a = im.crop(box)
try:
o = a.crop(area)
o.save(os.path.join(path,"PNG","%s" % page,"IMG-%s.png" % k))
except:
pass
k +=1
Dividir la imagen en mosaicos de MxN píxeles (suponiendo que im sea numpy.ndarray):
tiles = [im[x:x+M,y:y+N] for x in range(0,im.shape[0],M) for y in range(0,im.shape[1],N)]
En el caso de que quieras dividir la imagen en cuatro partes:
M = im.shape[0]//2
N = im.shape[1]//2
losas[0] sostiene el mosaico superior izquierdo
Sección de Reseñas y Valoraciones
Si crees que te ha sido de ayuda nuestro post, sería de mucha ayuda si lo compartes con otros entusiastas de la programación de este modo nos ayudas a dar difusión a nuestro contenido.