源战役客户端
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

303 linhas
11 KiB

4 semanas atrás
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Drawing;
  6. using System.Drawing.Imaging;
  7. using System.Runtime.InteropServices;
  8. using UnityEngine;
  9. /// <summary>  
  10.     /// Targa文件  
  11.     /// </summary>  
  12. public class ImageTGA
  13. {
  14. public ImageTGA()
  15. {
  16. }
  17. public ImageTGA(string p_FileFullName)
  18. {
  19. if (System.IO.File.Exists(p_FileFullName))
  20. {
  21. m_name = p_FileFullName;
  22. LoadData(File.ReadAllBytes(p_FileFullName));
  23. }
  24. }
  25. #region 属性  
  26. /// <summary>
  27. /// 文件路径
  28. /// </summary>
  29. string m_name;
  30. /// <summary>
  31. /// 复制信息的时候是否出错
  32. /// </summary>
  33. public bool Copy_Error = false;
  34. /// <summary>  
  35.         /// ID区域大小 默认为0  
  36.         /// </summary>  
  37. private byte m_IDSize = 0;
  38. /// <summary>  
  39.         /// 色彩表类型 默认为0  
  40.         /// </summary>  
  41. private byte m_ColorTableType = 0;
  42. /// <summary>  
  43.         /// 色彩表类型 默认为2  
  44.         /// </summary>  
  45. private byte m_ImageType = 2;
  46. /// <summary>  
  47.         /// 色彩表类型开始位置  
  48.         /// </summary>  
  49. private ushort m_ColorTableIndex = 0;
  50. /// <summary>  
  51.         /// 色彩表长度  
  52.         /// </summary>  
  53. private ushort m_ColorTableCount = 0;
  54. /// <summary>  
  55.         /// 色彩表大小  
  56.         /// </summary>  
  57. private byte m_ColorTableSize = 24;
  58. /// <summary>  
  59.         /// 色彩表类型开始位置  
  60.         /// </summary>  
  61. private ushort m_ImageX = 0;
  62. /// <summary>  
  63.         /// 色彩表长度  
  64.         /// </summary>  
  65. private ushort m_ImageY = 0;
  66. /// <summary>  
  67.         /// 色彩表类型开始位置  
  68.         /// </summary>  
  69. private ushort m_ImageWidth = 0;
  70. /// <summary>  
  71.         /// 色彩表长度  
  72.         /// </summary>  
  73. private ushort m_ImageHeight = 0;
  74. /// <summary>  
  75.         /// 每像素位数  
  76.         /// </summary>  
  77. private byte m_PixSize = 0;
  78. /// <summary>  
  79.         /// 描述占位符  
  80.         /// </summary>  
  81. private byte m_Remark = 0;
  82. /// <summary>  
  83.         /// 读的位置  
  84.         /// </summary>  
  85. private uint m_ReadIndex = 0;
  86. /// <summary>  
  87.         /// 图形  
  88.         /// </summary>  
  89. private Bitmap m_Image;
  90. #endregion
  91. /// <summary>  
  92.         /// 图形  
  93.         /// </summary>  
  94. public Bitmap Image
  95. {
  96. get
  97. {
  98. return m_Image;
  99. }
  100. set
  101. {
  102. m_Image = value;
  103. if (value != null)
  104. {
  105. switch (value.PixelFormat)
  106. {
  107. case PixelFormat.Format8bppIndexed:
  108. m_ColorTableType = 1;
  109. m_ImageType = 1;
  110. m_ColorTableCount = 256;
  111. m_PixSize = 8;
  112. m_Remark = 32;
  113. break;
  114. case PixelFormat.Format32bppArgb:
  115. m_ColorTableType = 0;
  116. m_ImageType = 2;
  117. m_ColorTableCount = 0;
  118. m_PixSize = 32;
  119. m_Remark = 32;
  120. break;
  121. default:
  122. m_ColorTableType = 0;
  123. m_ImageType = 2;
  124. m_ColorTableCount = 0;
  125. m_PixSize = 24;
  126. m_Remark = 32;
  127. break;
  128. }
  129. m_ImageWidth = (ushort)value.Width;
  130. m_ImageHeight = (ushort)value.Height;
  131. }
  132. }
  133. }
  134. /// <summary>  
  135.         /// 获取数据  
  136.         /// </summary>  
  137.         /// <param name="p_TGABytes"></param>  
  138. private void LoadData(byte[] p_TGABytes)
  139. {
  140. m_IDSize = p_TGABytes[0];
  141. m_ColorTableType = p_TGABytes[1];
  142. m_ImageType = p_TGABytes[2];
  143. m_ColorTableIndex = BitConverter.ToUInt16(p_TGABytes, 3);
  144. m_ColorTableCount = BitConverter.ToUInt16(p_TGABytes, 5);
  145. m_ColorTableSize = p_TGABytes[7];
  146. m_ImageX = BitConverter.ToUInt16(p_TGABytes, 8);
  147. m_ImageY = BitConverter.ToUInt16(p_TGABytes, 10);
  148. m_ImageWidth = BitConverter.ToUInt16(p_TGABytes, 12);
  149. m_ImageHeight = BitConverter.ToUInt16(p_TGABytes, 14);
  150. m_PixSize = p_TGABytes[16];
  151. m_Remark = p_TGABytes[17];
  152. m_ReadIndex = 18;
  153. LoadImage(p_TGABytes);
  154. }
  155. private void LoadImage(byte[] p_TAGBytes)
  156. {
  157. switch (m_PixSize)
  158. {
  159. case 24:
  160. m_Image = new Bitmap(m_ImageWidth, m_ImageHeight, PixelFormat.Format24bppRgb);
  161. LoadImageNotRLE(p_TAGBytes, 3);
  162. break;
  163. case 32:
  164. m_Image = new Bitmap(m_ImageWidth, m_ImageHeight, PixelFormat.Format24bppRgb);
  165. LoadImageNotRLE(p_TAGBytes, 4);
  166. break;
  167. case 8:
  168. m_Image = new Bitmap(m_ImageWidth, m_ImageHeight, PixelFormat.Format8bppIndexed);
  169. ColorPalette _Palette = m_Image.Palette;
  170. for (int i = 0; i != m_ColorTableCount; i++)
  171. {
  172. _Palette.Entries[i] = System.Drawing.Color.FromArgb(255, p_TAGBytes[m_ReadIndex + 2], p_TAGBytes[m_ReadIndex + 1], p_TAGBytes[m_ReadIndex]);
  173. m_ReadIndex += 3;
  174. }
  175. m_Image.Palette = _Palette;
  176. LoadImageNotRLE(p_TAGBytes, 1);
  177. break;
  178. }
  179. }
  180. /// <summary>  
  181.         /// 获取非RLE压缩的图形  
  182.         /// </summary>  
  183.         /// <param name="p_TagBytes"></param>  
  184.         /// <param name="p_Size"></param>  
  185. private void LoadImageNotRLE(byte[] p_TagBytes, int p_Size)
  186. {
  187. int _Index = 0;
  188. PixelFormat _Format = PixelFormat.Format24bppRgb;
  189. switch (p_Size)
  190. {
  191. case 3:
  192. _Format = PixelFormat.Format24bppRgb;
  193. break;
  194. case 4:
  195. _Format = PixelFormat.Format32bppArgb;
  196. break;
  197. case 1:
  198. _Format = PixelFormat.Format8bppIndexed;
  199. break;
  200. }
  201. BitmapData _ImageData = m_Image.LockBits(new Rectangle(0, 0, m_ImageWidth, m_ImageHeight), ImageLockMode.ReadWrite, _Format);
  202. byte[] _ValueBytes = new byte[_ImageData.Stride * _ImageData.Height];
  203. for (int i = 0; i != _ImageData.Height; i++)
  204. {
  205. _Index = _ImageData.Stride * i;
  206. try
  207. {
  208. Array.Copy(p_TagBytes, m_ReadIndex, _ValueBytes, _Index, _ImageData.Width * p_Size);
  209. }
  210. catch(Exception exp)
  211. {
  212. UnityEngine.Debug.LogWarning("Copy Data Error,Mabye Wrong.\n" + m_name+"\n"+exp);
  213. Copy_Error = true;
  214. break;
  215. }
  216. m_ReadIndex += (uint)_ImageData.Width * (uint)p_Size;
  217. }
  218. Marshal.Copy(_ValueBytes, 0, _ImageData.Scan0, _ValueBytes.Length);
  219. m_Image.UnlockBits(_ImageData);
  220. }
  221. /// <summary>  
  222.         /// 保存图形为TGA  
  223.         /// </summary>  
  224.         /// <returns></returns>  
  225. private byte[] SaveImageToTGA()
  226. {
  227. if (m_Image == null) return null;
  228. MemoryStream _ImageMemory = new MemoryStream();
  229. _ImageMemory.WriteByte(m_IDSize);
  230. _ImageMemory.WriteByte(m_ColorTableType);
  231. _ImageMemory.WriteByte(m_ImageType);
  232. _ImageMemory.Write(BitConverter.GetBytes(m_ColorTableIndex), 0, 2);
  233. _ImageMemory.Write(BitConverter.GetBytes(m_ColorTableCount), 0, 2);
  234. _ImageMemory.WriteByte(m_ColorTableSize);
  235. _ImageMemory.Write(BitConverter.GetBytes(m_ImageX), 0, 2);
  236. _ImageMemory.Write(BitConverter.GetBytes(m_ImageY), 0, 2);
  237. _ImageMemory.Write(BitConverter.GetBytes(m_ImageWidth), 0, 2);
  238. _ImageMemory.Write(BitConverter.GetBytes(m_ImageHeight), 0, 2);
  239. _ImageMemory.WriteByte(m_PixSize);
  240. _ImageMemory.WriteByte(m_Remark);
  241. int _ColorSize = 0;
  242. Bitmap _SaveBitmap = m_Image;
  243. switch (_SaveBitmap.PixelFormat)
  244. {
  245. case PixelFormat.Format24bppRgb:
  246. _ColorSize = 3;
  247. break;
  248. case PixelFormat.Format8bppIndexed:
  249. _ColorSize = 1;
  250. for (int i = 0; i != m_ColorTableCount; i++)
  251. {
  252. _ImageMemory.WriteByte(m_Image.Palette.Entries[i].B);
  253. _ImageMemory.WriteByte(m_Image.Palette.Entries[i].G);
  254. _ImageMemory.WriteByte(m_Image.Palette.Entries[i].R);
  255. }
  256. break;
  257. case PixelFormat.Format32bppArgb:
  258. _ColorSize = 4;
  259. break;
  260. default:
  261. _SaveBitmap = new Bitmap(m_Image.Width, m_Image.Height, PixelFormat.Format24bppRgb);
  262. System.Drawing.Graphics _Graphics = System.Drawing.Graphics.FromImage(_SaveBitmap);
  263. _Graphics.DrawImage(m_Image, new Rectangle(0, 0, _SaveBitmap.Width, _SaveBitmap.Height));
  264. _Graphics.Dispose();
  265. _ColorSize = 3;
  266. break;
  267. }
  268. BitmapData _ImageData = _SaveBitmap.LockBits(new Rectangle(0, 0, _SaveBitmap.Width, _SaveBitmap.Height), ImageLockMode.ReadWrite, _SaveBitmap.PixelFormat);
  269. byte[] _ValueBytes = new byte[_ImageData.Stride * _ImageData.Height];
  270. Marshal.Copy(_ImageData.Scan0, _ValueBytes, 0, _ValueBytes.Length);
  271. _SaveBitmap.UnlockBits(_ImageData);
  272. int _Index = 0;
  273. for (int i = 0; i != _ImageData.Height; i++)
  274. {
  275. _Index = _ImageData.Stride * i;
  276. _ImageMemory.Write(_ValueBytes, _Index, _ColorSize * _ImageData.Width);
  277. }
  278. return _ImageMemory.ToArray();
  279. }
  280. /// <summary>  
  281.         /// 保存图形到文件  
  282.         /// </summary>  
  283.         /// <param name="p_FileFullName"></param>  
  284. public void SaveImage(string p_FileFullName)
  285. {
  286. byte[] _ValueBytes = SaveImageToTGA();
  287. if (_ValueBytes != null) File.WriteAllBytes(p_FileFullName, _ValueBytes);
  288. }
  289. }