Image.cpp
上传用户:cxh8989
上传日期:2021-01-22
资源大小:2544k
文件大小:5k
源码类别:

射击游戏

开发平台:

Visual C++

  1. #include "main.h"
  2. #include "image.h"
  3. /** 载入位图文件 */
  4. tImage *LoadBMP(const char *strFileName)
  5. {
  6. AUX_RGBImageRec *pBitmap = NULL;
  7. FILE *pFile = NULL;
  8. if((pFile = fopen(strFileName, "rb")) == NULL) 
  9. {
  10. MessageBox(g_hWnd, "Unable to load BMP File!", "Error", MB_OK);
  11. return NULL;
  12. }
  13. pBitmap = auxDIBImageLoad(strFileName);
  14. tImage *pImage = (tImage *)malloc(sizeof(tImage));
  15. pImage->channels = 3;
  16. pImage->sizeX = pBitmap->sizeX;
  17. pImage->sizeY = pBitmap->sizeY;
  18. pImage->data  = pBitmap->data;
  19. free(pBitmap);
  20. return pImage;
  21. }
  22. /** 载入TGA文件 */
  23. tImage *LoadTGA(const char *strFileName)
  24. {
  25. tImage *pImageData = NULL;
  26. WORD width = 0, height = 0;
  27. byte length = 0;
  28. byte imageType = 0;
  29. byte bits = 0;
  30. FILE *pFile = NULL;
  31. int channels = 0;
  32. int stride = 0;
  33. int i = 0;
  34. if((pFile = fopen(strFileName, "rb")) == NULL) 
  35. {
  36. MessageBox(g_hWnd, "Unable to load TGA File!", "Error", MB_OK);
  37. return NULL;
  38. }
  39. pImageData = (tImage*)malloc(sizeof(tImage));
  40. fread(&length, sizeof(byte), 1, pFile);
  41. fseek(pFile,1,SEEK_CUR); 
  42. fread(&imageType, sizeof(byte), 1, pFile);
  43. fseek(pFile, 9, SEEK_CUR); 
  44. fread(&width,  sizeof(WORD), 1, pFile);
  45. fread(&height, sizeof(WORD), 1, pFile);
  46. fread(&bits,   sizeof(byte), 1, pFile);
  47. fseek(pFile, length + 1, SEEK_CUR); 
  48. if(imageType != TGA_RLE)
  49. {
  50. if(bits == 24 || bits == 32)
  51. {
  52. channels = bits / 8;
  53. stride = channels * width;
  54. pImageData->data = ((unsigned char*)malloc(sizeof(unsigned char)*stride*height));
  55. for(int y = 0; y < height; y++)
  56. {
  57. unsigned char *pLine = &(pImageData->data[stride * y]);
  58. fread(pLine, stride, 1, pFile);
  59. for(i = 0; i < stride; i += channels)
  60. {
  61. int temp     = pLine[i];
  62. pLine[i]     = pLine[i + 2];
  63. pLine[i + 2] = temp;
  64. }
  65. }
  66. }
  67. else if(bits == 16)
  68. {
  69. unsigned short pixels = 0;
  70. int r=0, g=0, b=0;
  71. channels = 3;
  72. stride = channels * width;
  73. pImageData->data = ((unsigned char*)malloc(sizeof(unsigned char)*stride*height));
  74. for(int i = 0; i < width*height; i++)
  75. {
  76. fread(&pixels, sizeof(unsigned short), 1, pFile);
  77. b = (pixels & 0x1f) << 3;
  78. g = ((pixels >> 5) & 0x1f) << 3;
  79. r = ((pixels >> 10) & 0x1f) << 3;
  80. pImageData->data[i * 3 + 0] = r;
  81. pImageData->data[i * 3 + 1] = g;
  82. pImageData->data[i * 3 + 2] = b;
  83. }
  84. }
  85. else
  86. return NULL;
  87. }
  88. else
  89. {
  90. byte rleID = 0;
  91. int colorsRead = 0;
  92. channels = bits / 8;
  93. stride = channels * width;
  94. pImageData->data = ((unsigned char*)malloc(sizeof(unsigned char)*stride*height));
  95. byte *pColors = ((byte*)malloc(sizeof(byte)*channels));
  96. while(i < width*height)
  97. {
  98. fread(&rleID, sizeof(byte), 1, pFile);
  99. if(rleID < 128)
  100. {
  101. rleID++;
  102. while(rleID)
  103. {
  104. fread(pColors, sizeof(byte) * channels, 1, pFile);
  105. pImageData->data[colorsRead + 0] = pColors[2];
  106. pImageData->data[colorsRead + 1] = pColors[1];
  107. pImageData->data[colorsRead + 2] = pColors[0];
  108. if(bits == 32)
  109. pImageData->data[colorsRead + 3] = pColors[3];
  110. i++;
  111. rleID--;
  112. colorsRead += channels;
  113. }
  114. }
  115. else
  116. {
  117. rleID -= 127;
  118. fread(pColors, sizeof(byte) * channels, 1, pFile);
  119. while(rleID)
  120. {
  121. pImageData->data[colorsRead + 0] = pColors[2];
  122. pImageData->data[colorsRead + 1] = pColors[1];
  123. pImageData->data[colorsRead + 2] = pColors[0];
  124. if(bits == 32)
  125. pImageData->data[colorsRead + 3] = pColors[3];
  126. i++;
  127. rleID--;
  128. colorsRead += channels;
  129. }
  130. }
  131. }
  132. }
  133. fclose(pFile);
  134. pImageData->channels = channels;
  135. pImageData->sizeX    = width;
  136. pImageData->sizeY    = height;
  137. return pImageData;
  138. }
  139. /** 解码JPG */
  140. void DecodeJPG(jpeg_decompress_struct* cinfo, tImage *pImageData)
  141. {
  142. jpeg_read_header(cinfo, TRUE);
  143. jpeg_start_decompress(cinfo);
  144. pImageData->channels = cinfo->num_components;
  145. pImageData->sizeX    = cinfo->image_width;
  146. pImageData->sizeY    = cinfo->image_height;
  147. int rowSpan = cinfo->image_width * cinfo->num_components;
  148. pImageData->data = ((unsigned char*)malloc(sizeof(unsigned char)*rowSpan*pImageData->sizeY));
  149. unsigned char** rowPtr = new unsigned char*[pImageData->sizeY];
  150. for (int i = 0; i < pImageData->sizeY; i++)
  151. rowPtr[i] = &(pImageData->data[i * rowSpan]);
  152. int rowsRead = 0;
  153. while (cinfo->output_scanline < cinfo->output_height) 
  154. {
  155. rowsRead += jpeg_read_scanlines(cinfo, 
  156. &rowPtr[rowsRead], cinfo->output_height - rowsRead);
  157. }
  158. delete [] rowPtr;
  159. jpeg_finish_decompress(cinfo);
  160. }
  161. /** 载入JPG文件 */
  162. tImage *LoadJPG(const char *strFileName)
  163. {
  164. struct jpeg_decompress_struct cinfo;
  165. tImage *pImageData = NULL;
  166. FILE *pFile;
  167. if((pFile = fopen(strFileName, "rb")) == NULL) 
  168. {
  169. MessageBox(g_hWnd, "Unable to load JPG File!", "Error", MB_OK);
  170. return NULL;
  171. }
  172. jpeg_error_mgr jerr;
  173. cinfo.err = jpeg_std_error(&jerr);
  174. jpeg_create_decompress(&cinfo);
  175. jpeg_stdio_src(&cinfo, pFile);
  176. pImageData = (tImage*)malloc(sizeof(tImage));
  177. DecodeJPG(&cinfo, pImageData);
  178. jpeg_destroy_decompress(&cinfo);
  179. fclose(pFile);
  180. return pImageData;
  181. }