Eu entendo que você pode obter o tamanho da imagem usando PIL da seguinte maneira
from PIL import Image
im = Image.open(image_filename)
width, height = im.size
No entanto, gostaria de obter a largura e altura da imagem sem ter que carregar a imagem na memória. Isso é possível? Estou apenas fazendo estatísticas sobre o tamanho das imagens e não me importo com o conteúdo das imagens. Só quero tornar meu processamento mais rápido.
python
image
image-processing
Sami A. Haija
fonte
fonte
.open()
leia todo o arquivo na memória ... (isso é o que.load()
) faz - pelo que eu sei - isso é o melhor que posso usarPIL
pmap
para monitorar a memória usada por um processo me mostra que de fatoPIL
não carrega a imagem inteira na memória.Respostas:
Como os comentários aludem, PIL não carrega a imagem na memória ao chamar
.open
. Olhando para a documentação dePIL 1.1.7
, a docstring para.open
diz:Existem algumas operações de arquivo na fonte, como:
mas isso dificilmente constitui a leitura de todo o arquivo. Na verdade,
.open
simplesmente retorna um objeto de arquivo e o nome do arquivo em caso de sucesso. Além disso, os documentos dizem:Indo mais fundo, vemos que as
.open
chamadas_open
são uma sobrecarga específica do formato de imagem. Cada uma das implementações_open
pode ser encontrada em um novo arquivo, por exemplo. Arquivos .jpeg estão emJpegImagePlugin.py
. Vamos dar uma olhada nisso em profundidade.Aqui as coisas parecem ficar um pouco complicadas, nele há um loop infinito que é interrompido quando o marcador jpeg é encontrado:
Parece que ele poderia ler todo o arquivo se estivesse malformado. Se ler o marcador de informações OK, no entanto, ele deve sair antes. A função, em
handler
última análise, defineself.size
quais são as dimensões da imagem.fonte
open
obtém o tamanho da imagem ou é uma operação preguiçosa também? E se for preguiçoso, ele lê os dados da imagem ao mesmo tempo?Docs/PIL.Image.html
..jpeg
formato parece OK, desde que o cabeçalho seja encontrado.Se você não se preocupa com o conteúdo da imagem, PIL é provavelmente um exagero.
Sugiro analisar a saída do módulo mágico do python:
Este é um wrapper para libmagic que lê o mínimo de bytes possível para identificar uma assinatura de tipo de arquivo.
Versão relevante do script:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[atualizar]
Parece que os jpegs são resistentes à magia. :-)
Eu posso ver o porquê: para obter as dimensões da imagem para arquivos JPEG, você pode ter que ler mais bytes do que o libmagic gosta de ler.
Arregacei as mangas e vim com este snippet não testado (pegue no GitHub) que não requer módulos de terceiros.
[atualização 2019]
Confira uma implementação do Rust: https://github.com/scardine/imsz
fonte
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
no MacOS, python3 ativadodata = input.read(25)
,file
na imagem dáPNG image data, 720 x 857, 8-bit/color RGB, non-interlaced
Existe um pacote em pypi chamado
imagesize
que atualmente funciona para mim, embora não pareça muito ativo.Instalar:
Uso:
Página inicial: https://github.com/shibukawa/imagesize_py
PyPi: https://pypi.org/project/imagesize/
fonte
Costumo buscar tamanhos de imagem na Internet. Claro, você não pode baixar a imagem e carregá-la para analisar as informações. É muito demorado. Meu método é alimentar pedaços para um contêiner de imagem e testar se ele pode analisar a imagem todas as vezes. Pare o loop quando eu obtiver as informações que desejo.
Extraí o núcleo do meu código e o modifiquei para analisar arquivos locais.
Resultado:
O tamanho real do arquivo é 1.543.580 bytes e você só lê 38.912 bytes para obter o tamanho da imagem. Espero que isso ajude.
fonte
Outra maneira curta de fazer isso em sistemas Unix. Depende da saída da
file
qual não tenho certeza se é padronizada em todos os sistemas. Isso provavelmente não deve ser usado em código de produção. Além disso, a maioria dos JPEGs não informa o tamanho da imagem.fonte
IndexError: list index out of range
Esta resposta tem outra boa resolução, mas faltando o formato pgm . Esta resposta resolveu o pgm . E eu adiciono o bmp .
Códigos está abaixo
fonte
imghdr
no entanto, lida muito mal com certos JPEGs.