110,534
社区成员
发帖
与我相关
我的任务
分享
// 初始化6000*10000个0-99的数字
int width = 6000, height = 10000;
var max = 100;
var rnd = new Random();
var data = Enumerable.Range(0, width * height).Select(_ => rnd.Next(max)).ToArray();
// 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;
// 把数据映射到256灰度,unsafe填充到位图
var step = 255f / (max - 1);
var bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, fmt);
unsafe
{
var p = (byte*)bmpData.Scan0;
for (var i = 0; i < data.Length; i++)
{
*p = (byte)(step * data[i]);
p++;
}
}
bmp.UnlockBits(bmpData);
bmp.Save(@"e:\x.png");
int width = 6000, height = 10000;
// 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 = 255f;
var count = height; // 任务计数器
var bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, fmt);
using (var sr = new StreamReader(@"e:\data.txt"))
{
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(@"e:\x.png");
// 处理一行数据,把数据映射到256灰度,unsafe填充到位图
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++;
}
}