2012-10-18 42 views
0

我想在C#窗體上使用現有的位圖圖像,這是一個呈現的MandleBrot分形。我想要實現顏色循環。必須使用托盤圖像來完成。這是我的代碼,我堅持了幾天,現在不能讓它工作。代碼必須在定時器方法內。調色板位圖 - 分形顏色循環

private void timer1_Tick(object sender, EventArgs e) 
    { 
        Bitmap bitmap2 = new Bitmap(640, 480,PixelFormat.Format8bppIndexed); 

     ColorPalette palette = bitmap2.Palette; 

     for (int i = 0; i < 256; i += 3) 
     { 
      Color b = new Color(); 
      b = Color.FromArgb(i); 
      bitmap2.Palette.Entries.SetValue(b, i); 
      //b = Color.FromArgb(palette[i], palette[i + 1], palette[i + 2]); 
      // bitmap.Palette.Entries.SetValue(b, i); 
      //bitmap.Palette = palette; 
     } 

     mandelbrot(); 
    } 

原始圖像稱爲位圖,調色板需要爲位圖2。 感謝

+0

你已經問過這個問題(http://stackoverflow.com/questions/12894031/c-sharp-colour-cycling-mandlebrot-fractal ),答案仍然是「使用HSV」。 – Carra

+0

這種方式太慢了,一個要求是使用調色板。你能告訴我一個可行的例子嗎? –

回答

0
ColorPalette palette = originalBitmap.Palette; 
Color first = palette.Entries[0]; 
for (int i = 0; i < (palette.Entries.Length - 1); i++) 
{ 
    palette.Entries[i] = palette.Entries[i + 1]; 
} 
palette.Entries[(palette.Entries.Length - 1)] = first; 
originalBitmap.Palette = palette; 
1

與我結合another answer

var bitmap = new Bitmap(width, height, width, PixelFormat.Format8bppIndexed); 

ColorPalette palette = bitmap.Palette; 
palette.Entries[0] = Color.Black; 
for (int i = 1; i < 256; i++) 
{ 
    // set to whatever colour here... 
    palette.Entries[i] = FromHsv(360.0*i/256, 1, 1); 
} 
bitmap.Palette = palette; 


public Color FromHsv(double hue, double saturation, double value) 
{ 
    int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
    double f = hue/60 - Math.Floor(hue/60); 
    value = value * 255; 
    int v = Convert.ToInt32(value); 
    int p = Convert.ToInt32(value * (1 - saturation)); 
    int q = Convert.ToInt32(value * (1 - f * saturation)); 
    int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); 

    if (hi == 0) 
     return Color.FromArgb(255, v, t, p); 
    else if (hi == 1) 
     return Color.FromArgb(255, q, v, p); 
    else if (hi == 2) 
     return Color.FromArgb(255, p, v, t); 
    else if (hi == 3) 
     return Color.FromArgb(255, p, q, v); 
    else if (hi == 4) 
     return Color.FromArgb(255, t, p, v); 
    else 
     return Color.FromArgb(255, v, p, q); 
} 
+0

這將如何結合原始位圖 –