Парад RGB в WPF - PullRequest
       2

Парад RGB в WPF

1 голос
/ 20 ноября 2010

Я должен создать этот проект парада RBG в WPF, но понятия не имею, с чего начать. Он должен обрабатывать изображения в настройках 720p (1280x720). Любая идея о том, с чего начать, я совершенно не знаю. Я не хочу, чтобы весь проект был всего лишь несколькими указателями.

Спасибо.

1 Ответ

0 голосов
/ 21 ноября 2010

Хорошо, это то, что я придумал, я уверен, что есть лучшее решение, но оно работает:

public ObservableCollection<double> RPercentPerColumn { get; set; }
public ObservableCollection<double> GPercentPerColumn { get; set; }
public ObservableCollection<double> BPercentPerColumn { get; set; }

private int[] GetImagePixels(ref int imageHeight, ref int imageWidth)
{
    BitmapImage image = new BitmapImage(new Uri(this.CurrentImageFile, UriKind.Absolute));

    WriteableBitmap bmp = new WriteableBitmap(image);

    int rows = bmp.PixelHeight;
    int columns = bmp.PixelWidth;

    int[] pixels = new int[bmp.PixelWidth * bmp.PixelHeight];

    bmp.CopyPixels(pixels, columns * 4, 0);

    imageHeight = bmp.PixelHeight;
    imageWidth = bmp.PixelWidth;

    return pixels;
}

private void ClearAllData()
{
    this.RPercentPerColumn.Clear();
    this.GPercentPerColumn.Clear();
    this.BPercentPerColumn.Clear();
}

public void ProcessRGBParade()
{
    if (string.IsNullOrEmpty(this.CurrentImageFile))
        return;

    ClearAllData();

    int columns = 0;
    int rows = 0;

    int[] pixels = GetImagePixels(ref rows, ref columns);

    int column = 0;
    int row = 0;

    int redColumnTotal = 0;
    int greenColumnTotal = 0;
    int blueColumnTotal = 0;
    int currentPixel = 0;

    double totalColorInColumn = 0;

    double redIntensity = 0;
    double greenIntensity = 0;
    double blueIntensity = 0;

    int r = 0;
    int g = 0;
    int b = 0;

    // logic to calculate intensity
    for (int i = 0; i < pixels.Length; i ++)
    {
        row++;

        r = (pixels[currentPixel] & 0x00FF0000) >> 16;
        g = (pixels[currentPixel] & 0x0000FF00) >> 8;
        b = (pixels[currentPixel] & 0x000000FF);

        redColumnTotal += r;
        greenColumnTotal += g;
        blueColumnTotal += b;

        totalColorInColumn += r + g + b;

        if (row == rows)
        {
            row = 0;
            column++;

            currentPixel = column;

            redIntensity = (redColumnTotal / totalColorInColumn) * 100;
            greenIntensity = (greenColumnTotal / totalColorInColumn) * 100;
            blueIntensity = (blueColumnTotal / totalColorInColumn) * 100;

            RPercentPerColumn.Add(double.IsNaN(redIntensity) ? 0 : redIntensity);
            GPercentPerColumn.Add(double.IsNaN(greenIntensity) ? 0 : greenIntensity);
            BPercentPerColumn.Add(double.IsNaN(blueIntensity) ? 0 : blueIntensity);

            redColumnTotal = 0;
            greenColumnTotal = 0;
            blueColumnTotal = 0;

            totalColorInColumn = 0;
        }
        else
        {
            currentPixel += columns;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...