2010-11-20 10 views
1

Je suis supposé créer ce projet de parade RBG dans WPF, mais je n'ai aucune idée par où commencer. Il devrait gérer les images dans les paramètres 720p (1280x720). Toute idée sur par où commencer, je suis complètement désemparé. Je ne veux pas que l'ensemble du projet soit juste quelques indications.Parade RVB dans WPF

Merci.

+0

figured it out sur moi-même. Je posterai le projet plus tard. Merci. – Carlo

Répondre

0

Ok, voilà ce que je suis venu avec, je suis sûr qu'il ya une meilleure solution, mais il fonctionne:

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; 
     } 
    } 
}