C#由数据绘制灰度图失真使用索引方式绘制的灰度图和原来的图像相比有些失真

读取一个灰度数据.csv文件(384*288个点)使用索引方式绘制的灰度图和原来的图像相比有些失真,比如对比度上,该如何解决?修改步长step的值倒是能够整体改变,但是对比度却没有变化


private unsafe void SetData(IntPtr ptr, float step, string line)
        {
            var p = (byte*)ptr;
            var data = line.Split(',');
            for (var i = 0; i < data.Length; i++)
            {
                *p = (byte)(step * float.Parse(data[i]));
                p++;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int width =384, height = 288;
            // 8bit索引方式位图,设置灰度调色板
            var fmt = PixelFormat.Format8bppIndexed;
            var bmp = new Bitmap(width, height, fmt);
            var palette = bmp.Palette;
            for (var i = 0; i <256; i++)
            {
                palette.Entries[i] = Color.FromArgb(i, i, i);
            }
            bmp.Palette = palette;

            var step =2f;
            var count = height; // 任务计数器
            var bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, fmt);
            using (var sr = new StreamReader(@"C:\Users\d\Desktop\444.csv"))
            {
                var ptr = bmpData.Scan0;
                while (!sr.EndOfStream)
                {
                    // 每次读一行数据,在其它线程执行SetData,之后计数器减一
                    var line = sr.ReadLine();
                    var p = ptr;
                    Task.Factory.StartNew(() =>
                    {
                        SetData(p, step, line); Interlocked.Decrement(ref count);
                    });
                    ptr += bmpData.Stride;
                }
            }
            // 等待所有任务完成(计数器清零)
            while (count > 0) { Thread.Sleep(20); }

            bmp.UnlockBits(bmpData);
            bmp.Save(@"f:\cs.bmp");
            pictureBox1.Image = bmp;

palette.Entries[i] = Color.FromArgb(i, i, i);
这样欠妥当,范围大了
从原图上看 17.6 对应 (0,0,0),44.9 对应(255,255,255)
调整一下就可以了

那请问代码上具体是如何修改?将i等比例缩小,比如乘以一个系数还是如何呢?另外这个17.6和44.9只是当前这张图上的论坛顶帖机最高和最低温度,如果换一张图可能又会发生改变,那么映射的话如何自适应呢?

自适应是先求出原始数据的最大值和最小值,分别对应255和0
标准的做法是:原始数据去重后标量化*255

这个是缩放颜色,在你前面的帖子里已经告诉你。StackOverflow的帖子也发给你了。

至于你说的如果对方是根据最高最低去分配颜色,那么我们也没办法,理论上他应该告诉你缩放规则和参数

你好!我最近也遇到了同样的问题,请问您完全解决了吗? 现在有X轴数组(1*491),Y轴数组(1*10),代表数值大小的二维数组(10*491)  可以画出灰度图吗?  求回答,非常感谢!!

 

你可能感兴趣的:(C#由数据绘制灰度图失真使用索引方式绘制的灰度图和原来的图像相比有些失真)