/// <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(); } } }
/// <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(); } } }