Estou tentando descobrir um método muito rápido na determinação da dimensão das imagens.
Sei que poderia criar a imagem e usar a imagemagick para determinar a altura e a largura da imagem. Estou preocupado que essa possa não ser a maneira mais rápida de fazê-lo.
Também estou preocupado em ter que instalar o imagemagick quando preciso apenas de um subconjunto muito pequeno de funcionalidades. Estou em um sistema embarcado com recursos muito limitados (CPU, RAM, armazenamento).
Alguma ideia?
bash
wget
imagemagick
exvance
fonte
fonte
Respostas:
Como você observa, você não precisa de todo o pacote ImageMagick . Você só precisa
identify
.Você também precisará das bibliotecas às quais os links executáveis estão vinculados (e as bibliotecas às quais essas bibliotecas se vinculam).
ldd
irá mostrar uma lista. Quando eu fiz isso, ele incluiu algumas bibliotecas X, libjpeg etc. e duas bibliotecas claramente do pacote ImageMagicklibMagickCore
elibMagickWand
. Eles parecem estar ligados ao mesmo monte de coisas; portanto, se você tiver isso,identify
deve funcionar.Você não precisa fazer o download de uma imagem inteira para obter as dimensões, porque elas estão em um cabeçalho no início do arquivo e é isso que se
identify
vê. Por exemplo, aqui estou copiando os primeiros 4 kB de um JPEG completo para um novo arquivo:4 kB deve ser mais do que suficiente para incluir o cabeçalho - tenho certeza que você poderia fazê-lo com 1/4 dessa quantidade. Agora:
Essas são as dimensões corretas para
real.jpg
. Observe, no entanto, que o tamanho (4,1 KB) é o tamanho do arquivo truncado, pois essas informações não são do cabeçalho da imagem.Então: você só precisa baixar o primeiro kilobyte ou mais de cada imagem.
fonte
Você pode usar
curl
para baixar partes da imagem. Tudo depende de quão robusto deve ser. Um caso de teste pode ter os primeiros 500 bytes. Parece funcionar muitopng
ejpg
, em seguida, useidentify
ou algo semelhante para verificar o tamanho.Editar:
Faz muito tempo que escrevi analisadores de imagens, mas pensei um pouco e atualizei parte da minha memória.
Eu suspeito que é todo o tipo de imagens que você deseja verificar (mas, novamente, talvez não). Vou descrever alguns dos mais comuns:
PNG
,JPEG
(JFIF) eGIF
.PNG:
Estes são simples quando se trata de extração de tamanho. Um
png
cabeçalho armazena o tamanho nos primeiros 24 bytes. Primeiro vem um cabeçalho fixo:Em seguida, vêm os pedaços do arquivo. Eles consistem em um campo fixo de comprimento, tipo e soma de verificação. Além disso, uma seção de dados opcional do tamanho do comprimento .
Felizmente, o primeiro pedaço é sempre um
IHDR
com este layout:Por isso, temos que os tamanhos são byte 16-20 e 21-24. Você pode despejar os dados, por exemplo, hexdump:
Em uma máquina Big Endian / Motorola, também é possível imprimir os tamanhos diretamente:
No entanto, em Little Endian / Intel, não é tão fácil e nem é muito portátil.
Por isso, podemos implementar um script bash + hexdump como em:
Mas isso não é diretamente eficiente. Embora exija um pedaço maior (75-100 bytes),
identify
é bastante mais rápido. Ou escreva a rotina em, por exemplo, C, que seria mais rápido que as chamadas da biblioteca.JPEG:
Quando se trata
jpg
, não é tão fácil. Também começa com um cabeçalho de assinatura , mas o pedaço de tamanho não está em um deslocamento fixo. Após o cabeçalho:surge um novo bloco especificado por um marcador de dois bytes começando com
0xff
. Aquele que contém informações sobre dimensões tem o valor,0xffc0
mas pode ser bastante escondido nos dados.Em outras palavras, um pula bytes de tamanho de bloco , verifica o marcador, pula bytes de tamanho de bloco , lê o marcador e assim por diante até que o correto apareça.
Quando encontrados, os tamanhos são armazenados por dois bytes, cada um no deslocamento 3 e 5 após o marcador .
Escreveu um programa C simples para verificar alguns arquivos e cerca de 10.000 imagens jpg, aproximadamente 50% tinham as informações de tamanho nos primeiros 500 bytes, principalmente 50% entre ca. 100 e 200. O pior foi de cerca de 80.000 bytes. Uma imagem, como falamos fotos:
GIF:
Embora o gif normalmente possa ter várias imagens armazenadas, ele possui um tamanho de tela especificado no cabeçalho, mas é grande o suficiente para abrigar as imagens. É tão fácil quanto no PNG e requer bytes de febre: 10. Após a mágica e a versão, encontramos tamanhos. Exemplo de uma imagem de 364x472:
Em outras palavras, você pode verificar os seis primeiros bytes para ver se é um gif e ler os próximos quatro quanto aos tamanhos.
Outros formatos:
Poderia ter continuado, mas acho que eu paro aqui por enquanto.
fonte
Supõe que você tenha "identificação". Coloque isso em um script e
chmod +x <scriptname>
. Para executá-lo, digite<scriptname> picture.jpg
e você obterá a altura e a largura da imagem. As duas primeiras seções são para verificar se há uma imagem e depois configurá-la como a variável IMAGE. A próxima seção é garantir que o arquivo esteja realmente lá. As duas últimas seções devem pegar as informações relevantes da saída 'identificar' e exibi-las.fonte
file command
é instalado por padrão em distors e depende apenas de:Eu acho que você pode instalá-lo facilmente para incorporado. Você acabou de escrever um
regular expression
para sua saída.fonte
file
não fornece dimensões para, por exemplo,.jpg
arquivos.Você substitui
file://
porhttp://
fonte