Criando e manipulando imagens com C-Sharp – Parte 2 | C# Brasil


Criando e manipulando imagens com C-Sharp – Parte 2

{lang: 'pt-BR'}

Seguindo a serie de artigos de criação e manipulação de imagens (veja o arquivo anterior), nesse artigo irei ensinar como remover as Meta Tags existentes em uma imagem do tipo JPG. Essas Meta Tags são chamadas de [W:Exif] (Exchangeable image file format) e nelas existem diversas informações sobre a imagens.

Normalmente encontramos essas Meta Tags nas fotos que são tiradas por câmeras fotográficas digitais. Eis algumas das informações encontradas.

  • Marca do Equipamento
  • Software de Criação
  • Velocidade do obturador
  • Modo do Flash
  • Comprimento focal
  • Abertura do diafragma
  • Tempo de exposição
  • Data em que a foto foi tirada
  • etc…

criandomanipulandoimagens_parte2_01

A principio utilizei essa técnica para editar uma foto sem a necessidade de utilizar o meu editor de imagens ([W:Photoshop]). Agora vamos ao que interessa.


private void RemoveExifProperties(string imagePath)
{
    // Imagem original
    System.Drawing.Bitmap OriginalBitmap = new System.Drawing.Bitmap(imagePath);

    // Carrega a lista de propriedades da imagem
    System.Drawing.Imaging.PropertyItem[] aPropertyItem = OriginalBitmap.PropertyItems;

    foreach (System.Drawing.Imaging.PropertyItem property in aPropertyItem)
    {
        // Pega a propriedade atual da imagem
        System.Drawing.Imaging.PropertyItem p = property;
        // Atribui novo valor a propriedade
        p.Value = new byte[0];
        // Seta a nova propriedade
        OriginalBitmap.SetPropertyItem(p);
    }

    // Salva a imagem em memoria
    System.IO.MemoryStream mStream = new System.IO.MemoryStream();
    OriginalBitmap.Save(mStream, OriginalBitmap.RawFormat);
    OriginalBitmap.Dispose();

    // Salva a imagem da memoria em arquivo
    System.Drawing.Bitmap CopyBitmap = new System.Drawing.Bitmap(mStream);
    CopyBitmap.Save(imagePath);

    CopyBitmap.Dispose();
    mStream.Dispose();
}

No Código acima eu informo para o meu método o caminho físico da minha imagem que desejo remover as informações. Eu atribuo o array de propriedades da imagem a um variável do tipo System.Drawing.Imaging.PropertyItem[] e em seguida faço um foreach (laço de repetição) para pegar uma propriedade da imagem por vez e atribuir valor do tipo byte[0]. Faço isso porque o valor dá propriedade é do tipo array de byte(byte[]).

Feito isso, crio uma variável do tipo MemoryStream e salvo a imagem nela. Esse processo atribui a imagem em memória para que eu possa salva-la.

Ai vem a pergunta, porque não salvar diretamente em disco? Não poderia porque a imagem esta aberta e ocorreria um Exception ao tentar sobrescrever.

A solução é jogar a imagem modificada em memória para depois salva-la. Após realizar todo esse processo, daremos chamaremos o método Dispose para as variáveis do tipo Bitmap e MemoryStream para evitar descarregar as informações da memória.

Agora basta utilizar o método no projeto que precisar e passar somente o caminho físico da imagem para modificá-la.


private void btnProcessar_Click(object sender, EventArgs e)
{
    string filePath = @"D:Minhas imagensS7301443.JPG";
    RemoveExifProperties(filePath);
}

E aqui temos o resultado.

criandomanipulandoimagens_parte2_02

Algumas informações aparentemente não são removidas e sim atribuídas com seus valores padrões.

Espero que tenha entendido. Caso tenha alguma dúvida deixe seu comentário.

Abraço e sucesso!!!

Posts relacionados:

  1. Criando e Manipulando imagens com C-Sharp – Parte 1
  2. Dica – Criptografia MD5 com C-Sharp
  3. Criando e consumindo Web Service em C-Sharp – Parte 1
  4. Imagens no Reportviewer 2010
  5. Manipulando arquivos Excel sem uso da interoperabilidade ou conexão OLEDB

Postado em C#, Visual Studio | Marcado como , , , , , ,

2 comentários sobre “Criando e manipulando imagens com C-Sharp – Parte 2”

  1. Silvio disse:

    Eu estou desenvolvendo uma aplicação gráfica e estou com um probleminha chato. Depois do programa funcionar corretamente com as minhas imagens de teste (todas exportada do photoshop em algum momento) fui operar com certas imagens de trabalho.
    Pela lei de Murphy, em uma das primeiras 3 começou o seguinte problema.

    O sistema obtem atrávés da altura e largura do Bitmap carregado (classe Bitmap) e cria automaticamente uma split. A split está do tamanho correto, digamos, 35px, mas a imagem está sendo renderizada um pouco maior. Desconfio que tenha algo a ver com formato de pixels, mas acho que já que a própria classe image está carregando:

    image = Image.FromFile(value);

    Talvez seja um problema com o formato de pixel da tela onde as splits estejam sendo desenhadas. Algum colega tem alguma ídeia?
    Se for, alguém sabe como lidar com a situação de ter de desenhar imagens com diferentes formatos de pixel numa mesma tela?

    abraços
    Silvio

  2. Ilair dos Santos disse:

    Olá!

    Muito bom esse post! Parabéns!

    Gostaria de saber como faço para modificar ou adicionar uma cor na imagem, por exemplo fotografei uma casa e quero modificar a cor da parede, sem alterar a cor do telhado, como posso fazer isso, sou iniciante em C#.

    Desde já agradeço a atenção!

Deixe um Comentário

Qual a soma da expressão:
2 + 1