Estou procurando uma maneira rápida de obter a altura e largura de uma imagem em pixels. Ele deve lidar com pelo menos JPG, PNG e TIFF, mas quanto mais, melhor. Enfatizo rapidamente porque minhas imagens são muito grandes (até 250 MB) e leva muito tempo para obter o tamanho do ImageMagick's, identify
porque ele obviamente lê as imagens como um todo primeiro.
De preferência, procuro uma maneira que funcione bem em Ruby, ou mesmo no Rails 3.
Conheço o material da teoria (vários formatos de imagem, seus cabeçalhos e diferenças, e assim por diante). Na verdade, peço algum tipo de biblioteca que possa resolver meu problema de maneira bastante genérica.
Acabei de encontrar um tamanho de imagem que parece promissor, embora o desenvolvimento pareça estar morto.
Respostas:
O
file
comando imprime as dimensões para vários formatos de imagem (por exemplo, PNG, GIF, JPEG; versões recentes também PPM, WEBP) e lê apenas o cabeçalho.O
identify
comando (do ImageMagick) imprime muitas informações de imagem para uma ampla variedade de imagens. Parece restringir-se a ler a parte do cabeçalho (ver comentários). Ele também tem uma saída unificada quefile
infelizmente não tem.exiv2
fornece dimensões para vários formatos, incluindo JPEG, TIFF, PNG, GIF, WEBP, mesmo que não exista um cabeçalho EXIF. Não está claro se ele lê todos os dados para isso. Veja a página de manual do exiv2 para todos os formatos de imagem suportados.head -n1
fornecerá as dimensões para os formatos PPM, PGM.Para formatos populares na Web, ambos
exiv2
eidentify
farão o trabalho. Dependendo do caso de uso, pode ser necessário escrever seu próprio script que combine / analise as saídas de várias ferramentas.fonte
Não sei se você tem o php instalado, mas essa função PHP é bastante útil
fonte
Você pode usar a função de identificação do ImageMagick . Aqui está como você faz isso no bash (nota $ 0 é o caminho da imagem):
E isso também oculta qualquer possível mensagem de erro. Implementações modernas de
identify
apenas ler o cabeçalho, não a imagem inteira, por isso é rápido. Não tenho certeza de como ele se compara a outros métodos.fonte
read width height < <(identify -format "%w %h" "${1}")
https://joseluisbz.wordpress.com/2013/08/06/obtaining-size-or-dimension-of-images/ (BMP, PNG, GIF, JPG, JPG, TIF ou WMF)
Aqui para dois formatos PNG e JPG.
Meu código é de uma classe projetada para meu uso, você pode editar de acordo com suas necessidades.
Por favor, verifique estas funções / métodos usando PHP :
Usando o código PHP:
Agora, estas funções / métodos usando JAVA :
Usando o código Java:
fonte
ref
/out
parâmetros em Java - isso é considerado uma prática recomendada?São as dimensões de pixel que você deseja (largura e altura), presumo?
Eu acho que a maioria dos formatos de arquivo tem algumas informações de cabeçalho que definem as dimensões, para que o software que está lendo o arquivo saiba quanto espaço deve reservar antes de começar a ler o arquivo. Alguns formatos de arquivo do tipo "bruto" podem ser apenas um fluxo de bytes com algum byte "final de linha" no final de cada linha horizontal de pixels (nesse caso, o software deve ler a primeira linha e dividir o tamanho do fluxo de bytes) pelo comprimento da linha para obter a altura).
Eu não acho que você possa fazer isso de maneira "genérica", pois você precisa entender o formato do arquivo (ou usar uma biblioteca, é claro) para saber como lê-lo. Provavelmente, você pode encontrar algum código que, na maioria dos casos, forneça uma estimativa aproximada das dimensões sem ler o arquivo inteiro, mas acho que alguns tipos de arquivos podem exigir que você leia o arquivo inteiro para ter certeza de que dimensões ele realmente possui. Espero que a maioria dos formatos de imagem centrados na Web possua um cabeçalho com essas informações, para que o navegador possa criar as dimensões da caixa antes que toda a imagem seja carregada.
Eu acho que uma boa biblioteca teria alguns métodos para obter as dimensões dos arquivos que manipula, e que esses métodos seriam implementados da maneira mais eficiente possível.
Atualização : imageinfo parece que faz o que você deseja. (Não testei)
fonte
Se você tiver informações EXIF nas imagens, basta ler o cabeçalho EXIF.
fonte
-ping é uma opção que parece ter sido introduzida para esse fim.
No entanto, a partir do ImageMagick 6.7.7, não observo lentidão nem para todos os arquivos grandes, por exemplo:
Você pode produzir uma imagem de entrada de exemplo para a qual ainda é lenta?
fonte
tldr: o arquivo "imagename" fará
funciona com webp, todos os formatos jpg (jpeg, jpg200, ..),
Saída de amostra parece
carregue a saída do arquivo em uma lista python e use o 4º campo na lista.
Para sua informação, otimizou mais de 18.000 imagens para reduzir o tráfego de rede.
fonte