Existe uma maneira barata de obter as dimensões de uma imagem (jpg, png, ...)? De preferência, gostaria de fazer isso usando apenas a biblioteca de classes padrão (devido às restrições de hospedagem). Eu sei que deve ser relativamente fácil ler o cabeçalho da imagem e analisá-lo sozinho, mas parece que algo assim já deve estar lá. Além disso, verifiquei que o código a seguir lê a imagem inteira (o que não quero):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Jan Zich
fonte
fonte
Respostas:
Sua melhor aposta, como sempre, é encontrar uma biblioteca bem testada. No entanto, você disse que isso é difícil, então aqui está um código duvidoso em grande parte não testado que deve funcionar para um bom número de casos:
Esperançosamente, o código é bastante óbvio. Para adicionar um novo formato de arquivo, você o adiciona
imageFormatDecoders
com a chave sendo um array dos "bits mágicos" que aparecem no início de cada arquivo do formato fornecido e o valor sendo uma função que extrai o tamanho do fluxo. A maioria dos formatos são bastante simples, o único verdadeiro fedorento é o JPEG.fonte
throw e;
mas simplesmentethrow;
. Seus comentários de documento XML no segundoGetDimensions
também aparecem empath
vez debinaryReader
o
validateImageData
conjunto parafalse
evitar que o GDI + execute análises caras dos dados da imagem, reduzindo drasticamente o tempo de carregamento. Esta questão lança mais luz sobre o assunto.fonte
new Bitmap()
.Você já tentou usar as classes WPF Imaging?
System.Windows.Media.Imaging.BitmapDecoder
, etc.?Acredito que algum esforço foi feito para garantir que esses codecs leiam apenas um subconjunto do arquivo para determinar as informações do cabeçalho. Vale a pena verificar.
fonte
Eu estava procurando algo semelhante alguns meses antes. Eu queria ler o tipo, versão, altura e largura de uma imagem GIF, mas não consegui encontrar nada útil online.
Felizmente, no caso do GIF, todas as informações necessárias estavam nos primeiros 10 bytes:
PNG são um pouco mais complexos (largura e altura têm 4 bytes cada):
Como mencionado acima, wotsit é um bom site para especificações detalhadas sobre formatos de imagem e dados, embora as especificações PNG em pnglib sejam muito mais detalhadas. No entanto, acho que a entrada da Wikipedia nos formatos PNG e GIF é o melhor lugar para começar.
Este é meu código original para verificar GIFs. Também criei algo para PNGs:
fonte
Com base nas respostas até agora e em algumas pesquisas adicionais, parece que na biblioteca de classes do .NET 2 não há funcionalidade para ela. Então decidi escrever o meu próprio. Aqui está uma versão muito aproximada disso. No momento, eu precisava apenas para JPG's. Portanto, completa a resposta postada por Abbas.
Não há verificação de erro ou qualquer outra verificação, mas atualmente preciso dela para uma tarefa limitada e pode ser facilmente adicionada. Eu testei em algumas imagens, e geralmente não lê mais do que 6K de uma imagem. Acho que depende da quantidade de dados EXIF.
fonte
Eu fiz isso para o arquivo PNG
fonte
Sim, você pode fazer isso com certeza e o código depende do formato do arquivo. Eu trabalho para um fornecedor de imagens ( Atalasoft ), e nosso produto fornece um GetImageInfo () para cada codec que faz o mínimo para descobrir as dimensões e alguns outros dados fáceis de obter.
Se você quiser fazer o seu próprio, sugiro começar com wotsit.org , que tem especificações detalhadas para praticamente todos os formatos de imagem e você verá como identificar o arquivo e também onde as informações podem ser encontradas.
Se você se sente confortável em trabalhar com C, o jpeglib gratuito também pode ser usado para obter essas informações. Aposto que você pode fazer isso com bibliotecas .NET, mas não sei como.
fonte
new AtalaImage(filepath).Width
faz algo semelhante?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Resposta do ICR atualizada para suportar jPegs e WebP progressivos também :)
fonte
Vai depender do formato do arquivo. Normalmente, eles o declararão nos primeiros bytes do arquivo. E, normalmente, uma boa implementação de leitura de imagem levará isso em consideração. Eu não posso apontar para um para .NET embora.
fonte