• C#中使用byte[]数据,生成Bitmap


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


    转自:http://tech.sina.com.cn/s/2008-06-24/1206706116.shtml

  • 相关阅读:
    D365 FO操作FTP
    D365 FO凭证信息客制化
    input type = number 去除上下箭头,禁用滚轮事件(默认的自带滚轮加减数字)
    touch事件中的touches、targetTouches和changedTouches详解
    css媒体查询
    JavaScript:闭包
    JavaScript:基本包装类型
    十大模板引擎
    关于模板引擎一
    eval详解
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6881262.html
Copyright © 2020-2023  润新知