Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brunoguitarman

Editar imagens com C#

Recommended Posts

Galera, o C# tem alguma biblioteca ou função para que eu possa editar imagens jpeg?

Eu preciso ler um arquivo jpeg e preciso que essa função retorne os pixels da imagem, ou seja, algo como um ponteiro de c (unsigned char *pixels) ou um array, uma matriz, sei lá, algo que me mostre cada componente da imagem e me diga seu tamanho e quantos canais a imagem possui, para que eu possa fazer coisas como espelhar a imagem, deixá-la em tons de cinza, etc.

Por exemplo, uma imagem 4 x 4 com 3 canais (RGB) seria representada da seguinte forma:

 

R=1 G=1 B=0	R=1 G=0 B=0	R=1 G=1 B=1	R=0 G=0 B=0
R=1 G=1 B=0	R=1 G=0 B=1	R=1 G=1 B=1	R=0 G=0 B=0
R=0 G=1 B=0	R=1 G=0 B=1	R=1 G=1 B=1	R=0 G=1 B=0
R=0 G=1 B=0	R=1 G=0 B=1	R=1 G=1 B=1	R=1 G=1 B=0

Onde os números são os valores de cada canal de cada pixel.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hoje é seu dia de sorte Bruno, desenvolvo pesquisas científicas relacionadas a IA e Processamento de Imagens em C#, pois na minha avaliação é uma linguagem muito prática para esse tipo de aplicação!

 

Você pode utilizar a classe System.Drawing.Bitmap para carregar imagens de diversos formatos e trabalhar com seus pixels em uma matriz de NxNx3(RGB).

 

O acesso é bem simples, só pra você ter uma idéia segue um exemplo:

 

Bitmap imagem = new Bitmap(caminhoDaImagem);

imagem.GetPixel(valorX, ValorY).R; //Valor de Red na posição X e Y
imagem.GetPixel(valorX, ValorY).G; //Valor de Green na posição X e Y
imagem.GetPixel(valorX, ValorY).B; //Valor de Blue na posição X e Y

Baseado nesse conceito, o .Net Framework oferece diversas classes para edição de imagens de forma simplificada, porém, você pode realizar as alterações manualmente através da manipulação da matriz de pixel. Utilizando uma abordagem matemática eu implementei alguns efeitos de edição como flip horizontal e vertical, descoloração, inversão do canal RGB (negativo de foto), rotação etc.

 

Eu utilizo o Visual Studio 2008 para o desenvolvimento dos meus projetos e estou bem satisfeito com os resultados e as facilidades oferecidas pela ferramenta.

 

Qualquer dúvida estou a disposição. http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hoje é seu dia de sorte Bruno, desenvolvo pesquisas científicas relacionadas a IA e Processamento de Imagens em C#, pois na minha avaliação é uma linguagem muito prática para esse tipo de aplicação!

 

Você pode utilizar a classe System.Drawing.Bitmap para carregar imagens de diversos formatos e trabalhar com seus pixels em uma matriz de NxNx3(RGB).

 

O acesso é bem simples, só pra você ter uma idéia segue um exemplo:

 

Bitmap imagem = new Bitmap(caminhoDaImagem);

imagem.GetPixel(valorX, ValorY).R; //Valor de Red na posição X e Y
imagem.GetPixel(valorX, ValorY).G; //Valor de Green na posição X e Y
imagem.GetPixel(valorX, ValorY).B; //Valor de Blue na posição X e Y

Baseado nesse conceito, o .Net Framework oferece diversas classes para edição de imagens de forma simplificada, porém, você pode realizar as alterações manualmente através da manipulação da matriz de pixel. Utilizando uma abordagem matemática eu implementei alguns efeitos de edição como flip horizontal e vertical, descoloração, inversão do canal RGB (negativo de foto), rotação etc.

 

Eu utilizo o Visual Studio 2008 para o desenvolvimento dos meus projetos e estou bem satisfeito com os resultados e as facilidades oferecidas pela ferramenta.

 

Qualquer dúvida estou a disposição. http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif

Por isso que gosto desse forum, heheheh.

Pô, cara, valeu mesmo.

Processamento de imagens e inteligência artificial são duas áreas que tenho bastante interesse. Mais processamento de imagens, mas gosto muito de ambas. Gostaria de trocar uma idéia contigo a respeito, se tiver msn melhor, senão vai por aqui mesmo.

Aliás, isso que estou fazendo é para a faculdade e como trabalho final da cadeira estou querendo fazer um poster de uma imagem montada por várias outras. Tem alguma idéia de como fazer isso? Não sei se fui claro com isso, mas a idéia é pegar, como eu tenho aqui em casa um poster do Villeneuve que é formado por várias fotos minúsculas, todas elas de pilotos, de carros, etc, mas se tu olhar de longe, não dá pra ver essas imagens e os tons delas formam uma imagem grande que é a do villeneuve pilotando o carro. Acho show de bola isso. Se já puder me dar uma idéia agradeço. Tinha pensado em cálculo de histograma, mas se não me engano ele somente calcula luminância não é? Então não sei como aplicaria isso a imagens coloridas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente a sua idéia é muito interessante Bruno, sugiro que você dê uma olhada nos livros Processamento de Imagens Digitais [R. C. Gonzales e R. E. Woods.] e Computação Gráfica [A. Conci et al], são ótimas referências de processamento de imagens.

 

você pode realizar um scan na imagem principal com um kernel de NxN pixel (dimesão da imagem secundária), calculando o módulo da correlação dos canais RGB, entre a região analisada e a imagem secundária. Repetindo esse método para todas as imagens que vão compor a montagem você terá um indice das imagens mais adequadas para cada região.

 

É como procurar uma matriz menor dentro de outra maior identificando a área onde os valores são mais parecidos.

 

Quanto maior a dimensão da imagem principal em relação as imagens secundárias, melhor será o resultado. http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Botando a mão na massa me surgiu uma dúvida na hora de fazer a conversão para tons de cinza.

 

Tenho a seguinte fórmula usada para a conversão:

 

L = 0.299*R + 0.587*G + 0.114*B, onde R, G e B são as componentes de cor do pixel.

 

Mas isso daria uma número do tipo double.

 

Como faço a conversão para ele se adequar ao tipo pedido pelo SetPixel(x,y,Color)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Botando a mão na massa me surgiu uma dúvida na hora de fazer a conversão para tons de cinza.

 

Tenho a seguinte fórmula usada para a conversão:

 

L = 0.299*R + 0.587*G + 0.114*B, onde R, G e B são as componentes de cor do pixel.

 

Mas isso daria uma número do tipo double.

 

Como faço a conversão para ele se adequar ao tipo pedido pelo SetPixel(x,y,Color)?

Abaixo o método que eu utilizo:

private Bitmap GrayScaleFilter(Bitmap image)
		{
			Bitmap grayScale = new Bitmap(image.Width, image.Height);

			for (Int32 y = 0; y < grayScale.Height; y++)
				for (Int32 x = 0; x < grayScale.Width; x++)
				{
					Color c = image.GetPixel(x, y);

					Int32 gs = (Int32)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);

					grayScale.SetPixel(x, y, Color.FromArgb(gs, gs, gs));
				}

			return grayScale;
		}

... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma coisa, só pra não perder o costume, hehehe:

 

Atualmente eu estou usando uma imagem que é carregada e outra auxiliar para fazer as mudanças, por exemplo, algo do tipo:

 

Bitmap ImagemPrincipal, ImagemAuxiliar;

Sempre que eu vou fazer alguma modificação, tipo espelhamento, essa escala de cinza, ou seja lá o que for, faço pegando os dados da imagem original, transformando-os, e passando-os para a imagem auxiliar. No fim, faço uma cópia daquilo que foi feito para a imagem principal, já que minha idéia é ter efeitos cumulativos, então faço uma laço como o seguinte:

 

for ( i = 0; i < ImagemPrincipal.Width; i++)
				for (j = 0; j < ImagemPrincipal.Height; j++)
				{
					ImagemPrincipal.SetPixel(i, j, ImagemAuxiliar.GetPixel(i, j));
				}

Mas não teria um comando que fizesse isso por mim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas não teria um comando que fizesse isso por mim?

Ae é só você atribuir a instância do objeto auxiliar no objeto principal, assim você substitui a imagem toda.

 

ImagemPrincipal = ImagemAuxiliar;

...:blink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas não teria um comando que fizesse isso por mim?

Ae é só você atribuir a instância do objeto auxiliar no objeto principal, assim você substitui a imagem toda.

 

ImagemPrincipal = ImagemAuxiliar;

...:blink:

 

Mas isso não algo como o ponteiro de ImagemPrincipal apontasse para o mesmo endereço de ImagemAuxiliar e, no momento em que ImagemAuxiliar deixasse de existir as informações que estão em ImagemPrincipal também desaparecessem?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.