Ir para conteúdo
Faça parte da equipe! (2024) ×

[C#]criando e manipulando imagens


ShareDuck
 Compartilhar

Posts Recomendados

OLÁ AGORA VOU ENSINAR COMO MANIPULAR IMAGENS NO C#

 

Vou iniciar uma serie de pequenos artigos ensinando como manipular e até criar imagens com C#.

 

Nesse primeiro artigo, vou ensinar como pegar uma imagem qualquer e corta-la em formato de um circulo .

 

Independente do tipo de projeto, o resultado será o mesmo, mais para ficar mais interessante, vamos inicie um novo projeto webform.

 

criandomanipulandoimagens002-300x19.jpg

 

Com o botão direito em cima do nosso Project > Add New Item… iremos adicionar uma nova Classe chamada “ImageBuilder.cs”…

 

criandomanipulandoimagens003-300x19.jpg

 

e inclua o código abaixo.

 

view sourceprint?

01.public byte[] ImagemRedonda(string Path)

02.{

03. // Carrega a imagem

04. System.Drawing.Image imagem = System.Drawing.Bitmap.FromFile(Path);

05. // Estancia a Classe que será responsavel em converter a imagem em Array de Byte

06. System.IO.MemoryStream ms = new System.IO.MemoryStream();

07. // Atribui a imagem no Memory Stream criado

08. imagem.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

09. // Retorna um Array Byte conteudo a imagem

10. return ms.ToArray();

11.}

 

Agora iremos incluir uma imagem no nosso projeto para usarmos como exemplo. Crie um pasta chamada “Imagens” e com o botão direito em cima dela clique em Add Existing Item… e escolha uma imagem do formato JPEG qualquer.

 

Crie um novo WebForm que será o responsável em exibir nossa imagem na página Default.aspx. Com o botão direito em cima do nosso Project > Add New Item… iremos adicionar o WebForm chamada “Imagem.aspx”.

 

criandomanipulandoimagens004-300x19.jpg

 

Atribuir o código abaixo que receberá a QueryString “Path”, irá pegar o caminho físico e informa-lo para a nossa Classe “ImageBuilder” e essa exibirá a imagem.

view sourceprint?

1.protected void Page_Load(object sender, EventArgs e)

2.{

3. ImageBuilder img = new ImageBuilder();

4. string Path = Request.QueryString["path"];

5. string ServerPath = Server.MapPath(Path);

6.Response.ContentType = "image/jpeg"

7. Response.BinaryWrite(img.ImagemRedonda(ServerPath));

8.}

 

No Default.aspx iremos chamar o página Imagem.aspx e passando a QueryString path=|caminho_da_imagem| igual o código abaixo.

 

view sourceprint?

1.<img src="Imagem.aspx?path=imagens/thundercats.jpg" />

 

Se você fez os passos corretos, ao executar a imagem será exibida em seu tamanho real.

criandomanipulandoimagens005.jpg

 

Agora iremos ao que interessa. Na classe “ImageBuilder”, adicione os códigos abaixo que irá cortar e dar o formato arredondado para a imagem.

 

Esse código irá deixar a imagem em formado arredondado.

view sourceprint?

01.private System.Drawing.Image ArredondaImagem(System.Drawing.Image imgTemp, int Largura, int Altura)

02.{

03. System.Drawing.Image imagem = CortaImagem(imgTemp, Largura, Altura);

04. System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(imagem);

05. System.Drawing.Rectangle retangulo = new System.Drawing.Rectangle();

06. System.Drawing.Pen PW = new System.Drawing.Pen(System.Drawing.Brushes.White, 2);

07. for (int i = imagem.Height; i < (imagem.Height * 2); i++)

08. {

09. retangulo.Height = i;

10. retangulo.Width = i;

11. retangulo.X = imagem.Width / 2 - retangulo.Width / 2;

12. retangulo.Y = imagem.Height / 2 - retangulo.Height / 2;

13. graphic.DrawEllipse(PW, retangulo);

14. }

15. return imagem;

16.}

 

Esse código irá cortar a imagem

 

view sourceprint?

01.private static System.Drawing.Image CortaImagem(System.Drawing.Image imgPhoto, int Width, int Height)

02.{

03. int sourceWidth = imgPhoto.Width;

04. int sourceHeight = imgPhoto.Height;

05. int sourceX = 0;

06. int sourceY = 0;

07. int destX = 0;

08. int destY = 0;

09. float nPercent = 0;

10. float nPercentW = 0;

11. float nPercentH = 0;

12. nPercentW = ((float)Width / (float)sourceWidth);

13. nPercentH = ((float)Height / (float)sourceHeight);

14. if (nPercentH < nPercentW)

15. {

16. nPercent = nPercentW;

17. destY = (int)((Height - (sourceHeight * nPercent)) / 2);

18. }

19. else

20. {

21. nPercent = nPercentH;

22. destX = (int)((Width - (sourceWidth * nPercent)) / 2);

23. }

24. int destWidth = (int)(sourceWidth * nPercent);

25. int destHeight = (int)(sourceHeight * nPercent);

26. System.Drawing.Bitmap bmPhoto = new System.Drawing.Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

27. bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

28. System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto);

29. grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

30. grPhoto.DrawImage(imgPhoto, new System.Drawing.Rectangle(destX, destY, destWidth, destHeight), new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), System.Drawing.GraphicsUnit.Pixel);</p>

31. grPhoto.Dispose();

32. return bmPhoto;

33.}

 

E agora alteraremos o metodo “ImagemRedonda” atribuindo a linha que Corta a imagem conforme o código abaixo:

view sourceprint?

01.public byte[] ImagemRedonda(string Path)

02.{

03. // Carrega a imagem

04. System.Drawing.Image imagem = System.Drawing.Bitmap.FromFile(Path);

05. // Corta Imagem nas medidas informadas

06. imagem = ArredondaImagem(imagem, 150, 150);

07. // Estancia a Classe que será responsavel em converter a imagem em Array de Byte

08. System.IO.MemoryStream ms = new System.IO.MemoryStream();

09. // Atribui a imagem no Memory Stream criado

10. imagem.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

11. // Retorna um Array Byte conteudo a imagem

12. return ms.ToArray();

13.}

ESTE É O RESULTADO

criandomanipulandoimagens006-240x30.jpg

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 ExifW (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…

 

DD.jpg

 

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

view sourceprint?

01.private void RemoveExifProperties(string imagePath)

02.{

03. // Imagem original

04. System.Drawing.Bitmap OriginalBitmap = new System.Drawing.Bitmap(imagePath);

05.

06. // Carrega a lista de propriedades da imagem

07. System.Drawing.Imaging.PropertyItem[] aPropertyItem = OriginalBitmap.PropertyItems;

08.

09. foreach (System.Drawing.Imaging.PropertyItem property in aPropertyItem)

10. {

11. // Pega a propriedade atual da imagem

12. System.Drawing.Imaging.PropertyItem p = property;

13. // Atribui novo valor a propriedade

14. p.Value = new byte[0];

15. // Seta a nova propriedade

16. OriginalBitmap.SetPropertyItem(p);

17. }

18.

19. // Salva a imagem em memoria

20. System.IO.MemoryStream mStream = new System.IO.MemoryStream();

21. OriginalBitmap.Save(mStream, OriginalBitmap.RawFormat);

22. OriginalBitmap.Dispose();

23.

24. // Salva a imagem da memoria em arquivo

25. System.Drawing.Bitmap CopyBitmap = new System.Drawing.Bitmap(mStream);

26. CopyBitmap.Save(imagePath);

27.

28. CopyBitmap.Dispose();

29. mStream.Dispose();

30.}

 

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.

view sourceprint?

1.private void btnProcessar_Click(object sender, EventArgs e)

2.{

3. string filePath = @"D:Minhas imagensS7301443.JPG";

4. RemoveExifProperties(filePath);

5.}

 

E aqui temos o resultado.

 

DDJ.jpg

 

ESPERO TER AJUDADO

SKYPE

shareduck

Link para o comentário
Compartilhar em outros sites

  • 5 semanas atrás...
Este tópico está impedido de receber novos posts.
 Compartilhar

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.