2015-11-26 2 views
5

Я использую рисунок .Net для рисования диаграммы. Это, по существу, сложная гистограмма. Проблема у меня в том, что я хочу уменьшить количество строк в стиле штриховки, чтобы таким образом масштабировать ее, чтобы сделать ее более ясной. Я огляделся, но не наткнулся на все, что могло мне помочь.Как увеличить масштаб штриховки в прямоугольнике?

Я рисую прямоугольник, а затем использую люковую щетку, чтобы заполнить его, но из-за размера изображения люк становится менее понятным. Благодарим вас за любые предложения.

Типы hatchStyles и кистей хранятся в db, и я использую вспомогательную функцию для их возврата. Поэтому я рисую прямоугольник, и после получения кисти я заполняю прямоугольник. По сути, я хочу увеличить заливку заливки, если это можно сделать.

g.DrawRectangle(gridpen, startX, startY, BOREHOLE_RECT_WIDTH, layerRectHeight); 

brush = GetBoreholeBrush(l.SoilTypeMatrixLevel1Id.PrimaryBrushType, 
          l.SoilTypeMatrixLevel1Id.PrimaryFillStyle, 
          l.SoilTypeMatrixLevel1Id.PrimaryColour); 

g.FillRectangle(brush, startX, startY, BOREHOLE_RECT_WIDTH, layerRectHeight); 

И функция getBrush; тип кисти, стиль штриховки и цвет сохраняются в БД и используется для создания возвращаемой кисти:

//=================================== 
    private Brush GetBoreholeBrush(string BrushType, string HatchStyle, string Colour) 
    //=================================== 
    { 
     //Decide on what brush type has been chosen. 
     Brush brush; 
     if (BrushType.ToLower() == BrushTypes.HatchBrush.ToString().ToLower()) 
     { 
      brush = new HatchBrush(GetHatchStyle(HatchStyle), 
            Color.Black, ColorTranslator.FromHtml(Colour)); 
     } 
     else if (BrushType.ToLower() == BrushTypes.SolidBrush.ToString().ToLower()) 
     { 
      brush = new HatchBrush(GetHatchStyle(HatchStyle), 
            Color.Black, ColorTranslator.FromHtml(Colour)); 
     } 
     else if (BrushType.ToLower() == BrushTypes.TextureBrush.ToString().ToLower()) 
     { 
      brush = new HatchBrush(GetHatchStyle(HatchStyle), 
            Color.Black, ColorTranslator.FromHtml(Colour)); 
     } 
     else 
     { 
      brush = new HatchBrush(GetHatchStyle(HatchStyle), 
            Color.Black, ColorTranslator.FromHtml(Colour)); 
     } 

     return brush; 
    } 

Функция возвращает стиль штриховки:

//=================================== 
    private HatchStyle GetHatchStyle(string FillStyle) 
    //=================================== 
    { 
     //Loop through each hatch tyle and return the correct one. 
     foreach (HatchStyle style in Enum.GetValues(typeof(HatchStyle))) 
     { 
      if (style.ToString().ToLower() == FillStyle.ToLower()) 
      { 
       return style; 
      } 
     } 
     return HatchStyle.Vertical; 
    } 

Как вы можете видеть на картинке ниже стиль штриховки не ясен.

enter image description here

+1

_as изображение размер увеличивается. Вы должны это объяснить! Как увеличивается размер изображения? Масштабируя изображение? (Очевидно, тогда все пиксели получаются масштабированными и нерезкими, вместо этого рисуют в нужном размере, а затем заполняем.) – TaW

+0

Извините, это было плохое объяснение с моей стороны. Доза размера изображения не изменяется. Из-за большого изображения стиль штриховки становится менее ясным, и я хочу его масштабировать. –

+0

Итак, у вас есть большая диаграмма, а ваш hatchstyle пиксель-маленький, и вы хотите увеличить ширину линий и промежутков между линиями в штриховке, так что, когда ваше изображение будет напечатано или уменьшено, штриховки/линии все еще будут видны как заштрихованные, а не как «сероватые»? – quetzalcoatl

ответ

7

Самый прямой, но, вероятно, не очень полезно Ответ: Нет, вы не можете масштабировать шаблон люка HatchBrush.

Он предназначен для постоянного обзора на уровне пикселей и даже не зависит от масштабирования объекта Graphics.

Рассмотрев ваш вопрос, я задаюсь вопросом: вы действительно используете HatchBrush? Вы получаете кисть от функции GetBoreholeBrush. Если вы действительно сохранили индексы в 50 HatchStyle, то, я думаю, вы действительно используете HatchBrush.

Теперь, как с помощью HatchBrush не будет работать, я думаю, вы могли бы использовать вместо TextureBrush ..

Вы можете преобразовать штриховку в больших версиях путем расширения их; это не совсем простое преобразование. Прямой подход при рисовании большего на целочисленный множитель и без сглаживания является простым и может быть достаточно хорошим.

Но вы, возможно, придется подстроить их, так как таким образом все пиксели, то есть обе линии пикселей и фон пикселей получить увеличенный, а также все диагонали будут выглядеть неровными.

Таким образом, вам нужно будет сбалансировать размер люка и ширину хода и воссоздать все шаблоны, которые вам нужны с нуля в больших размерах.

Вот пример, который иллюстрирует проблемы с простым решением; первая строка - это исходный шаблон штриховки, остальные - простые результаты кисти текстуры, масштабируемые 1x, 2x и 3x ..:

enter image description here

Первая функция для преобразования HatchBrush к TextureBrush

TextureBrush TBrush(HatchBrush HBrush) 
{ 
    using (Bitmap bmp = new Bitmap(8,8)) 
    using (Graphics G = Graphics.FromImage(bmp)) 
    { 
     G.FillRectangle(HBrush, 0, 0, 8, 8); 
     TextureBrush tb = new TextureBrush(bmp); 
     return tb; 
    } 
} 

Обратите внимание, что шаблон люк 8x8 пикселей.

Теперь Paint код, используемый для вышеуказанного изображения:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    var hs = (HatchStyle[])Enum.GetValues(typeof(HatchStyle)); 

    for (int i = 0; i < hs.Length; i++) 
     using (HatchBrush hbr = new HatchBrush(hs[i], Color.GreenYellow)) 
     using (HatchBrush hbr2 = new HatchBrush(hs[i], Color.LightCyan)) 
     { 
      e.Graphics.FillRectangle(hbr, new Rectangle(i * 20, 10,16,60)); 
      using (TextureBrush tbr = TBrush(hbr2)) 
      { 
       e.Graphics.FillRectangle(tbr, new Rectangle(i * 20, 80, 16, 60)); 
       tbr.ScaleTransform(2, 2); 
       e.Graphics.FillRectangle(tbr, new Rectangle(i * 20, 150, 16, 60)); 
       tbr.ResetTransform(); 
       tbr.ScaleTransform(3,3); 
       e.Graphics.FillRectangle(tbr, new Rectangle(i * 20, 220, 16, 60)); 
      } 
     } 
} 

Следует отметить, что в то время как TextureBrush имеет хорошие методы для изменения текстуры, то HatchBrush не имеет ничего подобного, что на всех ..