/// <summary> /// GENERATE PUBLISH TASKS /// Given a published image, send it to all associated destinations. /// </summary> /// <param name="imageResult"></param> /// <param name="token"></param> /// <returns></returns> public List <Task> GeneratePublishTasks(GenerateImageResult imageResult, CancellationToken token) { var processor = new PublishProcessor(); var destinations = DbRepo.ListDestinations(imageResult); var items = new List <Task>(); foreach (var dest in destinations) { items.Add(Task <PublishResult> .Factory.StartNew(() => processor.Publish(dest), token, TaskCreationOptions.LongRunning, TaskScheduler.Default) .ContinueWith(taskInfo => Logit.LogPublishResult(taskInfo.Result)) ); } return(items); }
/// <summary> /// LIST DESTINATIONS /// </summary> /// <param name="imageResult"></param> /// <returns></returns> public static List <EntityDest> ListDestinations(GenerateImageResult imageResult) { var items = new List <EntityDest>(); for (int i = 10; i <= 20; i += 10) { items.Add(new EntityDest { Name = imageResult.ImageName + "-dest" + i.ToString(), DemoWaitMs = i * 1000, PublishTimeoutMs = 13000, Camera = imageResult.Camera }); } return(items); }
public GenerateImageResult Generate(IWord word, ELearnMode learnMode) { var result = new GenerateImageResult(); var syllables = _wordParseProvider.GetOrderedSyllables(word); var originalChars = CutToMaxLength(word.OriginalWord, HanMaxCharsCount); var originalLength = 0; var pinyinLength = 0; syllables = syllables.TakeWhile(a => { originalLength++; pinyinLength += a.Pinyin.Length; return(pinyinLength < MainMaxCharsCount && originalLength <= originalChars.Length); }).ToArray(); var y = 0f; var maxWidth = 0f; using (var img = new Image <Rgba32>(MaxWidth, MaxHeight)) { var builder = new GlyphBuilder(); var renderer = new TextRenderer(builder); img.Mutate(a => a.Fill(BackgroundColor)); if (learnMode == ELearnMode.FullView || learnMode != ELearnMode.OriginalWord) { var text = CutToMaxRow(originalChars, HanMaxLineCharsCount, true); var renderOptions = GetRenderOptions(KaitiHanFont, y); var size = TextMeasurer.Measure(text, renderOptions); y += size.Height + LineSpace; if (size.Width > maxWidth) { maxWidth = size.Width; } var paths = RenderText(builder, renderer, renderOptions, text); for (var i = 0; i < Math.Min(syllables.Length, paths.Length); i++) { var iLocal = i; var syllable = syllables[iLocal]; img.Mutate(a => a.Fill(syllable.Color.ToRgba32(), paths[iLocal])); } } if (learnMode == ELearnMode.FullView || learnMode != ELearnMode.Pronunciation) { var text = string.Join(" ", syllables.Select(a => a.Pinyin)); var renderOptions = GetRenderOptions(ArialUnicodeMainFont, y); var size = TextMeasurer.Measure(text, renderOptions); y += size.Height + LineSpace; if (size.Width > maxWidth) { maxWidth = size.Width; } var paths = RenderText(builder, renderer, renderOptions, text); var currentPathPosition = 0; foreach (var syllable in syllables) { if (currentPathPosition >= paths.Length) { break; } var pathCollection = new PathCollection(paths.Skip(currentPathPosition).Take(syllable.Pinyin.Length)); img.Mutate(a => a.Fill(syllable.Color.ToRgba32(), pathCollection)); currentPathPosition += syllable.Pinyin.Length; } } if (learnMode == ELearnMode.FullView || learnMode != ELearnMode.Translation) { var renderOptions = GetRenderOptions(ArialUnicodeMainFont, y); var transChars = CutToMaxRow(CutToMaxLength(word.Translation, MainMaxCharsCount, string.Empty), MainMaxLineCharsCount); var size = TextMeasurer.Measure(transChars, renderOptions); y += size.Height + LineSpace; if (size.Width > maxWidth) { maxWidth = size.Width; } var paths = RenderText(builder, renderer, renderOptions, transChars); img.Mutate(a => a.Fill(MainColor, new PathCollection(paths))); } var finalWidth = (int)(maxWidth + 2 * Padding); img.Mutate(a => a.Crop(new Rectangle((MaxWidth - finalWidth) / 2, 0, finalWidth, (int)y))); result.Width = img.Width; result.Height = img.Height; using (var ms = new MemoryStream()) { img.Save(ms, new PngEncoder()); result.ImageBody = ms.ToArray(); } } return(result); }
/// <summary> /// LOG GENERATE IMAGE RESULT /// </summary> /// <param name="generateImageResult"></param> /// <returns></returns> public static GenerateImageResult LogGenerateImageResult(GenerateImageResult generateImageResult) { LogVerbose("Published Image generated for camera: " + generateImageResult.Camera.Name + ", published image filename: " + generateImageResult.ImageName + " (thread " + Thread.CurrentThread.ManagedThreadId.ToString() + ")"); return(generateImageResult); }