Cómo usar Pillow en la programación Python para manejar algo como
Para aquellos que son nuevos en el mundo de las almohadas, veamos cómo instalarlas. Aquí tomamos el entorno Mac OS como ejemplo: (1), use pip para instalar la biblioteca Python. Pip es la herramienta de gestión de paquetes de Python. Una vez instalado, puede instalar/administrar varias bibliotecas directamente en la línea de comando (documentación de pip).
El comando "clang" de wget falló y el estado de salida era
1". Buscando en línea, descubrí que necesito actualizar la herramienta de línea de comandos a través de Xcode. Así que ábrela
xcode ->Preferencias->Pestaña Descargas-Componentes ¿Eh? De hecho, perdí la línea de comando
Herramientas. Comprobé nuevamente y descubrí que ahora es necesario instalar Xcode 5 y superiores. la línea de comando:
p>$ xcode-select—Instalación
El sistema mostrará un mensaje emergente para instalar la herramienta de línea de comando, haga clic en Instalar
. En este momento, la almohada de instalación de pip se instalará correctamente <. /p>
Comando de congelación de pip para ver el paquete de Python instalado, Pillow ya está allí
Bien, comencemos el tutorial ~ p>
Clase de imagen
La clase más importante en Pillow es Imagen, que existe en un módulo con el mismo nombre. La creación de instancias se puede lograr leyendo una imagen de un archivo, procesando otras imágenes o. creando una imagen directamente.
Abra la imagen usando la función abrir en el módulo de imagen:
& gt& gt& gtImporte la imagen desde PIL& gt& gt& gtim = Image.open("lena. ppm ")
Si se abre correctamente, se devuelve un objeto de imagen y el contenido del archivo se puede inspeccionar a través de las propiedades del objeto
& gt& gt& gtFrom _ _ futuro _ _ importar imprimir _ función > & gt& gt Imprimir (formato instantáneo, tamaño instantáneo, modo instantáneo)
PPM (512, 512) RGB
La propiedad de formato define el formato de la imagen si no se abre desde un archivo. El valor del atributo es Ninguno. El atributo de tamaño es una tupla, que indica el ancho y el alto de la imagen (en píxeles). El atributo de modo indica el modo de la imagen. una imagen en escala de grises, RGB es un color verdadero y CMYK es una imagen previa a la impresión.
Si el archivo no se puede abrir, se generará una excepción IOError. hay un objeto Imagen, puede usar varios métodos de la clase Imagen para procesar y manipular la imagen, como Mostrar imágenes:
& gt& gt& gtim.show()
Ps : La versión estándar del método show() no es muy eficiente porque primero guarda la imagen como un archivo temporal y luego la muestra con xv. Si xv no está instalado, esta función ni siquiera funcionará. conveniente para depurar y probar (Windows debe llamar al visor de imágenes predeterminado para abrir)
Leer y escribir imágenes
p>La biblioteca Pillow admite bastantes formatos de imágenes. Utilice la función open() en el módulo de imagen para leer directamente la imagen sin procesar primero el formato de la imagen. La biblioteca de almohadas determina automáticamente el formato según el archivo.
La función save() en el módulo de imagen puede guardar imágenes a menos que especifique el formato del archivo, la extensión en el nombre del archivo se usa para especificar el formato del archivo.
La imagen se convierte a formato jpg.
desde _ _ futuro _ _ importar impresión _ función importar sistema operativo, sysdesde PIL importar imagen para archivo interno en argv[1:]: f, e = ruta de salida dividida de ext(archivo interno). f+".jpg"si está en el archivo! = archivo de salida: intente: Image.open(archivo de entrada).
Guardar (archivo de salida) excepto IOError: imprimir ("No se puede convertir", archivo de salida)
El segundo parámetro de la función de guardar se puede utilizar para especificar el formato de la imagen. El segundo argumento es obligatorio si no se proporciona ningún formato de imagen estándar en el nombre del archivo.
Crear miniaturas
desde _ _ futuro _ _ importar impresión _ función importar sistema operativo, sysdesde PIL importar Tamaño de imagen = (128, 128) para archivo interno en argv[1:] : archivo de salida = ruta del sistema operativo . split text(archivo de entrada)[0]+". if archivo de salida != archivo de salida :try:im = imagen . open(archivo de entrada)im . miniatura(tamaño)im . save(archivo de salida, "JPEG") Excepto. IOError: print("No se puede crear una miniatura para "", infile)
Debe tenerse en cuenta que Pillow no decodificará ni rasterizará los datos a menos que sea necesario. Cuando abre un archivo, Pillow determina el formato, el tamaño, el modo y otros datos del archivo a través del encabezado del archivo, y los datos restantes no se procesan hasta que se necesitan.
Esto significa que abrir archivos es muy rápido, independientemente del tamaño del archivo y del formato de compresión. El siguiente procedimiento se utiliza para determinar rápidamente los atributos de la imagen:
Determinar los atributos de la imagen
desde _ _ futuro _ _ import print _ function import sysfrom PIL import sys . intente: con imagen abierta (infile) como im:print(infile, im.format, "%dx%d" % im.size, im.mode) excepto IOError: pase
Recortar, pegar y fusionar imágenes
La clase Imagen contiene más métodos para manipular áreas de imágenes. Por ejemplo, el método crop() puede extraer un subrectángulo de una imagen.
Copiar subimagen de la imagen
Box = im.copy() #Copiar la imagen directamente box = (100, 100, 400, 400) region = im.crop (box ).
El área está determinada por una tupla de 4, y la información en esta tupla es (izquierda, arriba, derecha, abajo). El origen (0,0) del sistema occipital izquierdo es la esquina superior izquierda de la imagen. La unidad numérica en las coordenadas son píxeles, por lo que el tamaño de la fotografía tomada en el ejemplo anterior es 300*300 píxeles2.
Procesa la subimagen y pégala nuevamente en la imagen original.
region = region.transpose(Image.ROTATE_180)im.paste(region, box)
Cuando la subimagen se vuelve a pegar en la imagen original, la región de la subimagen debe ser igual que el dado Las áreas de las cajas son consistentes. Esta área no puede extenderse más allá de la imagen original. No es necesario que los patrones de la imagen original y la región coincidan; Pillow lo manejará automáticamente.
Otro ejemplo.
Imagen rodante def roll (imagen, delta): "Lados de imagen rodante" imagen = Copiar()# Copiar imagen xsize, ysize = tamaño de imagen delta = delta % xsize si delta == 0: devolver imagen parte 1 = imagen crop((0, 0, delta, ysize)) part2 = image.crop((delta, 0, xsize, ysize)) image.paste(part1, (xsize-delta)
Dividir y fusionar canales
r, g, b = im . split() im = image merge(" RGB ", (b, g, r))
. Para imágenes de un solo canal, split() devuelve la imagen en sí. Para procesar imágenes de un solo canal, primero debe convertir la imagen a RGB
Transformación geométrica
La imagen. La clase tiene funciones para transformaciones geométricas. Los métodos resize(), rotate() y transpose()
Transformación geométrica simple
Out = im.resize ((128, 128)) Out. = im.rotate (45) #Representación del ángulo en sentido horario.
Imagen de reemplazo
out = im.transpose(Picture. FLIP _ LEFT _ RIGHT)out = im transpose(Picture. FLIP _ TOP _ BOTTOM )out = im.transpose(Picture.ROTATE_90)out = im.transpose(Picture.ROTATE_180)out = im.transpose(Picture.Rotate_270)
Transpose() y Rotate() No hay diferencia de rendimiento entre
Un método de transformación de imagen más general puede usar transform()
Conversión de modo
Método Convert()
Conversión de modo
im = Image.open('lena.ppm '). Convert("L")
Mejora de imagen
Filtro El módulo ImageFilter contiene. muchos filtros de mejora predefinidos que utiliza el método Filter()
Aplicar filtros
Importar desde PIL ImageFilterout = im filter(image filter. Detalles)
Procesamiento de puntos de píxeles
El método point() procesa píxeles en la imagen (como operaciones de contraste) a través de funciones o tablas de búsqueda.
Transformación de puntos de píxel
#Multiplica cada píxel por 1,2 out = im point(λI:I * 1.2)
El método anterior se puede utilizar simplemente Expresiones. se utilizan para el procesamiento de imágenes. Al combinar apuntar () y pegar (), se puede procesar selectivamente un área determinada de la imagen.
Procesando un solo canal
#Dividir la imagen en bandas separadas fuente = im.split()R, G, B = 0, 1, 2 #Seleccionar rojo menor a 100máscara = área de fuente [R]. punto(lambda I:I <100<255)#proceso ancho de banda verde = fuente[G]. point(lambda i: i * 0.7)#Pegue la banda procesada nuevamente, pero solo en el lugar rojo <100 source[G].
pegar(out,None,mask)#Construir una nueva imagen multibanda im = Image.merge(im.mode, source)
Tenga en cuenta la declaración que crea la máscara:
máscara = fuente[R]. Punto (lambda I:I & lt; 100 y 255)
Esta oración se puede expresar mediante la siguiente oración.
imout = im . point(λI:expresión y 255)
Si la expresión es falsa, el valor de la expresión es 0 (porque la declaración y ya puede obtener el resultado), de lo contrario Se devuelve 255. (Uso del parámetro de máscara: cuando es 0, se conserva el valor actual, 255 es el valor ingresado usando pegar y el medio se usa para el efecto de transparencia).
Mejora de imagen avanzada
Para mejorar otras imágenes avanzadas, debe utilizar el módulo ImageEnhance. Una vez que tenga un objeto Imagen, puede configurarlo rápidamente aplicando un objeto ImageEnhance. Puede utilizar los siguientes métodos para ajustar el contraste, el brillo, el equilibrio de color y la nitidez.
Mejora de imagen
Importar ImageEnhanceenh = ImageEnhance desde PIL. Mejora del contraste (1.3). Pantalla ("más del 30 % de contraste")
Imágenes dinámicas
Pillow admite algunos formatos de imágenes dinámicas, como FLI/FLC, GIF y otros formatos experimentales. Los archivos TIFF también pueden contener varios fotogramas de imágenes.
Al leer un gráfico dinámico, PIL lee automáticamente el primer cuadro del gráfico dinámico y puede leer diferentes señales utilizando los métodos de búsqueda y indicación.
Importar imagen desde PIL = image open(" animación . gif ")im seek(1)#Saltar al segundo fotograma try: while 1:im seek(im . tell()+1. )#Para imexcept EOFError: pase #Fin de secuencia
Al leer el último fotograma, Pillow arroja una excepción EOFError.
La versión actual solo permite buscar hasta la próxima vez y se debe volver a abrir el archivo para retroceder.
O puedes usar la clase de iterador a continuación.
Clase de iterador de gráficos dinámicos
clase de secuencia de imágenes:def _ _ init _ _(self, im):self . im = im def _ _ getitem _ _(self, ix). : intente: si ix: self.im.seek(ix) devuelve self . im excepto EOFError:aumentar error de índice #Fin de secuencia para fotogramas en secuencia de imágenes (im): #...Haga algo para enmarcar... Impresión posdata
Pillow permite agregar imágenes, texto y gráficos a las imágenes mediante una impresora Postscript.
Dibujar script desde PIL importar imagen desde PIL importar psdraweim = imagen abierta (" Lena . ppm ") título = " Lena " box = (1 * 72, 2 * 72, 7 * 72, 10 * 72) # en puntosps = PSDraw.
PSDraw() #El valor predeterminado es sys . stdoutps . comenzar _ documento(título)# dibujar la imagen(75 ppp)PS imagen(cuadro, im, 75)PS .dibujar el título centrado PS. Helvetica estrecha-Bold ", 36)w, h, b = PS . textsize(title)PS . text((4*72-w/2, 1*72-h), title)ps.end_document()
Más formas de leer imágenes
Como se mencionó anteriormente, la función open() del módulo de imágenes es suficiente para el uso diario. El argumento de esta función también puede ser un objeto de archivo.
Leer desde cadena
importar cadena oim = image open(string io. stringio(buffer))
Desde archivo tar Leer en
Importado de PIL. TarIO("Imaging.tar", "Imaging/test/Lena . ppm")im = image open(FP)
Modo borrador
El método Draft() permite leer sin . Tomando el contenido del archivo, convierta la imagen al modo y tamaño dados tanto como sea posible (no necesariamente exactamente igual a los parámetros dados), lo cual es muy efectivo al generar miniaturas (la velocidad es mayor que la calidad).
Modo borrador
desde _ _ futuro _ _ importar imprimir _ función im = imagen abrir(archivo) imprimir(" original = ", im.mode, im.size)im. .borrador("L ", (100, 100))print("borrador = ", modo.im, tamaño.im)