2012-02-18 18 views
0

這是我的位圖創建代碼使24位色位圖在正常亮度等級保存

public static Bitmap Plot24(ref byte[] bufferArray, int lengthOfBufferArray, String fileName) 
    { 
     int position = 0;  

     int rows = (int)Math.Ceiling((double)lengthOfBufferArray/(3*columns)); 

     Bitmap b = new Bitmap(columns , rows, PixelFormat.Format24bppRgb); 
     BitmapData bmd = b.LockBits(new Rectangle(0, 0, columns , rows), ImageLockMode.ReadWrite, b.PixelFormat); 

      unsafe 
      { 
       for (int j = 0; j < rows; j++) 
       {      
        byte* row = (byte*)bmd.Scan0 + ((j * bmd.Stride)); 

        for (int i = 0; i < columns*3; i+=3) 
        {             
         if (position < lengthOfBufferArray) 
         {                   

          try 
          { 
           row[i+2] = bufferArray[position]; 
           position++; 
           if (position < lengthOfBufferArray) 
           { 
            row[i+1] = bufferArray[position]; 
            position++; 
           } 
           else 
           {         
            break;          
           } 

           if (position < lengthOfBufferArray) 
           { 
            row[i] = bufferArray[position]; 
            position++; 
           } 
           else 
           {          
            break;        
           } 
          } 
          catch (Exception e) 
          { 
           Console.WriteLine(e.ToString()); 

          } 
         } 
        } 
       } 

       b.UnlockBits(bmd); 

       return b; 
      } 
    } 

這也是我如何保存返回的位圖

b.Save(outputFilename, ImageFormat.Bmp); 

當我在所有FF十六進制緩衝陣列仍然是白色像素不是白色的。

而當我在bufferArray中的隨機值其他顏色也看起來像他們被沖走。

我怎樣才能保存在正常的亮度水平?

+0

您的代碼使像素與字節混淆。每個像素都有3個字節,因此您不使用位置 2012-02-18 17:21:47

+0

iam不會爲紅色,綠色和藍色寫入相同的值。我不僅得到灰色,而且有一個例外,我得到各種各樣的顏色,所有這些都像是被沖走了。我想保持亮度水平 – klijo 2012-02-19 05:13:25

回答

0

我測試了你的示例代碼,它工作得很好。我在我的底部添加了一些摘錄,並對方法參數稍作了修改。

您能否在您的問題中提供一個如何使用Plot24方法的示例?也許問題出在那裏。

void Main() 
    { 
     int rows = 100; 
     int columns = 100; 

     var random = new Random(DateTime.Now.Ticks.GetHashCode()); 

     byte[] bytes = Enumerable 
      .Range(0, columns * rows) 

      // White 
      .SelectMany(i => new[] { (byte)0xFF, (byte)0xFF, (byte)0xFF, }) 

      // Random 
      /*.SelectMany(i => 
       { 
        byte[] buffer = new byte[3]; 
        random.NextBytes(buffer); 
        return buffer; 
       })*/ 

      .ToArray(); 

     using (var bm = Plot24(ref bytes, columns)) 
     { 
      bm.Save(@"c:\test.bmp", ImageFormat.Bmp); 
     } 
    } 

    public static Bitmap Plot24(ref byte[] bufferArray, int columns) 
    { 
     int position = 0;  
     int lengthOfBufferArray = bufferArray.Length; 

     int rows = (int)Math.Ceiling((double)lengthOfBufferArray/(3*columns)); 
     // ... the rest of your code is just fine 
+0

當我給了它一些其他數據,它給了明亮的顏色。所以代碼沒有錯 – klijo 2012-03-10 17:01:37