Как отобразить матрицу в виде цветов вместо элементов в С#

Мне нужно представить матрицу (2D-массив) в виде цветов вместо элементов массива.

Допустим, у меня есть матрица 8x6 как

1 1 1 1 2 2

1 1 1 1 2 2

1 1 1 1 2 2

1 1 1 1 0 0

3 3 3 3 3 0

3 3 3 3 3 0

0 0 0 0 0 0

0 0 0 0 0 0

в этом

есть три подматрицы 4x4, 3x2, 2x5, представленные разными номерами

Мне нужно сделать изображение с прямоугольником размером с матрицу таким образом, чтобы каждая подматрица была окрашена в разные цвета (любой цвет, кроме белого).

Может ли кто-нибудь помочь мне сделать это в С#.net? Я не силен в графике. заранее спасибо


person a4ashiq    schedule 28.01.2014    source источник
comment
WinForms? ВПФ? Что-то еще?... с WinForms вы можете использовать Panel и использовать Событие рисования. Просто повторите матрицу и нарисуйте каждый «квадрат» в зависимости от числа. Каждый квадрат должен быть 1/6 на 1/8 размера панели. Используйте предопределенный массив цветов для каждого индекса. Попробуйте это, а затем вернитесь, когда застрянете, и покажите свой код.   -  person musefan    schedule 28.01.2014
comment
Технически, поскольку вопрос заключается в создании изображения (экземпляр изображения?), целевая платформа (WinForms, WPF и т. д.) не играет никакой роли в том, как сделать требуемый, скажем, Bitmap   -  person Dmitry Bychenko    schedule 28.01.2014
comment
извините за поздний ответ, я намерен рисовать в веб-формах asp.net.   -  person a4ashiq    schedule 29.01.2014


Ответы (2)


Что ж, просто создайте изображение (например, Bitmap) и нарисуйте, сохраните и т. д.:

public static Bitmap MatrixAsBitmap(int[,] data) {
  if (Object.ReferenceEquals(null, data))
    return null;

  // Possible brushes (fill yourself)
  Brush[] brushes = new Brush[] {
    Brushes.Red,     // <- color for 0
    Brushes.Green,   // <- color for 1
    Brushes.Blue,    // <- color for 2
    Brushes.Yellow,  // <- ...
    Brushes.Cyan
  };

  // Let resulting bitmap be about 200x200
  int step_x = 200 / (data.GetUpperBound(1) - data.GetLowerBound(1));
  int step_y = 200 / (data.GetUpperBound(0) - data.GetLowerBound(0));

  Bitmap result = new Bitmap((data.GetUpperBound(1) - data.GetLowerBound(1) + 1) * step_x,
                             (data.GetUpperBound(0) - data.GetLowerBound(0) + 1) * step_y);

  using (Graphics gc = Graphics.FromImage(result)) {
    for (int i = data.GetLowerBound(0); i <= data.GetUpperBound(0); ++i)
      for (int j = data.GetLowerBound(1); j <= data.GetUpperBound(1); ++j) {
        int v = data[i, j];

        gc.FillRectangle(brushes[v % brushes.Length], new Rectangle(j * step_x, i * step_y, step_x, step_y));
      }
  }

  return result;
}

...

  int[,] A = new [,] {
    {1, 1, 1, 1, 2, 2},
    {1, 1, 1, 1, 2, 2},
    {1, 1, 1, 1, 2, 2},
    {1, 1, 1, 1, 0, 0},

    {3, 3, 3, 3, 3, 0},
    {3, 3, 3, 3, 3, 0},

    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0}
  };

  // Do everything as like with the bitmap:
  //  show it up, e.g. myPictureBox.Image = result;
  //  save it to the file...
  Bitmap result = MatrixAsBitmap(A); 
person Dmitry Bychenko    schedule 28.01.2014
comment
Поскольку мое требование для asp .net, я переписал для asp. Я опубликую как еще один ответ, чтобы кто-то еще мог извлечь выгоду. - person a4ashiq; 29.01.2014

Пример кода Asp.net, сделанный из ответа Дмитрия Быченко.

<%@ Page Language="C#" ContentType="image/jpeg" %>

<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Text" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.Drawing.Drawing2D" %>
<%
    Response.Clear();

int[,] A = new [,] {
{1, 1, 1, 1, 2, 2},
{1, 1, 1, 1, 2, 2},
{1, 1, 1, 1, 2, 2},
{1, 1, 1, 1, 0, 0},

{3, 3, 3, 3, 3, 0},
{3, 3, 3, 3, 3, 0},

{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
};

int[,] data = A; 
// Do everything as like with the bitmap:
//  show it up, e.g. myPictureBox.Image = result;
//  save it to the file...

// Possible brushes (fill yourself)
Brush[] brushes = new Brush[] {
Brushes.Red,     // <- color for 0
Brushes.Green,   // <- color for 1
Brushes.Blue,    // <- color for 2
Brushes.Yellow,  // <- ...
Brushes.Cyan
};

// Let resulting bitmap be about 200x200
int step_x = 200 / (data.GetUpperBound(1) - data.GetLowerBound(1));
int step_y = 200 / (data.GetUpperBound(0) - data.GetLowerBound(0));

Bitmap result = new Bitmap((data.GetUpperBound(1) - data.GetLowerBound(1) + 1) * step_x,
                         (data.GetUpperBound(0) - data.GetLowerBound(0) + 1) * step_y);

using (Graphics gc = Graphics.FromImage(result)) {
for (int i = data.GetLowerBound(0); i <= data.GetUpperBound(0); ++i)
  for (int j = data.GetLowerBound(1); j <= data.GetUpperBound(1); ++j) {
    int v = data[i, j];
    gc.FillRectangle(brushes[v % brushes.Length], new Rectangle(j * step_x, i * step_y,     step_x, step_y));
  }
}

result.Save(Response.OutputStream, ImageFormat.Jpeg);
result.Dispose();
Response.End();
%>
person a4ashiq    schedule 29.01.2014