使24位彩色位图保存在正常亮度级别

时间:2012-02-18 16:18:58

标签: c# bitmap

这是我的位图创建代码

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

当我在bufferArray中拥有所有FF十六进制时,仍然是白色像素不是白色。

当我在bufferArray中有随机值时,其他颜色看起来也会被冲走。

如何保存在正常亮度级别?

1 个答案:

答案 0 :(得分: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