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!

Enviar por e-mail. Hits para esta publicação: 565.

2 Comentários »

  1. 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…

  2. 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!

RSS para comentários nesta publicação · URI para link desta publicação:

Deixe um Comentário