C# CURÀàʵÏÖ´úÂë

¡¡¡¡

¸´ÖÆ´úÂë ´úÂëÈçÏÂ:

¡¡¡¡using System;

¡¡¡¡using System.Collections.Generic;

¡¡¡¡using System.Collections;

¡¡¡¡using System.Text;

¡¡¡¡using System.Drawing;

¡¡¡¡using System.Drawing.Imaging;

¡¡¡¡using System.IO;

¡¡¡¡using System.Runtime.InteropServices;

¡¡¡¡namespace Zgke.MyImage.ImageFile

¡¡¡¡{

¡¡¡¡/// <summary>

¡¡¡¡/// CURÎļþ²Ù×÷Àà

¡¡¡¡/// [email protected]

¡¡¡¡/// qq:116149

¡¡¡¡/// </summary>

¡¡¡¡public class ImageCur

¡¡¡¡{

¡¡¡¡private class CurHead

¡¡¡¡{

¡¡¡¡private byte[] m_Retain = new byte[2];

¡¡¡¡private byte[] m_Type = new byte[] { 0x02, 0x00 };

¡¡¡¡private byte[] m_ImageCount = new byte[2];

¡¡¡¡private byte m_ImageWidth;

¡¡¡¡private byte m_ImageHeight;

¡¡¡¡private byte m_ColorCount;

¡¡¡¡private byte[] m_NotUser = new byte[5];

¡¡¡¡private byte[] m_ImageLength = new byte[4];

¡¡¡¡private byte[] m_ImageRVA = new byte[4];

¡¡¡¡/// <summary>

¡¡¡¡/// ͼÐθß

¡¡¡¡/// </summary>

¡¡¡¡public byte ImageHeight { get { return m_ImageHeight; } set { m_ImageHeight = value; } }

¡¡¡¡/// <summary>

¡¡¡¡/// ͼÏó¸öÊý

¡¡¡¡/// </summary>

¡¡¡¡public ushort ImageCount { get { return BitConverter.ToUInt16(m_ImageCount, 0); } set { m_ImageCount = BitConverter.GetBytes(value); } }

¡¡¡¡/// <summary>

¡¡¡¡/// ͼÐοí

¡¡¡¡/// </summary>

¡¡¡¡public byte ImageWidth { get { return m_ImageWidth; } set { m_ImageWidth = value; } }

¡¡¡¡/// <summary>

¡¡¡¡/// É«²ÊÊý £¨256ÒÔÏÂÉ«Óã©

¡¡¡¡/// </summary>

¡¡¡¡public byte ColorCount { get { return m_ColorCount; } set { m_ColorCount = value; } }

¡¡¡¡/// <summary>

¡¡¡¡/// ͼÏóÊý¾Ý¿éµÄ³¤¶È

¡¡¡¡/// </summary>

¡¡¡¡public uint ImageLength { get { return BitConverter.ToUInt32(m_ImageLength, 0); } set { m_ImageLength = BitConverter.GetBytes(value); } }

¡¡¡¡/// <summary>

¡¡¡¡/// ͼÏóÊý¾Ý¿éÏà¶ÔÓÚÎļþÍ·²¿µÄÆ«ÒÆÁ¿

¡¡¡¡/// </summary>

¡¡¡¡public uint ImageRVA { get { return BitConverter.ToUInt32(m_ImageRVA, 0); } set { m_ImageRVA = BitConverter.GetBytes(value); } }

¡¡¡¡public CurHead()

¡¡¡¡{

¡¡¡¡}

¡¡¡¡public CurHead(byte[] p_Data)

¡¡¡¡{

¡¡¡¡ImageCount = BitConverter.ToUInt16(p_Data, 4);

¡¡¡¡ImageHeight = p_Data[7];

¡¡¡¡ImageWidth = p_Data[6];

¡¡¡¡ColorCount = p_Data[8];

¡¡¡¡ImageLength = BitConverter.ToUInt32(p_Data, 14);

¡¡¡¡ImageRVA = BitConverter.ToUInt32(p_Data, 18);

¡¡¡¡}

¡¡¡¡public byte[] GetByte()

¡¡¡¡{

¡¡¡¡byte[] _ReturnBytes = new byte[22];

¡¡¡¡_ReturnBytes[0] = m_Retain[0];

¡¡¡¡_ReturnBytes[1] = m_Retain[1];

¡¡¡¡_ReturnBytes[2] = m_Retain[0];

¡¡¡¡_ReturnBytes[3] = m_Retain[1];

¡¡¡¡_ReturnBytes[4] = m_ImageCount[0];

¡¡¡¡_ReturnBytes[5] = m_ImageCount[1];

¡¡¡¡_ReturnBytes[6] = m_ImageWidth;

¡¡¡¡_ReturnBytes[7] = m_ImageHeight;

¡¡¡¡_ReturnBytes[8] = m_ColorCount;

¡¡¡¡_ReturnBytes[14] = m_ImageLength[0];

¡¡¡¡_ReturnBytes[15] = m_ImageLength[1];

¡¡¡¡_ReturnBytes[16] = m_ImageLength[2];

¡¡¡¡_ReturnBytes[17] = m_ImageLength[3];

¡¡¡¡_ReturnBytes[18] = m_ImageRVA[0];

¡¡¡¡_ReturnBytes[19] = m_ImageRVA[1];

¡¡¡¡_ReturnBytes[20] = m_ImageRVA[2];

¡¡¡¡_ReturnBytes[21] = m_ImageRVA[3];

¡¡¡¡return _ReturnBytes;

¡¡¡¡}

¡¡¡¡public byte[] GetImageByte()

¡¡¡¡{

¡¡¡¡byte[] _ReturnBytes = new byte[16];

¡¡¡¡_ReturnBytes[0] = m_ImageWidth;

¡¡¡¡_ReturnBytes[1] = m_ImageHeight;

¡¡¡¡_ReturnBytes[2] = m_ColorCount;

¡¡¡¡_ReturnBytes[8] = m_ImageLength[0];

¡¡¡¡_ReturnBytes[9] = m_ImageLength[1];

¡¡¡¡_ReturnBytes[10] = m_ImageLength[2];

¡¡¡¡_ReturnBytes[11] = m_ImageLength[3];

¡¡¡¡_ReturnBytes[12] = m_ImageRVA[0];

¡¡¡¡_ReturnBytes[13] = m_ImageRVA[1];

¡¡¡¡_ReturnBytes[14] = m_ImageRVA[2];

¡¡¡¡_ReturnBytes[15] = m_ImageRVA[3];

¡¡¡¡return _ReturnBytes;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡private CurHead m_CurHead;

¡¡¡¡private Bitmap m_CurImage;

¡¡¡¡private IList<Image> m_CurList =new List<Image>();

¡¡¡¡public ImageCur(string p_FileFullName)

¡¡¡¡{

¡¡¡¡byte[] _FileBytes = File.ReadAllBytes(p_FileFullName);

¡¡¡¡ImageCurBytes(_FileBytes);

¡¡¡¡}

¡¡¡¡public ImageCur(byte[] p_FileBytes)

¡¡¡¡{

¡¡¡¡ImageCurBytes(p_FileBytes);

¡¡¡¡}

¡¡¡¡private void ImageCurBytes(byte[] p_Bytes)

¡¡¡¡{

¡¡¡¡m_CurHead = new CurHead(p_Bytes);

¡¡¡¡for (int i = 0; i != m_CurHead.ImageCount; i++)

¡¡¡¡{

¡¡¡¡m_CurHead.ImageWidth = (byte)BitConverter.ToInt16(p_Bytes, (int)m_CurHead.ImageRVA + 4);

¡¡¡¡m_CurHead.ImageHeight = (byte)(BitConverter.ToInt16(p_Bytes, (int)m_CurHead.ImageRVA + 8) / 2);

¡¡¡¡short _Piex = BitConverter.ToInt16(p_Bytes, (int)m_CurHead.ImageRVA + 14);

¡¡¡¡LoadImgae(_Piex, p_Bytes, (int)m_CurHead.ImageRVA + 40);

¡¡¡¡m_CurList.Add((Image)m_CurImage);

¡¡¡¡byte[] _Value = new byte[4];

¡¡¡¡_Value[3] = p_Bytes[((i + 1) * 16) + 18 + 3];

¡¡¡¡_Value[2] = p_Bytes[((i + 1) * 16) + 18 + 2];

¡¡¡¡_Value[1] = p_Bytes[((i + 1) * 16) + 18 + 1];

¡¡¡¡_Value[0] = p_Bytes[((i + 1) * 16) + 18];

¡¡¡¡m_CurHead.ImageRVA = BitConverter.ToUInt32(_Value, 0);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡public ImageCur()

¡¡¡¡{

¡¡¡¡}

¡¡¡¡#region Read

¡¡¡¡private void Load32(byte[] p_FileBytes, byte[] p_NewData, int p_ReadIndex, int p_Width, int p_Height, int p_MashIndex, BitmapData p_NewBitmapData)

¡¡¡¡{

¡¡¡¡int _WriteIndex = 0;

¡¡¡¡for (int i = p_NewBitmapData.Height - 1; i != -1; i--)

¡¡¡¡{

¡¡¡¡_WriteIndex = i * p_NewBitmapData.Stride;

¡¡¡¡for (int z = 0; z != p_NewBitmapData.Width; z++)

¡¡¡¡{

¡¡¡¡p_NewData[_WriteIndex + (z * 4)] = p_FileBytes[p_ReadIndex];

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 1] = p_FileBytes[p_ReadIndex + 1];

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 2] = p_FileBytes[p_ReadIndex + 2];

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 3] = p_FileBytes[p_ReadIndex + 3];

¡¡¡¡p_ReadIndex += 4;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡private void Load24(byte[] p_FileBytes, byte[] p_NewData, int p_ReadIndex, int p_Width, int p_Height, int p_MashIndex, BitmapData p_NewBitmapData)

¡¡¡¡{

¡¡¡¡int _WriteIndex = 0;

¡¡¡¡int _MashStride = p_Width / 8;

¡¡¡¡if (p_Width % 8 != 0) _MashStride++;

¡¡¡¡if (_MashStride % 4 != 0) _MashStride += _MashStride % 4;

¡¡¡¡byte[] _MashBytes = new byte[_MashStride * p_Height];

¡¡¡¡Array.Copy(p_FileBytes, p_MashIndex, _MashBytes, 0, _MashBytes.Length);

¡¡¡¡for (int i = 0; i != _MashBytes.Length; i++)

¡¡¡¡{

¡¡¡¡_MashBytes[i] = ConvertByte.OperateData.ReverseByte(_MashBytes[i]);

¡¡¡¡}

¡¡¡¡BitArray _MashArray = new BitArray(_MashBytes);

¡¡¡¡for (int i = p_NewBitmapData.Height - 1; i != -1; i--)

¡¡¡¡{

¡¡¡¡p_MashIndex = (p_Height - 1 - i) * (_MashStride * 8);

¡¡¡¡_WriteIndex = i * p_NewBitmapData.Stride;

¡¡¡¡for (int z = 0; z != p_NewBitmapData.Width; z++)

¡¡¡¡{

¡¡¡¡p_NewData[_WriteIndex + (z * 4)] = p_FileBytes[p_ReadIndex];

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 1] = p_FileBytes[p_ReadIndex + 1];

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 2] = p_FileBytes[p_ReadIndex + 2];

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 3] = 0xFF;

¡¡¡¡if (_MashArray[p_MashIndex])p_NewData[_WriteIndex + (z * 4) + 3] = 0x00; //

¡¡¡¡p_ReadIndex += 3;

¡¡¡¡p_MashIndex++;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡private void Load8(byte[] p_FileBytes, byte[] p_NewData, int p_ReadIndex, int p_Width, int p_Height, int p_MashIndex, BitmapData p_NewBitmapData)

¡¡¡¡{

¡¡¡¡int _WriteIndex = 0;

¡¡¡¡Hashtable _ColorHashTable = new Hashtable();

¡¡¡¡for (int i = 0; i != 256; i++)

¡¡¡¡{

¡¡¡¡_ColorHashTable.Add(i.ToString(), Color.FromArgb(p_FileBytes[p_ReadIndex + 3], p_FileBytes[p_ReadIndex + 2], p_FileBytes[p_ReadIndex + 1], p_FileBytes[p_ReadIndex]));

¡¡¡¡p_ReadIndex += 4;

¡¡¡¡}

¡¡¡¡p_MashIndex = p_Width * p_Height + p_ReadIndex;

¡¡¡¡int _MashStride = p_Width / 8;

¡¡¡¡if (p_Width % 8 != 0) _MashStride++;

¡¡¡¡if (_MashStride % 4 !=0) _MashStride += _MashStride % 4;

¡¡¡¡byte[] _MashBytes = new byte[_MashStride * p_Height];

¡¡¡¡Array.Copy(p_FileBytes, p_MashIndex, _MashBytes, 0, _MashBytes.Length);

¡¡¡¡for (int i = 0; i != _MashBytes.Length; i++)

¡¡¡¡{

¡¡¡¡_MashBytes[i] = ConvertByte.OperateData.ReverseByte(_MashBytes[i]);

¡¡¡¡}

¡¡¡¡BitArray _MashArray = new BitArray(_MashBytes);

¡¡¡¡for (int i = p_NewBitmapData.Height - 1; i != -1; i--)

¡¡¡¡{

¡¡¡¡p_MashIndex = (p_Height - 1 - i) * (_MashStride * 8);

¡¡¡¡_WriteIndex = i * p_NewBitmapData.Stride;

¡¡¡¡for (int z = 0; z != p_NewBitmapData.Width; z++)

¡¡¡¡{

¡¡¡¡byte _Index = p_FileBytes[p_ReadIndex];

¡¡¡¡Color _SetColor = (Color)_ColorHashTable[_Index.ToString()];

¡¡¡¡p_NewData[_WriteIndex + (z * 4)] = (byte)_SetColor.B;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 1] = (byte)_SetColor.G;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 2] = (byte)_SetColor.R;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 3] = 0xFF;

¡¡¡¡if (_MashArray[p_MashIndex])p_NewData[_WriteIndex + (z * 4) + 3] = 0x00; //

¡¡¡¡p_ReadIndex++;

¡¡¡¡p_MashIndex++;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡private void Load4(byte[] p_FileBytes, byte[] p_NewData, int p_ReadIndex, int p_Width, int p_Height, int p_MashIndex, BitmapData p_NewBitmapData)

¡¡¡¡{

¡¡¡¡int _WriteIndex = 0;

¡¡¡¡Hashtable _ColorHashTable = new Hashtable();

¡¡¡¡for (int i = 0; i != 16; i++)

¡¡¡¡{

¡¡¡¡_ColorHashTable.Add(i.ToString(), Color.FromArgb(p_FileBytes[p_ReadIndex + 3], p_FileBytes[p_ReadIndex + 2], p_FileBytes[p_ReadIndex + 1], p_FileBytes[p_ReadIndex]));

¡¡¡¡p_ReadIndex += 4;

¡¡¡¡}

¡¡¡¡p_MashIndex = (p_Width * p_Height / 2) + p_ReadIndex;

¡¡¡¡int _MashStride = p_Width / 8;

¡¡¡¡if (p_Width % 8 != 0) _MashStride++;

¡¡¡¡if (_MashStride % 4 != 0) _MashStride += _MashStride % 4;

¡¡¡¡byte[] _MashBytes = new byte[_MashStride * p_Height];

¡¡¡¡Array.Copy(p_FileBytes, p_MashIndex, _MashBytes, 0, _MashBytes.Length);

¡¡¡¡for (int i = 0; i != _MashBytes.Length; i++)

¡¡¡¡{

¡¡¡¡_MashBytes[i] = ConvertByte.OperateData.ReverseByte(_MashBytes[i]);

¡¡¡¡}

¡¡¡¡BitArray _MashArray = new BitArray(_MashBytes);

¡¡¡¡bool _Lith = true;

¡¡¡¡for (int i = p_NewBitmapData.Height - 1; i != -1; i--)

¡¡¡¡{

¡¡¡¡p_MashIndex = (p_Height-1 - i) * (_MashStride * 8);

¡¡¡¡_WriteIndex = i * p_NewBitmapData.Stride;

¡¡¡¡for (int z = 0; z != p_NewBitmapData.Width; z++)

¡¡¡¡{

¡¡¡¡byte _Index = p_FileBytes[p_ReadIndex];

¡¡¡¡if (_Lith)

¡¡¡¡{

¡¡¡¡_Index = (byte)((_Index & 0xF0) >> 4);

¡¡¡¡_Lith = false;

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡_Index = (byte)(_Index & 0x0F); //ºóÃæµÄF

¡¡¡¡_Lith = true;

¡¡¡¡p_ReadIndex++;

¡¡¡¡}

¡¡¡¡Color _SetColor = (Color)_ColorHashTable[_Index.ToString()];

¡¡¡¡p_NewData[_WriteIndex + (z * 4)] = (byte)_SetColor.B;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 1] = (byte)_SetColor.G;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 2] = (byte)_SetColor.R;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 3] = 0xFF;

¡¡¡¡if (_MashArray[p_MashIndex])p_NewData[_WriteIndex + (z * 4) + 3] = 0x00; //

¡¡¡¡p_MashIndex++;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡private void Load1(byte[] p_FileBytes, byte[] p_NewData, int p_ReadIndex, int p_Width, int p_Height, int p_MashIndex, BitmapData p_NewBitmapData)

¡¡¡¡{

¡¡¡¡int _WriteIndex = 0;

¡¡¡¡Hashtable _ColorHashTable = new Hashtable();

¡¡¡¡for (int i = 0; i != 2; i++)

¡¡¡¡{

¡¡¡¡_ColorHashTable.Add(i.ToString(), Color.FromArgb(p_FileBytes[p_ReadIndex + 3], p_FileBytes[p_ReadIndex + 2], p_FileBytes[p_ReadIndex + 1], p_FileBytes[p_ReadIndex]));

¡¡¡¡p_ReadIndex += 4;

¡¡¡¡}

¡¡¡¡p_MashIndex = (p_Width * p_Height /8) + p_ReadIndex;

¡¡¡¡int _MashStride = p_Width / 8;

¡¡¡¡if (p_Width % 8 != 0) _MashStride++;

¡¡¡¡if (_MashStride % 4 != 0) _MashStride += _MashStride % 4;

¡¡¡¡byte[] _MashBytes = new byte[_MashStride * p_Height];

¡¡¡¡Array.Copy(p_FileBytes, p_MashIndex, _MashBytes, 0, _MashBytes.Length);

¡¡¡¡for (int i = 0; i != _MashBytes.Length; i++)

¡¡¡¡{

¡¡¡¡_MashBytes[i] = ConvertByte.OperateData.ReverseByte(_MashBytes[i]);

¡¡¡¡}

¡¡¡¡BitArray _MashArray = new BitArray(_MashBytes);

¡¡¡¡int _Lith = 7;

¡¡¡¡for (int i = p_NewBitmapData.Height - 1; i != -1; i--)

¡¡¡¡{

¡¡¡¡p_MashIndex = (p_Height - 1 - i) * (_MashStride * 8);

¡¡¡¡_WriteIndex = i * p_NewBitmapData.Stride;

¡¡¡¡for (int z = 0; z != p_NewBitmapData.Width; z++)

¡¡¡¡{

¡¡¡¡byte _Index = p_FileBytes[p_ReadIndex];

¡¡¡¡BitArray _ColorIndex = new BitArray(new byte[] { _Index });

¡¡¡¡if (_ColorIndex[_Lith])

¡¡¡¡{

¡¡¡¡_Index = 1;

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡_Index = 0;

¡¡¡¡}

¡¡¡¡if (_Lith == 0)

¡¡¡¡{

¡¡¡¡p_ReadIndex++;

¡¡¡¡_Lith = 7;

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡_Lith--;

¡¡¡¡}

¡¡¡¡Color _SetColor = (Color)_ColorHashTable[_Index.ToString()];

¡¡¡¡p_NewData[_WriteIndex + (z * 4)] = (byte)_SetColor.B;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 1] = (byte)_SetColor.G;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 2] = (byte)_SetColor.R;

¡¡¡¡p_NewData[_WriteIndex + (z * 4) + 3] = 0xFF;

¡¡¡¡if (_MashArray[p_MashIndex])p_NewData[_WriteIndex + (z * 4) + 3] = 0x00; //

¡¡¡¡p_MashIndex++;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡#endregion

¡¡¡¡private void LoadImgae(short m_Piex, byte[] p_FileBytes,int _StarIndex)

¡¡¡¡{

¡¡¡¡int _Width = m_CurHead.ImageWidth;

¡¡¡¡int _Height = m_CurHead.ImageHeight;

¡¡¡¡m_CurImage = new Bitmap(_Width, _Height, PixelFormat.Format32bppArgb);

¡¡¡¡BitmapData _NewBitmapData = m_CurImage.LockBits(new Rectangle(0, 0, _Width, _Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

¡¡¡¡byte[] _NewData = new byte[_NewBitmapData.Stride * _NewBitmapData.Height];

¡¡¡¡int _ReadIndex = _StarIndex;

¡¡¡¡int _MashIndex = 0;

¡¡¡¡switch (m_Piex)

¡¡¡¡{

¡¡¡¡case 1:

¡¡¡¡_MashIndex = (_Width * _Height / 8) + _ReadIndex;

¡¡¡¡Load1(p_FileBytes, _NewData, _ReadIndex, _Width, _Height, _MashIndex, _NewBitmapData);

¡¡¡¡break;

¡¡¡¡case 4:

¡¡¡¡_MashIndex = (_Width * _Height / 2) + _ReadIndex;

¡¡¡¡Load4(p_FileBytes, _NewData, _ReadIndex, _Width, _Height, _MashIndex, _NewBitmapData);

¡¡¡¡break;

¡¡¡¡case 8:

¡¡¡¡_MashIndex = _Width * _Height + _ReadIndex;

¡¡¡¡Load8(p_FileBytes, _NewData, _ReadIndex, _Width, _Height, _MashIndex, _NewBitmapData);

¡¡¡¡break;

¡¡¡¡case 24:

¡¡¡¡_MashIndex = _Width * _Height * 3 + _ReadIndex;

¡¡¡¡Load24(p_FileBytes, _NewData, _ReadIndex, _Width, _Height, _MashIndex, _NewBitmapData);

¡¡¡¡break;

¡¡¡¡case 32:

¡¡¡¡_MashIndex = _Width * _Height * 4 + _ReadIndex;

¡¡¡¡Load32(p_FileBytes, _NewData, _ReadIndex, _Width, _Height, _MashIndex, _NewBitmapData);

¡¡¡¡break;

¡¡¡¡default:

¡¡¡¡throw new Exception("²»Ö§³ÖµÄ¸ñʽ");

¡¡¡¡}

¡¡¡¡Marshal.Copy(_NewData, 0, _NewBitmapData.Scan0, _NewData.Length);

¡¡¡¡m_CurImage.UnlockBits(_NewBitmapData);

¡¡¡¡}

¡¡¡¡public void SaveImage(string p_FileName)

¡¡¡¡{

¡¡¡¡if (m_CurList.Count == 0) return;

¡¡¡¡FileStream _File = new FileStream(p_FileName, FileMode.Create, FileAccess.Write);

¡¡¡¡m_CurHead = new CurHead();

¡¡¡¡_File.Write(new byte[]{0x00,0x00,0x02,0x00},0,4);

¡¡¡¡_File.Write(BitConverter.GetBytes((ushort)m_CurList.Count),0,2);

¡¡¡¡List<byte[]> _ImageByteList = new List<byte[]>();

¡¡¡¡m_CurHead.ImageRVA = (uint)m_CurList.Count * 16+6;

¡¡¡¡for (int i = 0; i != m_CurList.Count; i++)

¡¡¡¡{

¡¡¡¡if (m_CurList[i].Width > 255 || m_CurList[i].Height > 255)

¡¡¡¡{

¡¡¡¡_File.Close();

¡¡¡¡throw new Exception("ͼÐÎÎļþ¹ý´ó£¡");

¡¡¡¡}

¡¡¡¡byte[] _ImageSize = GetImageBytes(i);

¡¡¡¡m_CurHead.ImageHeight = (byte)CurImage[i].Height;

¡¡¡¡m_CurHead.ImageWidth = (byte)CurImage[i].Width;

¡¡¡¡m_CurHead.ImageRVA += m_CurHead.ImageLength;

¡¡¡¡m_CurHead.ImageLength = (uint)_ImageSize.Length;

¡¡¡¡_ImageByteList.Add(_ImageSize);

¡¡¡¡_File.Write(m_CurHead.GetImageByte(), 0, 16);

¡¡¡¡}

¡¡¡¡for (int i = 0; i != _ImageByteList.Count; i++)

¡¡¡¡{

¡¡¡¡byte[] _Height = BitConverter.GetBytes((uint)(m_CurList[i].Height * 2));

¡¡¡¡_ImageByteList[i][8] = _Height[0];

¡¡¡¡_ImageByteList[i][9] = _Height[1];

¡¡¡¡_ImageByteList[i][10] = _Height[2];

¡¡¡¡_ImageByteList[i][11] = _Height[3];

¡¡¡¡_File.Write(_ImageByteList[i], 0, _ImageByteList[i].Length);

¡¡¡¡}

¡¡¡¡_File.Close();

¡¡¡¡}

¡¡¡¡public MemoryStream SaveImage()

¡¡¡¡{

¡¡¡¡if (m_CurList.Count == 0) throw new Exception("ÎÞͼÐοɱ£´æ");

¡¡¡¡MemoryStream _Memory = new MemoryStream();

¡¡¡¡m_CurHead = new CurHead();

¡¡¡¡_Memory.Write(new byte[] { 0x00, 0x00, 0x02, 0x00 }, 0, 4);

¡¡¡¡_Memory.Write(BitConverter.GetBytes((ushort)m_CurList.Count), 0, 2);

¡¡¡¡List<byte[]> _ImageByteList = new List<byte[]>();

¡¡¡¡m_CurHead.ImageRVA = (uint)m_CurList.Count * 16 + 6;

¡¡¡¡for (int i = 0; i != m_CurList.Count; i++)

¡¡¡¡{

¡¡¡¡if (m_CurList[i].Width > 255 || m_CurList[i].Height > 255)

¡¡¡¡{

¡¡¡¡_Memory.Close();

¡¡¡¡throw new Exception("ͼÐÎÎļþ¹ý´ó£¡");

¡¡¡¡}

¡¡¡¡byte[] _ImageSize = GetImageBytes(i);

¡¡¡¡m_CurHead.ImageHeight = (byte)CurImage[i].Height;

¡¡¡¡m_CurHead.ImageWidth = (byte)CurImage[i].Width;

¡¡¡¡m_CurHead.ImageRVA += m_CurHead.ImageLength;

¡¡¡¡m_CurHead.ImageLength = (uint)_ImageSize.Length;

¡¡¡¡_ImageByteList.Add(_ImageSize);

¡¡¡¡_Memory.Write(m_CurHead.GetImageByte(), 0, 16);

¡¡¡¡}

¡¡¡¡for (int i = 0; i != _ImageByteList.Count; i++)

¡¡¡¡{

¡¡¡¡byte[] _Height = BitConverter.GetBytes((uint)(m_CurList[i].Height * 2));

¡¡¡¡_ImageByteList[i][8] = _Height[0];

¡¡¡¡_ImageByteList[i][9] = _Height[1];

¡¡¡¡_ImageByteList[i][10] = _Height[2];

¡¡¡¡_ImageByteList[i][11] = _Height[3];

¡¡¡¡_Memory.Write(_ImageByteList[i], 0, _ImageByteList[i].Length);

¡¡¡¡}

¡¡¡¡return _Memory;

¡¡¡¡}

¡¡¡¡/// <summary>

¡¡¡¡/// CURͼÐÎ

¡¡¡¡/// </summary>

¡¡¡¡public IList<Image> CurImage { get { return m_CurList; } set { m_CurList = value; } }

¡¡¡¡public byte[] GetImageBytes(int p_ImageIndex)

¡¡¡¡{

¡¡¡¡MemoryStream _Memory = new MemoryStream();

¡¡¡¡if (m_CurList[p_ImageIndex].PixelFormat != PixelFormat.Format32bppArgb)

¡¡¡¡{

¡¡¡¡Bitmap _Image = new Bitmap(m_CurList[p_ImageIndex].Width, m_CurList[p_ImageIndex].Height, PixelFormat.Format32bppArgb);

¡¡¡¡Graphics _Graphcis = Graphics.FromImage(_Image);

¡¡¡¡_Graphcis.Dispose();

¡¡¡¡_Image.Save(_Memory, ImageFormat.Bmp);

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡m_CurList[p_ImageIndex].Save(_Memory, ImageFormat.Bmp);

¡¡¡¡}

¡¡¡¡byte[] _Test = _Memory.ToArray();

¡¡¡¡byte[] _ImageBytes = new byte[_Memory.Length - 0x0E];

¡¡¡¡_Memory.Position = 0x0E;

¡¡¡¡_Memory.Read(_ImageBytes, 0, _ImageBytes.Length);

¡¡¡¡return _ImageBytes;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}