读取一个灰度数据.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) 可以画出灰度图吗? 求回答,非常感谢!!