C# - Combinando diversas Imagens em um único arquivo
Há algum tempo atrás publiquei um artigo para VB .NET que mostrava como combinar duas imagens , mesclando-as em um único arquivo imagem. (veja as referências).
Pois bem, vamos fazer a mesma coisa usando a linguagem C#.
Na verdade iremos um pouco além pois vamos mostrar como podemos combinar diversas imagens em um único arquivo.
Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome CombinandoImagens;
A seguir no formulário form1.cs inclua os seguintes controles a partir da ToolBar:
Conforme o leiaute da figura abaixo:
A seguir defina os seguintes namespaces no projeto:
using System.Security;
using System.IO;
No evento Click do botão Selecionar imagens inclua o seguinte código:
private void btnSelecionarImagens_Click(object sender, EventArgs e) { //define as propriedades do controle //OpenFileDialog this.ofd1.Multiselect = true; this.ofd1.Title = "Selecionar Fotos"; ofd1.InitialDirectory = @"C:\macoratti\Pictures"; //filtra para exibir somente arquivos de imagens ofd1.Filter = "Images (*.BMP;*.JPG;*.GIF,*.PNG,*.TIFF)|*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF|" + "All files (*.*)|*.*"; ofd1.CheckFileExists = true; ofd1.CheckPathExists = true; ofd1.FilterIndex = 2; ofd1.RestoreDirectory = true; ofd1.ReadOnlyChecked = true; ofd1.ShowReadOnly = true; DialogResult dr = this.ofd1.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { // Le os arquivos selecionados foreach (String arquivo in ofd1.FileNames) { txtArquivos.Text += arquivo + "#"; // cria um PictureBox try { PictureBox pb = new PictureBox(); Image Imagem = Image.FromFile(arquivo); pb.SizeMode = PictureBoxSizeMode.StretchImage; //para exibir as imagens em tamanho natural //descomente as linhas abaixo e comente as duas seguintes //pb.Height = loadedImage.Height; //pb.Width = loadedImage.Width; pb.Height = 100; pb.Width = 100; //atribui a imagem ao PictureBox - pb pb.Image = Imagem; //inclui a imagem no containter flowLayoutPanel flowLayoutPanel1.Controls.Add(pb); } catch (SecurityException ex) { // O usuário não possui permissão para ler arquivos MessageBox.Show("Erro de segurança Contate o administrador de segurança da rede.\n\n" + "Mensagem : " + ex.Message + "\n\n" + "Detalhes (enviar ao suporte):\n\n" + ex.StackTrace); } catch (Exception ex) { // Não pode carregar a imagem (problemas de permissão) MessageBox.Show("Não é possível exibir a imagem : " + arquivo.Substring(arquivo.LastIndexOf('\\')) + ". Você pode não ter permissão para ler o arquivo , ou " + " ele pode estar corrompido.\n\nErro reportado : " + ex.Message); } } } }//fim e evento botão |
A rotina CombinarImagens() que combinas as imagens selecionada possui o seguinte código:
public static System.Drawing.Bitmap CombinarImagens(string[] files) { //lê todas as imagens para a memória List<System.Drawing.Bitmap> images = new List<System.Drawing.Bitmap>(); System.Drawing.Bitmap imagemFinal = null; try { int width = 0; int height = 0; foreach (string image in files) { //cria um bitmap a partir do arquivo e o inclui na lista System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image); //atualiza o tamanho da imagem bitmap final width += bitmap.Width; height = bitmap.Height > height ? bitmap.Height : height; images.Add(bitmap); } //cria um bitmap para tratar a imagem combinada imagemFinal = new System.Drawing.Bitmap(width, height); //Obtem o objeto gráfico da imagem using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(imagemFinal)) { //define a cor de fundo g.Clear(System.Drawing.Color.Black); //percorre imagem por imagem e gera uma unica imagem final int offset = 0; foreach (System.Drawing.Bitmap image in images) { g.DrawImage(image, new System.Drawing.Rectangle(offset, 0, image.Width, image.Height)); offset += image.Width; } } return imagemFinal; } catch (Exception ex) { if (imagemFinal != null) imagemFinal.Dispose(); throw ex; } finally { //limpa a memória foreach (System.Drawing.Bitmap image in images) { image.Dispose(); } } } |
No evento Click do botão de comando btnCombinarImagens temos o código que obtém os arquivos selecionados e salva as imagens combinadas:
private void btnCombinarImagens_Click(object sender, EventArgs e) { System.Drawing.Bitmap imagensCombinadas; //pega todos os arquivos da pasta //string[] arquivos = Directory.GetFiles(@"C:\Imagens"); //obtem a posicao da ultima ocorrência do caractere # int posicao = txtArquivos.Text.LastIndexOf('#'); //remove a última ocorrência do caractere # string arquivosSelecionados = txtArquivos.Text.Remove(posicao); //separa os nomes dos arquivos gerando um array de string string[] arquivos = arquivosSelecionados.Split('#'); //combina as imagens em um única imagem imagensCombinadas = CombinarImagens(arquivos); //salva a nova imagem imagensCombinadas.Save(@"C:\dados\ImagensCombinadas.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); } |
Observe que estamos separando os arquivos usando a função Split().
Executando o projeto e selecionando mais de uma imagem iremos obter o seguinte resultado:
Abrindo o arquivo de imagens combinadas que foram salvas teremos:
Simples, simples assim...
Pegue o projeto completo aqui: CombinandoImagens.zip
Eu sei é apenas C# e VB .NET, mas eu gosto...
Referências: