问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c# 读取二进制文件画灰度图

发布网友 发布时间:2024-08-07 07:25

我来回答

2个回答

热心网友 时间:2024-08-17 06:10

搜到了下面的程序段,希望能行
/// <summary>
/// 使用byte[]数据,生成256色灰度 BMP 位图
/// </summary>
/// <param name="originalImageData"></param>
/// <param name="originalWidth"></param>
/// <param name="originalHeight"></param>
/// <returns></returns>
public static Bitmap CreateBitmap(byte[] originalImageData, int originalWidth, int originalHeight)
{
//指定8位格式,即256色
Bitmap resultBitmap = new Bitmap(originalWidth, originalHeight, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

//将该位图存入内存中
MemoryStream curImageStream = new MemoryStream();
resultBitmap.Save(curImageStream, System.Drawing.Imaging.ImageFormat.Bmp);
curImageStream.Flush();

//由于位图数据需要DWORD对齐(4byte倍数),计算需要补位的个数
int curPadNum = ((originalWidth * 8 + 31) / 32 * 4) - originalWidth;

//最终生成的位图数据大小
int bitmapDataSize = ((originalWidth * 8 + 31) / 32 * 4) * originalHeight;

//数据部分相对文件开始偏移,具体可以参考位图文件格式
int dataOffset = ReadData(curImageStream, 10, 4);

//改变调色板,因为默认的调色板是32位彩色的,需要修改为256色的调色板
int paletteStart = 54;
int paletteEnd = dataOffset;
int color = 0;

for (int i = paletteStart; i < paletteEnd; i += 4)
{
byte[] tempColor = new byte[4];
tempColor[0] = (byte)color;
tempColor[1] = (byte)color;
tempColor[2] = (byte)color;
tempColor[3] = (byte)0;
color++;

curImageStream.Position = i;
curImageStream.Write(tempColor, 0, 4);
}

//最终生成的位图数据,以及大小,高度没有变,宽度需要调整
byte[] destImageData = new byte[bitmapDataSize];
int destWidth = originalWidth + curPadNum;

//生成最终的位图数据,注意的是,位图数据 从左到右,从下到上,所以需要颠倒
for (int originalRowIndex = originalHeight - 1; originalRowIndex >= 0; originalRowIndex--)
{
int destRowIndex = originalHeight - originalRowIndex - 1;

for (int dataIndex = 0; dataIndex < originalWidth; dataIndex++)
{
//同时还要注意,新的位图数据的宽度已经变化destWidth,否则会产生错位
destImageData[destRowIndex * destWidth + dataIndex] = originalImageData[originalRowIndex * originalWidth + dataIndex];
}
}

//将流的Position移到数据段
curImageStream.Position = dataOffset;

//将新位图数据写入内存中
curImageStream.Write(destImageData, 0, bitmapDataSize);

curImageStream.Flush();

//将内存中的位图写入Bitmap对象
resultBitmap = new Bitmap(curImageStream);

return resultBitmap;
}

/// <summary>
/// 从内存流中指定位置,读取数据
/// </summary>
/// <param name="curStream"></param>
/// <param name="startPosition"></param>
/// <param name="length"></param>
/// <returns></returns>
public static int ReadData(MemoryStream curStream, int startPosition, int length)
{
int result = -1;

byte[] tempData = new byte[length];
curStream.Position = startPosition;
curStream.Read(tempData, 0, length);
result = BitConverter.ToInt32(tempData, 0);

return result;
}

/// <summary>
/// 向内存流中指定位置,写入数据
/// </summary>
/// <param name="curStream"></param>
/// <param name="startPosition"></param>
/// <param name="length"></param>
/// <param name="value"></param>
public static void WriteData(MemoryStream curStream, int startPosition, int length, int value)
{
curStream.Position = startPosition;
curStream.Write(BitConverter.GetBytes(value), 0, length);
}

热心网友 时间:2024-08-17 06:11

要看你的二进制文件是怎么编码的
比如每个数代表什么意思,哪个位置的数字表示图像的长和宽等

================
你试一下是否符合你的要求
/// <summary>
/// 载入灰度图
/// </summary>
/// <param name="pb">目标 PictureBox 对象</param>
/// <param name="data">字节数组</param>
/// <param name="width">图片宽度</param>
/// <param name="height">图片高度</param>
void LoadPicture(PictureBox pb,byte[] data,int width,int height)
{
Bitmap bmp = new Bitmap(width, height);
Graphics gp = Graphics.FromImage(bmp);
gp.Clear(Color.White);
int t = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++ ,t++)
{
if (t >= data.Length)
{
goto endfor;
}
byte c = data[t];
Color color = Color.FromArgb(c, c, c);
gp.FillRectangle(new SolidBrush(color), x, y, 1, 1);
}
}
endfor:
gp.Save();
pb.Image = bmp;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2023文科男生最吃香的专业 哪些专业好就业 在南京想找上海音乐学院的老师,怎么找? 荔枝核怎么服用-荔枝核煮水一般煮几颗合适 属虎适合什么名字2022年新生儿 有内涵热门名字精选 国内读研好,还是出国读研好 出国读研和国内读研哪个更好 在一个比例中,如果两个外项互为倒数。那么两个内向的什么是一?_百度知 ... 两个外项互为倒数,一个内向是8分之3,另一个内项是多少【怎样求出来... 在一个比例中,两个外向互为倒数,其中一个内项是8,另一个内项是_百度... 在比例中两个外项互为倒数,其中一个内向是2.75,另一个内项是多少_百度... 谁送我个可以进2000人的qq群!跪求! 如何将QQ音乐的歌曲设置为苹果手机铃声? 土方开挖工程量如何计算? 宝鸡星河半岛值得买吗? 爱国名言警句90条百度文库 宝鸡太白山凤凰云庐楼盘地址在哪里? 16周肚皮厚听不到胎心怎么回事 喝完白酒再喝啤酒会醉吗 白酒和啤酒缠着喝现在很难受怎么办 做b超都能检查什么? 07版本Excel筛选的使用2007excel筛选怎么用 怎样用智能电视看卫视直播? 看直播软件断流控制在多少kb 描写传统文化的句子有哪些 学专科电子信息工程出来有用吗 苏州玻色智能科技有限公司的设备都能解决手机什么难题啊? 苏州红枫智能窗业有限公司怎么样? 支付宝600以上能开通什么贷款 正规网贷平台排名前10名安全靠谱的良心贷款排名前十 脚踝突然疼痛没有征兆是怎么回事 防诈骗活动策划方案 exo鹿晗二次巡演穿的什么衣服 请问有人知道这两张是鹿晗什么时候那场演唱会的照片吗? 郑兆强人物简介 他曾是王家卫御用摄影师 拍下了香港25载岁月 缎带花注册商标属于哪一类? 缎带花做法 腾讯会议电脑版怎么旋转视频窗口? 怎样在电脑上下载腾讯视频客户端 by还是in? 二广高速1063公里处超速在哪违章咋处理? 二广高速532公里600米超速百分之十以内咋处罚 怎样办理常州联通卡停机保号? 常州联通卡要如何才能停机保号? 常州联通开通的套餐到2016.5.30日才可以办理停机,我现在不用这个号码了... 常州宽带办理停机报号后,固定电话还能使用吗 邯郸市有什么银行 邯郸有些什么银行 牛首镇乡镇概况 此手机壳图片 谁有原版