Criando e Manipulando imagens com C-Sharp – Parte 1
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 como o exemplo abaixo.
Independente do tipo de projeto, o resultado será o mesmo, mais para ficar mais interessante, vamos inicie um novo projeto webform.

Com o botão direito em cima do nosso Project > Add New Item… iremos adicionar uma nova Classe chamada “ImageBuilder.cs”…
…e inclua o código abaixo.
public byte[] ImagemRedonda(string Path)
{
// Carrega a imagem
System.Drawing.Image imagem = System.Drawing.Bitmap.FromFile(Path);
// Estancia a Classe que será responsavel em converter a imagem em Array de Byte
System.IO.MemoryStream ms = new System.IO.MemoryStream();
// Atribui a imagem no Memory Stream criado
imagem.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
// Retorna um Array Byte conteudo a imagem
return ms.ToArray();
}
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”.
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.
protected void Page_Load(object sender, EventArgs e)
{
ImageBuilder img = new ImageBuilder();
string Path = Request.QueryString["path"];
string ServerPath = Server.MapPath(Path);
Response.ContentType = "image/jpeg"
Response.BinaryWrite(img.ImagemRedonda(ServerPath));
}
No Default.aspx iremos chamar o página Imagem.aspx e passando a QueryString path=|caminho_da_imagem| igual o código abaixo.
<img src="Imagem.aspx?path=imagens/thundercats.jpg" />
Se você fez os passos corretos, ao executar a imagem será exibida em seu tamanho real.
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.
private System.Drawing.Image ArredondaImagem(System.Drawing.Image imgTemp, int Largura, int Altura)
{
System.Drawing.Image imagem = CortaImagem(imgTemp, Largura, Altura);
System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(imagem);
System.Drawing.Rectangle retangulo = new System.Drawing.Rectangle();
System.Drawing.Pen PW = new System.Drawing.Pen(System.Drawing.Brushes.White, 2);
for (int i = imagem.Height; i < (imagem.Height * 2); i++)
{
retangulo.Height = i;
retangulo.Width = i;
retangulo.X = imagem.Width / 2 - retangulo.Width / 2;
retangulo.Y = imagem.Height / 2 - retangulo.Height / 2;
graphic.DrawEllipse(PW, retangulo);
}
return imagem;
}
Esse código irá cortar a imagem
private static System.Drawing.Image CortaImagem(System.Drawing.Image imgPhoto, int Width, int Height)
{
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
int sourceX = 0;
int sourceY = 0;
int destX = 0;
int destY = 0;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)Width / (float)sourceWidth);
nPercentH = ((float)Height / (float)sourceHeight);
if (nPercentH < nPercentW)
{
nPercent = nPercentW;
destY = (int)((Height - (sourceHeight * nPercent)) / 2);
}
else
{
nPercent = nPercentH;
destX = (int)((Width - (sourceWidth * nPercent)) / 2);
}
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
System.Drawing.Bitmap bmPhoto = new System.Drawing.Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto);
grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(imgPhoto, new System.Drawing.Rectangle(destX, destY, destWidth, destHeight), new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), System.Drawing.GraphicsUnit.Pixel);</p>
grPhoto.Dispose();
return bmPhoto;
}
E agora alteraremos o metodo “ImagemRedonda” atribuindo a linha que Corta a imagem conforme o código abaixo:
public byte[] ImagemRedonda(string Path)
{
// Carrega a imagem
System.Drawing.Image imagem = System.Drawing.Bitmap.FromFile(Path);
// Corta Imagem nas medidas informadas
imagem = ArredondaImagem(imagem, 150, 150);
// Estancia a Classe que será responsavel em converter a imagem em Array de Byte
System.IO.MemoryStream ms = new System.IO.MemoryStream();
// Atribui a imagem no Memory Stream criado
imagem.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
// Retorna um Array Byte conteudo a imagem
return ms.ToArray();
}
E aqui esta nosso resultado.
Espero que esse exemplo seja útil e aguarde que em breve postarei mais novos artigos nessa mesma linha, criando e manipulando imagens
Abraço e sucesso!!!






Cara Jóia este POST.
Eu trabalho com o reconhecimento facial, e eu preciso aprender a trabalhar com imagens, já percebi que tenho muito a aprender.
Parabéns
Parabens
Mesmo, Muito funcional e bacana o resultado…
Parabens, poste mais códigos sobre tratamento de imagens
Muito legal cara!
Show, muito bom Parabéns!!!
Eu precisa va de algo parecido com isso porém, eu preciso que o usuário selecione a áre a ser cortada como no orkut, vc tem algum código que faça isso, se tiver posta para gente.
Valew
Até mais
Wander Martins
Obrigado Wander. Na verdade eu tenho um código javascript que ele dá aquele efeito para selecionar a imagem.
Eu peguei nesse site.
http://www.defusion.org.uk/code/javascript-image-cropper-ui-using-prototype-scriptaculous/
Veja o demo
http://www.defusion.org.uk/demos/060519/cropper.php
Abraço