日期:2014-05-17  浏览次数:21263 次

memorystream写入内存提示内存不足
private Bitmap CreateBitmap(byte[] originalImageData, int originalWidth, int originalHeight)
  {
  //指定8位格式,即256色.old
  //指定32位格式
  Bitmap resultBitmap = new Bitmap(originalWidth, originalHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  try
  {
  //将该位图存入内存中
  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 curPadNum = ((originalWidth * 24 + 31) / 32 * 4) - originalWidth;

  //最终生成的位图数据大小
  //int bitmapDataSize = ((originalWidth * 8 + 31) / 32 * 4) * originalHeight;
  int bitmapDataSize = ((originalWidth * 24 + 31) / 32 * 4) * originalHeight;
  //bitmapDataSize = originalWidth * originalHeight;
  //数据部分相对文件开始偏移,具体可以参考位图文件格式
  int dataOffset = ReadData(curImageStream, 10, 4);


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

  //RPG24,不需要调色板
  //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);
  //}
  curImageStream.Position = paletteStart;

  //最终生成的位图数据,以及大小,高度没有变,宽度需要调整
  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 * 3; dataIndex += 3)
  {
  //同时还要注意,新的位图数据的宽度已经变化destWidth,否则会产生错位
  destImageData[destRowIndex * destWidth + dataIndex] = originalImageData[originalRowIndex * originalWidth * 3 + dataIndex];
  destImageData[destRowIndex * destWidth + dataIndex + 1] = originalImageData[originalRowIndex * originalWidth * 3 + dataIndex + 1];
  destImageData[destRowIndex * destWidth + dataIndex + 2] = originalImageData[originalRowIndex * originalWidth * 3 + dataIndex + 2];
  }
  }


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

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

  curImageStream.Flush();