memorystream写下内存提示内存不足
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)
{
//å?Œæ??è??è??æ??æ„?ï,Œæ??çš„ä,?å›,æ•?æ??çš„å?,åº?å??ç??å??åŒ?dest
Widthï,Œå??åˆ?ä,šäº?ç?Ÿé??ä,?
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();
//å?†å†…å??ä??çš„ä,?å›,å†?å…?Bitmapå??è??
resultBitmap = new Bitmap(curImageStream);