日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 編程 > C# > 正文

C# IFF圖形結(jié)構(gòu)解析代碼

2020-01-24 03:44:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
圖形數(shù)據(jù)區(qū)的數(shù)據(jù)存放也和別的圖形文件有天地之區(qū)別。
例如 256色圖形 第1個(gè)字節(jié)放的是 前8個(gè)相素的最第位 后面依次類推。知道相素的最后一個(gè)最底位完畢并補(bǔ)碼后 才是相素的底2位。
也就是說(shuō) 寬為16的圖形 第1-2字節(jié) 是放最低位 3-4 放的低2位 5-6為3位 。。。一直到 15-16 為最高位
24位色 的 也是這樣 就是先是 R數(shù)據(jù) 然后是G流 最后是B
使用方法
復(fù)制代碼 代碼如下:

//顯示RSB文件
ImageIFF _Iff = new ImageIFF(@"D:/temp/4.IFF");
pictureBox1.Image = _Iff.Image;
//保存
ImageIFF _Iff = new ImageIFF();
_Iff.Image = (Bitmap)Image.FromFile(@"d:/TEMP/1.bmp");
_Iff.SaveImage(@"d:/temp/ok.IFF");

全部代碼
復(fù)制代碼 代碼如下:

/// <summary>
/// IFF文件結(jié)構(gòu)
/// zgke@sina.com
/// QQ:116149
/// </summary>
public class ImageIFF
{
private uint m_Heard = 0x4d524f46; //FROM
private uint m_FileSize = 0;
private uint m_FileType = 0x4d424c49; //ILBM
private IList<ImageIFFOfANNO> m_ANNO = new List<ImageIFFOfANNO>();
private ImageIffOfBMHD m_BMHD = new ImageIffOfBMHD();
private ImageIffOfCMAP m_CMAP = new ImageIffOfCMAP();
/// <summary>
/// 圖形區(qū)域
/// </summary>
private Bitmap m_Bitmap;
/// <summary>
/// 描述字段
/// </summary>
public IList<ImageIFFOfANNO> ANNO { get { return m_ANNO; } set { m_ANNO = value; } }
/// <summary>
/// 圖形區(qū)域
/// </summary>
public Bitmap Image { get { return m_Bitmap; } set { m_Bitmap = value; } }
public ImageIFF()
{
}
public ImageIFF(string p_FileName)
{
if (!File.Exists(p_FileName)) throw new Exception("文件不存在!");
byte[] _Bytes = File.ReadAllBytes(p_FileName);
if (BitConverter.ToInt32(_Bytes, 0) != m_Heard) throw new Exception("文件不是IFF文件!");
m_FileSize = BytesToUint(_Bytes, 4);
if (m_FileSize != _Bytes.Length - 8) throw new Exception("文件大小不正確!");
if (BitConverter.ToInt32(_Bytes, 8) != m_FileType) throw new Exception("文件格式不正確!");
LoadData(_Bytes, 12);
}
/// <summary>
/// 獲取數(shù)據(jù)
/// </summary>
/// <param name="p_FileBytes"></param>
/// <param name="p_Index">開(kāi)始位置</param>
private void LoadData(byte[] p_FileBytes, uint p_Index)
{
if (p_Index >= p_FileBytes.Length) return;
uint _ReadIndex = p_Index + 4;
string _TypeText = Encoding.ASCII.GetString(p_FileBytes, (int)p_Index, 4);
switch (_TypeText)
{
case "ANNO": //描述表
m_ANNO.Add(new ImageIFFOfANNO(p_FileBytes, ref _ReadIndex));
break;
case "BMHD": //圖形屬性表
m_BMHD = new ImageIffOfBMHD(p_FileBytes, ref _ReadIndex);
break;
case "CMAP": //顏色表
m_CMAP = new ImageIffOfCMAP(p_FileBytes, ref _ReadIndex);
break;
case "BODY": //圖形區(qū)域
LoadImage(p_FileBytes, ref _ReadIndex);
break;
}
LoadData(p_FileBytes, _ReadIndex);
}
/// <summary>
/// 獲取圖形數(shù)據(jù)
/// </summary>
/// <param name="p_FileBytes"></param>
/// <param name="p_ReadIndex"></param>
private void LoadImage(byte[] p_FileBytes, ref uint p_ReadIndex)
{
uint _Size = ImageIFF.BytesToUint(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 4;
m_Bitmap = new Bitmap(m_BMHD.Width, m_BMHD.Height, m_BMHD.Pixel);
BitmapData _BitmapData = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadWrite, m_Bitmap.PixelFormat);
byte[] _WriteBytes = new byte[_BitmapData.Stride * _BitmapData.Height];
uint _ReadStride = _Size / (uint)_BitmapData.Height / 8;
int _WriteIndex = 0;
byte[] _ReadBytes = new byte[_Size / (uint)_BitmapData.Height];
int _ReadBitArray = (int)_ReadStride * 8;
switch (m_Bitmap.PixelFormat)
{
default:
throw new Exception("未實(shí)現(xiàn)");
case PixelFormat.Format8bppIndexed:
for (int i = 0; i != _BitmapData.Height; i++)
{
_WriteIndex = i * _BitmapData.Stride;
Array.Copy(p_FileBytes, p_ReadIndex, _ReadBytes, 0, _ReadBytes.Length); //復(fù)制一行數(shù)據(jù)到緩沖區(qū)
p_ReadIndex += (uint)_ReadBytes.Length; //定義到下一行獲取的位置
System.Collections.BitArray _ReadArray = new System.Collections.BitArray(_ReadBytes); //1是true 0是false
System.Collections.BitArray _WriteArray = new System.Collections.BitArray(new byte[] { 0 }); //1是true 0是false
for (int z = 0; z != _BitmapData.Width; z++)
{
int _ReadIndex = ((z / 8) * 8) + 7 - (z % 8); //獲取順序?yàn)?7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23
_WriteArray[0] = _ReadArray[_ReadIndex];
_WriteArray[1] = _ReadArray[_ReadBitArray + _ReadIndex];
_WriteArray[2] = _ReadArray[(_ReadBitArray * 2) + _ReadIndex];
_WriteArray[3] = _ReadArray[(_ReadBitArray * 3) + _ReadIndex];
_WriteArray[4] = _ReadArray[(_ReadBitArray * 4) + _ReadIndex];
_WriteArray[5] = _ReadArray[(_ReadBitArray * 5) + _ReadIndex];
_WriteArray[6] = _ReadArray[(_ReadBitArray * 6) + _ReadIndex];
_WriteArray[7] = _ReadArray[(_ReadBitArray * 7) + _ReadIndex];
_WriteArray.CopyTo(_WriteBytes, _WriteIndex + z);
}
}
#region 設(shè)置顏色表
ColorPalette _Palette = m_Bitmap.Palette;
for (int i = 0; i != m_CMAP.ColorList.Length; i++)
{
_Palette.Entries[i] = m_CMAP.ColorList[i];
}
m_Bitmap.Palette = _Palette;
#endregion
break;
case PixelFormat.Format24bppRgb:
int _Stride = _ReadBitArray / 3; //行內(nèi)便宜 也就是行的點(diǎn)數(shù)的 (X/16)*16+(X%16==0?0:16);
_ReadBitArray = (int)_Size / _BitmapData.Height / 3 * 8; //所有顏色分量后的色彩位置 也就是所有行的位置
for (int i = 0; i != _BitmapData.Height; i++)
{
_WriteIndex = i * _BitmapData.Stride;
Array.Copy(p_FileBytes, p_ReadIndex, _ReadBytes, 0, _ReadBytes.Length); //復(fù)制一行數(shù)據(jù)到緩沖區(qū)
p_ReadIndex += (uint)_ReadBytes.Length; //定義到下一行獲取的位置
System.Collections.BitArray _ReadArray = new System.Collections.BitArray(_ReadBytes); //1是true 0是false
System.Collections.BitArray _WriteRedArray = new System.Collections.BitArray(new byte[] { 0 }); //1是true 0是false
System.Collections.BitArray _WriteGreenArray = new System.Collections.BitArray(new byte[] { 0 }); //1是true 0是false
System.Collections.BitArray _WriteBlueArray = new System.Collections.BitArray(new byte[] { 0 }); //1是true 0是false
for (int z = 0; z != _BitmapData.Width; z++)
{
int _ReadIndex = ((z / 8) * 8) + 7 - (z % 8); //獲取順序?yàn)?7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23
_WriteRedArray[0] = _ReadArray[_ReadIndex];
_WriteRedArray[1] = _ReadArray[_Stride + _ReadIndex];
_WriteRedArray[2] = _ReadArray[(_Stride * 2) + _ReadIndex];
_WriteRedArray[3] = _ReadArray[(_Stride * 3) + _ReadIndex];
_WriteRedArray[4] = _ReadArray[(_Stride * 4) + _ReadIndex];
_WriteRedArray[5] = _ReadArray[(_Stride * 5) + _ReadIndex];
_WriteRedArray[6] = _ReadArray[(_Stride * 6) + _ReadIndex];
_WriteRedArray[7] = _ReadArray[(_Stride * 7) + _ReadIndex]; //紅色
_WriteGreenArray[0] = _ReadArray[_ReadBitArray + _ReadIndex];
_WriteGreenArray[1] = _ReadArray[_ReadBitArray + _Stride + _ReadIndex];
_WriteGreenArray[2] = _ReadArray[_ReadBitArray + (_Stride * 2) + _ReadIndex];
_WriteGreenArray[3] = _ReadArray[_ReadBitArray + (_Stride * 3) + _ReadIndex];
_WriteGreenArray[4] = _ReadArray[_ReadBitArray + (_Stride * 4) + _ReadIndex];
_WriteGreenArray[5] = _ReadArray[_ReadBitArray + (_Stride * 5) + _ReadIndex];
_WriteGreenArray[6] = _ReadArray[_ReadBitArray + (_Stride * 6) + _ReadIndex];
_WriteGreenArray[7] = _ReadArray[_ReadBitArray + (_Stride * 7) + _ReadIndex]; //綠
_WriteBlueArray[0] = _ReadArray[_ReadBitArray * 2 + _ReadIndex];
_WriteBlueArray[1] = _ReadArray[_ReadBitArray * 2 + _Stride + _ReadIndex];
_WriteBlueArray[2] = _ReadArray[_ReadBitArray * 2 + (_Stride * 2) + _ReadIndex];
_WriteBlueArray[3] = _ReadArray[_ReadBitArray * 2 + (_Stride * 3) + _ReadIndex];
_WriteBlueArray[4] = _ReadArray[_ReadBitArray * 2 + (_Stride * 4) + _ReadIndex];
_WriteBlueArray[5] = _ReadArray[_ReadBitArray * 2 + (_Stride * 5) + _ReadIndex];
_WriteBlueArray[6] = _ReadArray[_ReadBitArray * 2 + (_Stride * 6) + _ReadIndex];
_WriteBlueArray[7] = _ReadArray[_ReadBitArray * 2 + (_Stride * 7) + _ReadIndex]; //藍(lán)
_WriteRedArray.CopyTo(_WriteBytes, _WriteIndex + z * 3 + 2);
_WriteGreenArray.CopyTo(_WriteBytes, _WriteIndex + z * 3 + 1);
_WriteBlueArray.CopyTo(_WriteBytes, _WriteIndex + z * 3);
}
}
break;
}
Marshal.Copy(_WriteBytes, 0, _BitmapData.Scan0, _WriteBytes.Length);
m_Bitmap.UnlockBits(_BitmapData);
}
/// <summary>
/// 保存數(shù)據(jù)到文件
/// </summary>
/// <param name="p_File"></param>
public void SaveImage(string p_File)
{
if (m_Bitmap == null) return;
m_ANNO.Add(new ImageIFFOfANNO("IFF-File C#ImageIFF zgke@sina.com"));
System.IO.File.WriteAllBytes(p_File, GetFileBytes());
}
/// <summary>
/// 保存圖形
/// </summary>
/// <returns></returns>
private byte[] GetFileBytes()
{
MemoryStream _Stream = new MemoryStream();
_Stream.Write(BitConverter.GetBytes(m_Heard), 0, 4);
_Stream.Write(new byte[] { 0, 0, 0, 0 }, 0, 4);
_Stream.Write(BitConverter.GetBytes(m_FileType), 0, 4);
byte[] _WriteBytes = new byte[0];
for (int i = 0; i != m_ANNO.Count; i++)
{
_WriteBytes = m_ANNO[i].GetBytes();
_Stream.Write(_WriteBytes, 0, _WriteBytes.Length);
}
_WriteBytes = m_BMHD.GetBytes(m_Bitmap);
_Stream.Write(_WriteBytes, 0, _WriteBytes.Length);
switch (m_Bitmap.PixelFormat)
{
case PixelFormat.Format8bppIndexed:
_Stream.Write(new byte[] { 0x43, 0x4D, 0x41, 0x50 }, 0, 4);
_Stream.Write(ImageIFF.UintToBytes((uint)768), 0, 4);
for (int i = 0; i != 256; i++)
{
_Stream.Write(new byte[] { m_Bitmap.Palette.Entries[i].R, m_Bitmap.Palette.Entries[i].G, m_Bitmap.Palette.Entries[i].B }, 0, 3);
}
break;
default:
break;
}
byte[] _ImageBytes = SaveImage();
_Stream.Write(new byte[] { 0x42, 0x4F, 0x44, 0x59 }, 0, 4);
_Stream.Write(ImageIFF.UintToBytes((uint)_ImageBytes.Length), 0, 4);
_Stream.Write(_ImageBytes, 0, _ImageBytes.Length);
m_FileSize = (uint)_Stream.Length - 8;
_Stream.Position = 4;
_Stream.Write(ImageIFF.UintToBytes(m_FileSize), 0, 4);
return _Stream.ToArray();
}
private byte[] SaveImage()
{
Bitmap _NewBitmap;
BitmapData _Data;
byte[] _ReadBytes;
int _ReadStride = 0;
int _WriteBitArray = 0;
int _Stride = 0;
int _WidthOne = 0;
int _WidthAll = 0;
byte[] _WriteBytes;
byte[] _WriteRowBytes;
int _ReadIndex = 0;
int _WriteIndex = 0;
switch (m_Bitmap.PixelFormat)
{
case PixelFormat.Format8bppIndexed:
_Data = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
_ReadBytes = new byte[_Data.Stride * _Data.Height];
_ReadStride = _Data.Stride;
Marshal.Copy(_Data.Scan0, _ReadBytes, 0, _ReadBytes.Length);
m_Bitmap.UnlockBits(_Data);
_WidthOne = (m_Bitmap.Width / 16) * 16 + (m_Bitmap.Width % 16 == 0 ? 0 : 16);
_WidthAll = _WidthOne * m_Bitmap.Height;
_WriteBytes = new byte[_WidthAll];
_WriteRowBytes = new byte[_WidthOne];
_WriteBitArray = _WidthOne;
for (int i = 0; i != m_Bitmap.Height; i++)
{
_ReadIndex = i * _ReadStride;
Array.Copy(_WriteBytes, i * _WriteRowBytes.Length, _WriteRowBytes, 0, _WriteRowBytes.Length);
System.Collections.BitArray _WriteArray = new System.Collections.BitArray(_WriteRowBytes);
for (int z = 0; z != m_Bitmap.Width; z++)
{
System.Collections.BitArray _ColorArray = new System.Collections.BitArray(new byte[] { _ReadBytes[_ReadIndex + z] });
_WriteIndex = ((z / 8) * 8) + 7 - (z % 8); //獲取順序?yàn)?7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23
_WriteArray[_WriteIndex] = _ColorArray[0];
_WriteArray[_WriteBitArray + _WriteIndex] = _ColorArray[1];
_WriteArray[(_WriteBitArray * 2) + _WriteIndex] = _ColorArray[2];
_WriteArray[(_WriteBitArray * 3) + _WriteIndex] = _ColorArray[3];
_WriteArray[(_WriteBitArray * 4) + _WriteIndex] = _ColorArray[4];
_WriteArray[(_WriteBitArray * 5) + _WriteIndex] = _ColorArray[5];
_WriteArray[(_WriteBitArray * 6) + _WriteIndex] = _ColorArray[6];
_WriteArray[(_WriteBitArray * 7) + _WriteIndex] = _ColorArray[7];
}
_WriteArray.CopyTo(_WriteRowBytes, 0);
Array.Copy(_WriteRowBytes, 0, _WriteBytes, i * _WriteRowBytes.Length, _WriteRowBytes.Length);
}
return _WriteBytes;
break;
default:
_NewBitmap = new Bitmap(m_Bitmap.Width, m_Bitmap.Height, PixelFormat.Format24bppRgb);
Graphics _Graphics = Graphics.FromImage(_NewBitmap);
_Graphics.DrawImage(m_Bitmap, new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height));
_Graphics.Dispose();
_Data = _NewBitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
_ReadBytes = new byte[_Data.Stride * _Data.Height];
_ReadStride = _Data.Stride;
Marshal.Copy(_Data.Scan0, _ReadBytes, 0, _ReadBytes.Length);
_NewBitmap.UnlockBits(_Data);
_WidthOne = (_NewBitmap.Width / 16) * 16 + (_NewBitmap.Width % 16 == 0 ? 0 : 16);
_WidthAll = _WidthOne * 3 * _NewBitmap.Height;
_WriteBytes = new byte[_WidthAll];
_WriteRowBytes = new byte[_WidthOne * 3];
_ReadIndex = 0;
_WriteIndex = 0;
_WriteBitArray = _WidthOne * 8;
_Stride = _WidthOne;
for (int i = 0; i != _NewBitmap.Height; i++)
{
_ReadIndex = i * _ReadStride;
Array.Copy(_WriteBytes, i * _WriteRowBytes.Length, _WriteRowBytes, 0, _WriteRowBytes.Length);
System.Collections.BitArray _WriteArray = new System.Collections.BitArray(_WriteRowBytes);
for (int z = 0; z != _NewBitmap.Width; z++)
{
byte[] _Color = new byte[] { _ReadBytes[_ReadIndex + (z * 3) + 2], _ReadBytes[_ReadIndex + (z * 3) + 1], _ReadBytes[_ReadIndex + (z * 3)] };
System.Collections.BitArray _ColorArray = new System.Collections.BitArray(_Color);
_WriteIndex = ((z / 8) * 8) + 7 - (z % 8); //獲取順序?yàn)?7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23
_WriteArray[_WriteIndex] = _ColorArray[0];
_WriteArray[_Stride + _WriteIndex] = _ColorArray[1];
_WriteArray[(_Stride * 2) + _WriteIndex] = _ColorArray[2];
_WriteArray[(_Stride * 3) + _WriteIndex] = _ColorArray[3];
_WriteArray[(_Stride * 4) + _WriteIndex] = _ColorArray[4];
_WriteArray[(_Stride * 5) + _WriteIndex] = _ColorArray[5];
_WriteArray[(_Stride * 6) + _WriteIndex] = _ColorArray[6];
_WriteArray[(_Stride * 7) + _WriteIndex] = _ColorArray[7]; //紅色
_WriteArray[_WriteBitArray + _WriteIndex] = _ColorArray[8];
_WriteArray[_WriteBitArray + _Stride + _WriteIndex] = _ColorArray[9];
_WriteArray[_WriteBitArray + (_Stride * 2) + _WriteIndex] = _ColorArray[10];
_WriteArray[_WriteBitArray + (_Stride * 3) + _WriteIndex] = _ColorArray[11];
_WriteArray[_WriteBitArray + (_Stride * 4) + _WriteIndex] = _ColorArray[12];
_WriteArray[_WriteBitArray + (_Stride * 5) + _WriteIndex] = _ColorArray[13];
_WriteArray[_WriteBitArray + (_Stride * 6) + _WriteIndex] = _ColorArray[14];
_WriteArray[_WriteBitArray + (_Stride * 7) + _WriteIndex] = _ColorArray[15]; //綠
_WriteArray[_WriteBitArray * 2 + _WriteIndex] = _ColorArray[16];
_WriteArray[_WriteBitArray * 2 + _Stride + _WriteIndex] = _ColorArray[17];
_WriteArray[_WriteBitArray * 2 + (_Stride * 2) + _WriteIndex] = _ColorArray[18];
_WriteArray[_WriteBitArray * 2 + (_Stride * 3) + _WriteIndex] = _ColorArray[19];
_WriteArray[_WriteBitArray * 2 + (_Stride * 4) + _WriteIndex] = _ColorArray[20];
_WriteArray[_WriteBitArray * 2 + (_Stride * 5) + _WriteIndex] = _ColorArray[21];
_WriteArray[_WriteBitArray * 2 + (_Stride * 6) + _WriteIndex] = _ColorArray[22];
_WriteArray[_WriteBitArray * 2 + (_Stride * 7) + _WriteIndex] = _ColorArray[23]; //藍(lán)
}
_WriteArray.CopyTo(_WriteRowBytes, 0);
Array.Copy(_WriteRowBytes, 0, _WriteBytes, i * _WriteRowBytes.Length, _WriteRowBytes.Length);
}
_NewBitmap.Dispose();
return _WriteBytes;
break;
}
return new byte[0];
}
#region 結(jié)構(gòu)類
/// <summary>
/// ANNO描述字段
/// </summary>
public class ImageIFFOfANNO
{
public ImageIFFOfANNO(byte[] p_FileBytes, ref uint p_ReadIndex)
{
m_Size = ImageIFF.BytesToUint(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 4;
m_Text = Encoding.Default.GetString(p_FileBytes, (int)p_ReadIndex, (int)m_Size);
p_ReadIndex += m_Size;
}
public ImageIFFOfANNO(string p_Txt)
{
Text = p_Txt;
}
public ImageIFFOfANNO()
{
}
private uint m_Size = 0;
private string m_Text = "";
public string Text
{
get
{
return m_Text;
}
set
{
m_Text = value;
}
}
/// <summary>
/// 獲取對(duì)應(yīng)的字節(jié)數(shù)
/// </summary>
/// <returns></returns>
public byte[] GetBytes()
{
if (m_Text.Length == 0) return new byte[0];
MemoryStream _Stream = new MemoryStream();
_Stream.Write(new byte[] { 0x41, 0x4E, 0x4E, 0x4F }, 0, 4);
byte[] _TextBytes = Encoding.Default.GetBytes(m_Text);
int _Count = _TextBytes.Length;
if (_TextBytes.Length % 2 != 0) _Count++;
byte[] _ValueBytes = ImageIFF.UintToBytes((uint)_Count);
_Stream.Write(_ValueBytes, 0, _ValueBytes.Length);
_Stream.Write(_TextBytes, 0, _TextBytes.Length);
if (_TextBytes.Length % 2 != 0) _Stream.Write(new byte[] { 0x20 }, 0, 1);
return _Stream.ToArray();
}
}
/// <summary>
/// 圖形設(shè)置
/// </summary>
private class ImageIffOfBMHD
{
/// <summary>
/// 區(qū)域大小
/// </summary>
private uint m_Size = 20;
private ushort m_Width = 0;
private ushort m_Height = 0;
private ushort m_X = 0;
private ushort m_Y = 0;
private PixelFormat m_Pixel = PixelFormat.Format24bppRgb;
private byte m_Masking = 0;
private byte m_Compression = 0;
private byte m_Padl = 0;
private ushort m_TColor = 0;
private byte m_XAspect = 0;
private byte m_YAspect = 0;
private ushort m_PWidth = 0;
private ushort m_PHeight = 0;
/// <summary>
/// 0不壓縮 1壓縮
/// </summary>
public byte Compression { get { return m_Compression; } set { m_Compression = value; } }
/// <summary>
/// 寬
/// </summary>
public ushort Width { get { return m_Width; } set { m_Width = value; } }
/// <summary>
/// 高
/// </summary>
public ushort Height { get { return m_Height; } set { m_Height = value; } }
/// <summary>
/// 顏色數(shù)
/// </summary>
public PixelFormat Pixel { get { return m_Pixel; } set { m_Pixel = value; } }
public ImageIffOfBMHD()
{
}
public ImageIffOfBMHD(byte[] p_FileBytes, ref uint p_ReadIndex)
{
m_Size = ImageIFF.BytesToUint(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 4;
m_Width = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 2;
m_Height = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 2;
m_X = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 2;
m_Y = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 2;
switch (p_FileBytes[p_ReadIndex])
{
case 8:
m_Pixel = PixelFormat.Format8bppIndexed;
break;
case 24:
m_Pixel = PixelFormat.Format24bppRgb;
break;
default:
throw new Exception("未實(shí)現(xiàn)!");
}
p_ReadIndex++;
m_Masking = p_FileBytes[p_ReadIndex];
p_ReadIndex++;
m_Compression = p_FileBytes[p_ReadIndex];
if (m_Compression != 0) throw new Exception("未實(shí)現(xiàn)RLE壓縮的IFF圖形");
p_ReadIndex++;
m_Padl = p_FileBytes[p_ReadIndex];
p_ReadIndex++;
m_TColor = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 2;
m_XAspect = p_FileBytes[p_ReadIndex];
p_ReadIndex++;
m_YAspect = p_FileBytes[p_ReadIndex];
p_ReadIndex++;
m_PWidth = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex); ;
p_ReadIndex += 2;
m_PHeight = ImageIFF.BytesToShort(p_FileBytes, (int)p_ReadIndex); ;
p_ReadIndex += 2;
}
/// <summary>
/// 根據(jù)圖形獲取數(shù)據(jù)集
/// </summary>
/// <param name="p_Bitmap"></param>
/// <returns></returns>
public byte[] GetBytes(Bitmap p_Bitmap)
{
if (p_Bitmap == null) return new byte[0];
MemoryStream _Stream = new MemoryStream();
_Stream.Write(new byte[] { 0x42, 0x4D, 0x48, 0x44 }, 0, 4);
_Stream.Write(new byte[] { 0, 0, 0, 0x14 }, 0, 4);
_Stream.Write(ImageIFF.UintToBytes((ushort)p_Bitmap.Width), 0, 2);
_Stream.Write(ImageIFF.UintToBytes((ushort)p_Bitmap.Height), 0, 2);
_Stream.Write(ImageIFF.UintToBytes(m_X), 0, 2);
_Stream.Write(ImageIFF.UintToBytes(m_Y), 0, 2);
switch (p_Bitmap.PixelFormat)
{
case PixelFormat.Format8bppIndexed:
_Stream.WriteByte(8);
break;
default:
_Stream.WriteByte(24);
break;
}
_Stream.WriteByte(0);
_Stream.WriteByte(0);
_Stream.WriteByte(0);
_Stream.Write(ImageIFF.UintToBytes(m_TColor), 0, 2);
_Stream.WriteByte(0);
_Stream.WriteByte(0);
_Stream.Write(ImageIFF.UintToBytes((ushort)p_Bitmap.Width), 0, 2);
_Stream.Write(ImageIFF.UintToBytes((ushort)p_Bitmap.Height), 0, 2);
return _Stream.ToArray();
}
}
/// <summary>
/// 顏色表
/// </summary>
private class ImageIffOfCMAP
{
/// <summary>
/// 區(qū)域大小
/// </summary>
private uint m_Size = 20;
/// <summary>
/// 顏色表
/// </summary>
private Color[] m_ColorList = new Color[256];
/// <summary>
/// 顏色表
/// </summary>
public Color[] ColorList { get { return m_ColorList; } set { m_ColorList = value; m_Size = (uint)m_ColorList.Length * 3; } }
public ImageIffOfCMAP()
{
}
public ImageIffOfCMAP(byte[] p_FileBytes, ref uint p_ReadIndex)
{
m_Size = ImageIFF.BytesToUint(p_FileBytes, (int)p_ReadIndex);
p_ReadIndex += 4;
int _Count = (int)m_Size / 3;
m_ColorList = new Color[_Count];
for (int i = 0; i != _Count; i++)
{
m_ColorList[i] = Color.FromArgb(p_FileBytes[p_ReadIndex], p_FileBytes[p_ReadIndex + 1], p_FileBytes[p_ReadIndex + 2]);
p_ReadIndex += 3;
}
}
}
#endregion
#region 數(shù)據(jù)轉(zhuǎn)換
/// <summary>
/// 字節(jié)轉(zhuǎn)換為UINT
/// </summary>
/// <param name="p_Value">字節(jié)數(shù)組</param>
/// <param name="p_Index">開(kāi)始位置</param>
/// <returns></returns>
public static uint BytesToUint(byte[] p_Value, int p_Index)
{
byte[] _ValueBytes = new byte[4];
_ValueBytes[0] = p_Value[p_Index + 3];
_ValueBytes[1] = p_Value[p_Index + 2];
_ValueBytes[2] = p_Value[p_Index + 1];
_ValueBytes[3] = p_Value[p_Index];
return BitConverter.ToUInt32(_ValueBytes, 0);
}
/// <summary>
/// 獲取反轉(zhuǎn)的BYTES
/// </summary>
/// <param name="p_Value"></param>
/// <returns></returns>
public static byte[] UintToBytes(uint p_Value)
{
byte[] _ValueBytes = BitConverter.GetBytes(p_Value);
Array.Reverse(_ValueBytes);
return _ValueBytes;
}
/// <summary>
/// 字節(jié)轉(zhuǎn)換為UINT
/// </summary>
/// <param name="p_Value">字節(jié)數(shù)組</param>
/// <param name="p_Index">開(kāi)始位置</param>
/// <returns></returns>
public static ushort BytesToShort(byte[] p_Value, int p_Index)
{
byte[] _ValueBytes = new byte[2];
_ValueBytes[0] = p_Value[p_Index + 1];
_ValueBytes[1] = p_Value[p_Index];
return BitConverter.ToUInt16(_ValueBytes, 0);
}
/// <summary>
/// 獲取反轉(zhuǎn)的BYTES
/// </summary>
/// <param name="p_Value"></param>
/// <returns></returns>
public static byte[] UintToBytes(ushort p_Value)
{
byte[] _ValueBytes = BitConverter.GetBytes(p_Value);
Array.Reverse(_ValueBytes);
return _ValueBytes;
}
#endregion
}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久久91精品国产| 精品在线网站观看| 国产在线视频一区二区| 亚洲图片小说综合| 日韩三级一区二区| 91精品啪在线观看国产60岁| 丰满少妇一区| 日韩欧美国产高清| 久久91精品国产91久久小草| 精品对白一区国产伦| 精品中文在线| 亚洲综合三区| 欧美日韩午夜在线视频| 一区二区91| 亚洲女人天堂色在线7777| 欧美日韩在线播放一区| 国产在线视频一区二区| 日韩一级网站| 激情国产在线| 国产视频不卡| 蜜桃视频一日韩欧美专区| 欧美亚洲国产日韩2020| 日韩三级视频在线| 国产 日韩 欧美 综合| 欧美色视频一区二区三区在线观看| 中文字幕在线日韩| 视频在线一区二区| 国产三级视频网站| 亚洲九九精品| 国产欧美中文在线| 国产h片在线观看| 二区三区不卡不卡视频| www.中文字幕在线观看| 中文字幕日韩国产| 伊人伊成久久人综合网小说| 91精品视频播放| 日韩免费精品视频| 久久99久久久欧美国产| 欧美日韩在线播放三区四区| 91精品婷婷国产综合久久竹菊| 黄色视屏免费在线观看| 尤物av一区二区| 天天综合天天| 日韩视频在线一区二区| 91精品在线观| 中文字幕欧美日韩在线不卡| 欧美日韩亚洲综合| va中文字幕| 欧美在线日韩精品| 精品欧美日韩在线| 久久精品夜夜夜夜久久| 国产无遮挡在线视频免费观看| 日韩欧美亚洲区| 国产91欧美| 精品国产99| 国产黄色精品| 国产视频中文字幕| av免费在线观看网址| 不卡av免费在线| 免费高清特黄a大片| 欧美日韩精品免费在线观看视频| 一本一道久久a久久精品综合蜜臀| 九七久久人人| 久久精品卡一| 亚洲第一网中文字幕| 国产亚洲人成a一在线v站| 日韩欧美在线看| 国产欧美中文在线| 日韩亚洲欧美中文高清在线| www日韩在线观看| 欧美三级日韩在线| 国产欧美久久久| 免费国产h视频在线观看86| 91精品国产91久久久久青草| 欧美在线日韩精品| 91精品高清| 欧美激情一区二区在线| 亚洲.国产.中文慕字在线| 亚洲高清不卡一区| √新版天堂资源在线资源| 日韩精品视频在线观看网址 | 视频一区日韩| 国产成人精品网址| 区日韩二区欧美三区| 日本精品在线播放| 国产 日韩 欧美 综合 一区| 91精品国产综合久久久久久漫画| 亚洲热在线观看| 一区二区三区精品在线| 影音先锋中文字幕在线观看| 欧美日韩国产区| 不卡专区在线| 欧美在线日韩在线| 精品在线一区二区| 在线免费91| 日韩欧美亚洲国产| 日韩精品在线免费观看| 欧美二三四区| a天堂中文在线官网在线| 亚洲欧洲在线观看av| 一级片免费在线播放| 国产亚洲短视频| 中文字幕国产欧美| 一级片免费网站| 欧美日韩精品在线观看| 亚洲欧美日本国产专区一区| 免费高清视频日韩| 婷婷中文字幕在线观看| 91精品免费观看| 午夜影院在线观看欧美| 亚洲成年网站在线观看| 免费高清在线一区| 深夜福利亚洲| 欧美日韩亚洲不卡| 日韩欧美国产不卡| 亚洲欧美中文字幕| 久久 天天综合| 欧美日韩久久久| 欧美日韩亚洲天堂| 国产不卡在线观看视频| 欧美日韩三级在线观看| 久久91精品久久久久久秒播| 久久99久久久久| 日韩欧美中文第一页| 中文字幕日韩精品在线| 91精品观看| 欧美日韩亚洲不卡| 日韩在线高清视频| 免费在线播放av| 日本a级黄色| 欧美黄页在线免费观看| 国产激情久久| 日韩精品久久久| 蜜桃视频中文字幕| 一区二区精品| 精人妻一区二区三区| 久久激情中文| 国产欧美高清在线| 亚洲一区导航| 中文字幕 亚洲视频| 国产精品视频福利一区二区| 日韩欧美在线网址| 国产一级在线| 一区二区三区免费看视频| a天堂中文在线官网在线| 91麻豆视频网站| 日韩精品视频免费| 一区二区三区精品在线观看| 成人禁用看黄a在线| 亚洲三级免费看| 日韩欧美国产高清| 欧美日韩精品是欧美日韩精品| 中文字幕在线观看视频www| 亚洲免费专区| 国产日韩av一区| a级在线免费观看| 国产福利第一页| 亚洲人线精品午夜| 91精品国产91久久久久青草| 在线黄色国产电影| 日韩欧美国产午夜精品| 久久久99精品久久| 在线视频第一页| 色猫猫国产区一区二在线视频| 国产一二三四| 91精品观看| 亚洲成av人片| 欧美亚洲免费高清在线观看| 日韩美女中文字幕| 精品日本视频| 免费国产成人看片在线| 91精品蜜臀在线一区尤物| 精品国产免费视频| 欧美日韩国产大片| 高清在线一区| 亚洲欧美中文字幕在线观看| 午夜国产福利一区二区| 69堂精品视频在线播放| 久久久精品免费免费| 免费在线视频一区二区| 欧洲一级精品| 欧美日韩91| 色综合天天综合网天天狠天天| 偷窥国产亚洲免费视频| 亚洲丝袜一区| 亚洲欧美韩国综合色| 91精品久久久久久久久| 日韩视频在线免费看| 精品播放一区二区| 精品日本视频| 91极品视频在线观看| 亚洲视频中文字幕| 92久久精品| 成人福利一区| 中文字幕在线观看精品| 999精品网| 精品欧美不卡一区二区在线观看| 日本熟女一区二区| 最近高清中文在线字幕在线观看1| 免费在线播放av| 中文精品在线观看| 黄色国产网站在线观看| 亚洲高清在线观看一区| 99久久精品国产成人一区二区| 日韩精品免费视频一区二区三区| 最近中文av字幕在线中文| 日韩精品在线免费看| 日韩亚洲欧美中文三级| www.中文字幕在线观看| 中文字幕在线观看欧美| 国产三级免费观看| 亚洲a级在线播放观看| 91精品视频播放| 精品在线网站观看| 精品一二三区| 国产91欧美| 欧美日韩国产专区| 欧美日韩免费视频| 国产91久久久久蜜臀青青天草二| 在线观看av的网站| 欧美日韩综合不卡| 国产乱码午夜在线视频| 日韩视频国产视频| 在线国产99| 国产三级做爰在线观看| 日韩精品在线观| 国产高清视频一区二区| 国产视频中文字幕| 日韩在线视频免费观看| 国产在线第一页| 国产日产一区二区| 另类专区欧美| 午夜国产福利在线观看| 成人欧美亚洲| 日韩免费精品| 人成在线免费视频| 国产日韩亚洲欧美| 欧美日韩第一| 91精品视频国产| 亚洲男人在线| 国产一级在线免费观看| 亚洲区中文字幕| 精品福利二区三区| 欧美日韩国产在线播放| 欧美日韩一级视频| 日韩午夜一区| 亚洲一区视频在线观看视频| 中文字幕一区二区三区精品| 99亚洲视频| 日韩免费视频一区| 视频一区视频二区中文| 中文字幕2020第一页| 国产 欧美 日韩 在线| 欧洲精品在线一区| 国产天堂素人系列在线视频| 日韩欧美国产三级| 欧美日韩一区二区在线视频| 日韩精品丝袜在线| 麻豆精品99| 欧美日韩综合在线| 欧美日韩国产免费观看| 日韩精品视频网| 日韩一级二级三级精品视频| 免费高清在线一区| 亚洲乱码中文字幕综合| 国产欧美日韩不卡免费| 91麻豆精品在线| 日韩手机在线观看视频| 久99久视频| 国产午夜精品久久| 亚洲 国产 欧美 日韩| 精品免费久久久| 亚洲一区二区三区精品中文字幕| 91精品国产综合久久久久久 | 91精品在线免费| 中文字幕精品视频| 999视频精品| 国产 欧美在线| 日韩久久不卡| 中文字幕在线视频网| 日韩中文字幕视频网| 中文欧美日韩| 国产一区在线精品| 欧洲精品二区| 精品日韩在线观看| 日韩精品欧美在线| 欧美日韩人人澡狠狠躁视频| 亚洲欧美日本另类| 亚洲综合日韩欧美| 国产成人精品999| 一区二区三区中文字幕在线观看| 欧美日韩一二三| 九七久久人人| 国产中文在线视频| 精品乱人伦一区二区三区| 日韩在线视频在线观看| 欧美一级久久| 91吃瓜在线观看| 精品婷婷伊人一区三区三| a在线观看免费视频| 欧美日韩久久久| 视频一区视频二区中文| 欧美国产一区视频在线观看| 欧美日韩国产页| 免费日韩精品中文字幕视频在线| 91精品国产自产在线丝袜啪| 国产日韩精品在线看| 伊人永久在线| 欧美日韩91| 国产在线一区二区视频| 91精品国产综合久久蜜臀 | 日韩一级中文字幕| 中文字幕 亚洲一区| 国产成人精品免费网站| 91精品在线国产| 欧美日韩中文字幕在线观看| 婷婷中文字幕一区三区| 国产成人精品免费在线| 日韩欧美999| 亚洲国产综合久久| 最近高清中文在线字幕在线观看1| 亚洲欧洲精品在线| 91精品免费在线观看| www.狠狠干| 国产成人精品综合久久久| 精品亚洲国内自在自线福利| 日韩欧美国产高清91| 日韩精品在线免费看| 一区在线视频观看| 欧美日韩国产综合视频在线观看中文| 最近高清中文在线字幕在线观看| www.尤物.com| 一区二区三区在线播放欧美| 欧美久久一二三四区| 亚洲欧美伊人| 日本精品二区| 亚洲黄在线观看| av免费看在线| 欧美日韩免费精品| 在线一区av| 亚洲专区一二三| 欧美日韩精品区| 亚洲一区资源| 久久99精品国产| 蜜桃视频中文字幕| 91精品国产高清91久久久久久| 福利一区二区| av中文在线播放| 亚洲福利在线看| 韩国一区二区av| 一区二区精品区| 欧美日韩综合色| 久久久精品欧美| 欧美另类专区| 亚洲三级免费看| 欧美在线中文字幕| 中文字幕久精品免费视频| 老司机久久99久久精品播放免费| 欧美 日韩 国产 在线观看| 欧美91精品| 人成在线免费视频| 国产又粗又猛又爽又黄91精品| 亚洲综合视频一区| 日韩视频在线免费看| 在线日韩欧美| 久久精品女人| 日韩视频在线一区| 久久久综合精品| 欧美日韩亚洲一| 精品三级在线| 精品亚洲永久免费| 久久精品卡一| 国产69精品久久app免费版| 在线观看一区日韩| 视频一区三区| 国产欧美日韩亚洲| 91精品国产自产在线观看永久∴ | 欧美日韩视频在线| 亚洲三级免费看| 欧美日韩第一| 久久精品最新免费国产成人| 亚洲综合日韩中文字幕v在线| 影音先锋一区二区资源站| 日韩国产高清一区| 中文字幕 亚洲一区| 日韩三级免费观看| 日韩高清不卡一区二区| 中文字幕在线官网| 国产裸体歌舞团一区二区 | 搞黄在线观看| av免费网站在线| 久久精品国产2020观看福利| 伊人www22综合色| 亚洲视频在线观看三级| 国产色在线 com| 蜜桃视频一日韩欧美专区| www.91香蕉视频| 欧美亚洲国产日韩2020| av免费在线不卡| 日韩精品视频在线看|