谁能告诉我下面图片处理的疑问?谢谢

youdiving 2012-08-25 01:09:22

/// <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;//为什么是乘8加31然后除以32乘4
//最终生成的位图数据大小
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;
}

...全文
85 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
youdiving 2012-09-26
  • 打赏
  • 举报
回复
我懂了加31再除以32是为了让图片宽度*8之后除以32之后的余数再能够凑够32这样除以32之后有n个32就相当于有n个4字节,原来的字节数是不够n个4字节的所以增加的字节数要比原来的多n*4-width个

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧