static ImagemControle CarregarImagem(string nomeArquivo, string diretorioOrigem, int contagem, int clockOffset) { int momentoInicial = Environment.TickCount; ImagemControle info = null; Bitmap bitmap = new Bitmap(Path.Combine(diretorioOrigem, nomeArquivo)); try { bitmap.Tag = nomeArquivo; info = new ImagemControle(contagem, nomeArquivo, bitmap, clockOffset); info.MomentoInicioDaFase[0] = momentoInicial - clockOffset; bitmap = null; } finally { if (bitmap != null) { bitmap.Dispose(); } } if (info != null) { info.MomentoFimDaFase[0] = Environment.TickCount - clockOffset; } return(info); }
static void FiltrarImagem(ImagemControle info) { int momentoInicial = Environment.TickCount; var sc = info.ImagemMiniatura; info.ImagemMiniatura = null; Bitmap bitmap = sc.AdicionarDesfoque(GaussianNoiseAmount); try { bitmap.Tag = sc.Tag; info.FilteredImage = bitmap; info.MomentoInicioDaFase[2] = momentoInicial - info.ClockOffset; bitmap = null; } finally { if (bitmap != null) { bitmap.Dispose(); } sc.Dispose(); } info.MomentoFimDaFase[2] = Environment.TickCount - info.ClockOffset; }
static void Visualizar(ImagemControle info, int contagem, Action <ImagemControle> acaoVisualizar, int duracao) { int momentoInicial = Environment.TickCount; info.ImageCount = contagem; info.MomentoInicioDaFase[3] = momentoInicial - info.ClockOffset; info.MomentoFimDaFase[3] = (duracao > 0) ? momentoInicial - info.ClockOffset + duracao : Environment.TickCount - info.ClockOffset; acaoVisualizar(info); }
/// <summary> /// Fase 4 do encanamento da imagem: invoque o delegate chamado pelo usuário (por exemplo, para exibir o resultado em uma UI) /// </summary> static void VisualizarImagensEmPipeline(IEnumerable <ImagemControle> imagensFiltradas, Action <ImagemControle> acaoVisualizar, Action <ImagemControle> atualizarEstatisticas, CancellationTokenSource cts) { int contagem = 1; int duracao = 0; var token = cts.Token; ImagemControle info = null; try { foreach (ImagemControle infoTmp in imagensFiltradas) { info = infoTmp; if (token.IsCancellationRequested) { break; } int exibicaoInicial = Environment.TickCount; atualizarEstatisticas(info); Visualizar(info, contagem, acaoVisualizar, duracao); duracao = Environment.TickCount - exibicaoInicial; contagem = contagem + 1; info = null; } } catch (Exception e) { cts.Cancel(); if (!(e is OperationCanceledException)) { throw; } } finally { if (info != null) { info.Dispose(); } } }
/// <summary> /// Fase 1: carregue imagens do disco e coloque-as em uma fila. /// </summary> static void CarregarImagensEmPipeline(IEnumerable <string> nomeDosArquivos, string diretorioOrigem, BlockingCollection <ImagemControle> original, CancellationTokenSource cts) { int contagem = 0; int clockOffset = Environment.TickCount; var token = cts.Token; ImagemControle info = null; try { foreach (var nome in nomeDosArquivos) { if (token.IsCancellationRequested) { break; } info = CarregarImagem(nome, diretorioOrigem, contagem, clockOffset); original.Add(info, token); contagem += 1; info = null; Thread.Sleep(1000 * 1); } } catch (Exception e) { // in case of exception, signal shutdown to other pipeline tasks cts.Cancel(); if (!(e is OperationCanceledException)) { throw; } } finally { original.CompleteAdding(); if (info != null) { info.Dispose(); } } }
/// <summary> /// Fase 3: Filtro nas imagens (dê uma aparência salpicada ao adicionar o ruído gaussiano) /// </summary> static void FiltrarImagensEmPipeline( BlockingCollection <ImagemControle> miniaturaDeImagens, BlockingCollection <ImagemControle> imagensFiltradas, CancellationTokenSource cts) { ImagemControle info = null; try { var token = cts.Token; foreach (ImagemControle infoTmp in miniaturaDeImagens.GetConsumingEnumerable()) { info = infoTmp; if (token.IsCancellationRequested) { break; } FiltrarImagem(info); imagensFiltradas.Add(info, token); info = null; } } catch (Exception e) { cts.Cancel(); if (!(e is OperationCanceledException)) { throw; } } finally { imagensFiltradas.CompleteAdding(); if (info != null) { info.Dispose(); } } }
static void EscalarImagem(ImagemControle info) { int momentoInicial = Environment.TickCount; var orig = info.ImagemOriginal; info.ImagemOriginal = null; const int escala = 200; var imagemEstaGrande = (orig.Width > orig.Height); var novaLargura = imagemEstaGrande ? escala : escala * orig.Width / orig.Height; var novaAltura = !imagemEstaGrande ? escala : escala * orig.Height / orig.Width; Bitmap bitmap = new Bitmap(orig, novaLargura, novaAltura); try { Bitmap bitmap2 = bitmap.AdicionarBorda(15); try { bitmap2.Tag = orig.Tag; info.ImagemMiniatura = bitmap2; info.MomentoInicioDaFase[1] = momentoInicial - info.ClockOffset; bitmap2 = null; } finally { if (bitmap2 != null) { bitmap2.Dispose(); } } } finally { bitmap.Dispose(); orig.Dispose(); } info.MomentoFimDaFase[1] = Environment.TickCount - info.ClockOffset; }
/// <summary> /// Run the image processing pipeline. /// </summary> /// <param name="nomeDosArquivos">List of image file names in source directory</param> /// <param name="diretorioOrigem">Name of directory of source images</param> /// <param name="mostrarAcao">Display action</param> /// <param name="cts">Cancellation token</param> static void RodarSequencia(IEnumerable <string> nomeDosArquivos, string diretorioOrigem, Action <ImagemControle> mostrarAcao, CancellationTokenSource cts) { int contagem = 0; int clockOffset = Environment.TickCount; int duracao = 0; var token = cts.Token; ImagemControle info = null; try { foreach (var fileName in nomeDosArquivos) { if (token.IsCancellationRequested) { break; } info = CarregarImagem(fileName, diretorioOrigem, contagem, clockOffset); EscalarImagem(info); FiltrarImagem(info); int displayStart = Environment.TickCount; Visualizar(info, contagem + 1, mostrarAcao, duracao); duracao = Environment.TickCount - displayStart; contagem += 1; info = null; } } finally { if (info != null) { info.Dispose(); } } }