Quantos DPIs possui uma Imagem?
Olá pessoal;
Ontem e hoje tive implementar uma função que verifica quanto DPI’s uma imagem possui, pois de acordo com a regra de negócio no nosso sistema, caso uma imagem tenha menos de 300 X 300 DPI’s, ela deverá ser trocada! Não vou entrar muito em detalhe da regra de negócio, descrevi melhor no meu blog.
Vamos ao código:
using System;
using System.IO;
using System.Drawing;
//Neste caso recebo um array de bytes, com o conteúdo lido do banco referente a imagem
public static bool VerificaImagem(byte[] pDigital)
{
//Criando um objeto do tipo MemoryStream, para “escrever nele” o array de bytes que nos foi passado pelo parâmetro
MemoryStream imageStream = new MemoryStream();
imageStream.Write(pDigital, 0, pDigital.Length);
Image minhaImagem;
minhaImagem = Image.FromStream(imageStream, false);
//Aqui através do Graphics eu tenho informações como os DPI’s de uma determinada imagem, que foi criada logo acima!
Graphics graficoImagem = Graphics.FromImage(minhaImagem);
//Verificando a quantidade de DPI’s da imagem
if ((int.Parse(graficoImagem.DpiX.ToString()) > Constantes.DPIHorizontal) &&
(int.Parse(graficoImagem.DpiY.ToString()) > Constantes.DPIVertical))
{
DiposeObjects(imageStream, minhaImagem);
return true;
}
DiposeObjects(imageStream, minhaImagem);
return false;
}
O Código é bem simples depois de pronto, e pode ser que você necessite de algo deste tipo quando for trabalhar com imagens.
Na verdade essa foi a primeira vez que tive trabalhar com imagens, saber informações, salvar em banco, recuperar, etc…
Desenvolvendo e aprendendo!
Abraços!
Permalink Enviar por e-mail. Hits para esta publicação: 565.
Michael disse,
24 de Abril de 2007 @ 21:09
Hey, SkyWalker fiz minha otimização no código sugerido, segue ele logo abaixo depois de um pequeno comentário…
Quando olhei seu código, logo de início, achei estranho o obj Image não fornecer a informação da DPI, estão fui fazer uma busca e achei uns propriedades com uns nomes bem sugestivos, “HorizontalResolution e VerticalResolution”, e pronto. SÓ que olhando um pouco mais os detalhes, notei uma diferença brutal. Essas duas propriedades ai retorna a resolução em Pixel por Polegada(PPI) e não por Ponto por Polega (DPI)…por pouco eu ia postando aqui um comentário errado…
Olha ai o q esta no comentário de cada método:
HorizontalResolution: Gets the horizontal resolution, in pixels per inch, of this Image.
DpiX: Gets the horizontal resolution of this Graphics object.
Fácil de confundir né…
Segue um link pra explicar melhor a diferenção entre DPI e PPI…
http://www.helatam.philips.com/glossario/dpi.html
http://www.helatam.philips.com/glossario/ppi.html
O Código que faz a mesma coisa, só que em uma versão um pouco mais simplificada e com pequeno ajuste…
public class Constantes
{
public const float DPIHorizontal = 300F;
public const float DPIVertical = 300F;
}
public static void VerificaImagem(byte[] pDigital)
{
//Criando um objeto MemoryStream, para “carregar” o array de bytes que nos foi passado pelo parâmetro
using( MemoryStream imageStream = new MemoryStream(pDigital) )
{
Graphics graficoImagem = Graphics.FromImage(Image.FromStream(imageStream));
//Verificando a quantidade de DPI’s da imagem
if ((graficoImagem.DpiX > Constantes.DPIHorizontal) &&
(graficoImagem.DpiY > Constantes.DPIVertical))
{
//APLICAR SUA REGRA AQUI !!!
}
}
}
Ps: Achei a conversão de tipos de float para string e depois pra int desnecessária, então criei constantes já no tipo correto…
Lucas Campos disse,
25 de Abril de 2007 @ 10:03
Isso mesmo, por isso que tive que utilizar Graphics, eu havia percebido essa diferença!
:D
Ah, esta classe de constantes temos aqui no sistema, só não explicitei no exemplo do meu código!
Mas sua melhora foi muito boa!
Abraços!