public Bitmap Paint(IEnumerable <GraphicString> words) { var wordsArr = words.ToArray(); FillLayouter(wordsArr); var layoutRects = layouter.GetRectangles(); if (imgSize == default) { imgSize = CalculateImageSize(layoutRects); } var bitmap = new Bitmap(imgSize.Width, imgSize.Height); using var g = Graphics.FromImage(bitmap); var rectIndex = 0; var shiftVector = CalculateShiftVector(layoutRects); var background = new Rectangle { Size = imgSize }; g.DrawRectangle(new Pen(palette.BackgroundColor), background); g.FillRectangle(new SolidBrush(palette.BackgroundColor), background); foreach (var word in wordsArr) { var font = new Font(fontFamily, word.FontSize); using var brush = new SolidBrush(palette.GetNextColor()); g.DrawString(word.Value, font, brush, layoutRects[rectIndex].Shift(shiftVector)); rectIndex++; } return(bitmap); }
private void FailIfSmallSize(ILayouter layouter, Size imgSize) { var rects = layouter.GetRectangles(); var a = rects.Where(rect => rect.Left <-1 || rect.Right - 1> imgSize.Width || rect.Top <-1 || rect.Bottom - 1> imgSize.Height); if (rects.Any(rect => rect.Left < -1 || rect.Right - 1 > imgSize.Width || rect.Top < -1 || rect.Bottom - 1 > imgSize.Height)) { throw new ArgumentException("Размер изображения слишком маленький"); } }
public Result <None> CreateImage(IInitialSettings settings) { var words = reader.ReadWords(settings.InputFilePath); return(wordProcessor.ProcessWords(words) .Then(wordsWithCount => wordsWithCount.ToList()) .Then(wordsWithCount => { words = wordsWithCount.Select(e => e.Word); var sizes = converter.ConvertToSizes(wordsWithCount); var rectangles = layouter.GetRectangles(sizes); return imageSizeCalculator.CalculateImageSize(rectangles) .Then(calculatedSize => HandleSize(settings, calculatedSize)) .Then(imageSize => (rect: GetWordRectangles(words, rectangles, imageSize), imageSize)); }) .Then(x => visualizer.DrawImage(x.rect, x.imageSize)) .Then(image => saver.SaveImage(image, settings.OutputFilePath))); }
public void CreateImage(IInitialSettings settings) { var words = reader.ReadWords(settings.InputFilePath); var wordsWithCount = wordProcessor.ProcessWords(words).ToList(); var sizes = converter.ConvertToSizes(wordsWithCount); var rectangles = layouter.GetRectangles(sizes); var imageSize = settings.ImageSize; if (imageSize == Size.Empty) { imageSize = imageSizeCalculator.CalculateImageSize(rectangles); } rectangles = rectanglesTransformer.TransformRectangles(rectangles, imageSize); words = wordsWithCount.Select(e => e.Word); var wordRectangles = words.Zip(rectangles, (w, r) => new WordRectangle(w, r)).ToList(); var image = visualizer.DrawImage(wordRectangles, imageSize); saver.SaveImage(image, settings.OutputFilePath); }