当前位置 : 主页 > 编程语言 > c语言 >

C#中使用byte[]数据,生成Bitmap(256色 灰度 BMP位图)源代码

来源:互联网 收集:自由互联 发布时间:2021-06-25
///summary///使用byte[]数据,生成256色灰度 BMP位图////summary///paramname="originalImageData"/param///paramname="originalWidth"/param///paramname="originalHeight"/param///returns/returnspublicstaticBitmapCreateBitmap(byte[]origi

/// <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);        }

上一篇:C# 正则表达式
下一篇:C# SqlDataAdapter
网友评论