zoukankan      html  css  js  c++  java
  • C# Image 、 byte[] 、Bitmap之间的转化

    一、Byte[] 转 System.Drawing.Bitmap

    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;

    }


    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;

    }

      

      

  • 相关阅读:
    【新梦想Java开发公开课】
    接口自动化框架httprunner(三)--断言
    接口自动化框架httprunner(二)--变量空间(context)作用域
    接口自动化框架httprunner(一)--安装及简单使用
    python+locust性能测试(四)之分布式运行
    安装Resharper 10.0.X 出现 The CrossAppDomainPointer is NULL 错误解决方案之一
    给DNN装SkinTuner扩展时出现Could not load file or assembly 'System.Data.SQLite
    STA和MTA线程模式的区别
    jQuery插件,迅速的实现拖拽功能
    query插件(三):Colorbox–内容播放插件
  • 原文地址:https://www.cnblogs.com/alsofly/p/3373833.html
Copyright © 2011-2022 走看看