OpenFiles.cpp
上传用户:szklck
上传日期:2007-01-22
资源大小:925k
文件大小:4k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "OpenFiles.h"
  3. #include <stdio.h>
  4. BYTE * OpenImageFile(CString szFilePathName, int *width, int *height, int nType)
  5. {
  6. BYTE * pImageData = NULL;
  7.   switch(nType)
  8. {
  9.   case T_bmp:
  10.   pImageData = OpenBMP(szFilePathName,width,height);
  11. break;
  12.     case T_yuv:
  13.   AfxMessageBox("对YUV序列编码");
  14. break;
  15. case T_raw:
  16.   pImageData = OpenRAW(szFilePathName,width,height);
  17.   break;
  18.   case T_sif: 
  19.   pImageData = OpenSIF(szFilePathName,width,height);
  20.   break;
  21. default:
  22.   AfxMessageBox("无法打开的文件!");
  23.   break;
  24.   }
  25.   if(pImageData)
  26.   return pImageData;
  27.   else 
  28.   return NULL;
  29. }
  30. CString GetNextFileName(CString filename,BOOL flag)
  31. {
  32. CString tempName = filename;
  33. CString tempStr;
  34. int ret = filename.Find(".",0);
  35. if(ret>0)
  36. tempStr = filename.Mid(ret-3,3);
  37. else
  38. tempStr = filename.Right(3);
  39. int tempInt = atoi(tempStr);
  40. //flag 逻辑值为真,文件名递增;否则文件名递减
  41. if(flag)
  42. tempInt++;
  43. else
  44. tempInt--;
  45. char temp[3];
  46. if(tempInt<0)
  47. {
  48. AfxMessageBox("The file name is WRONG !");
  49. return tempName;
  50. }
  51. else if(tempInt<10)
  52. {
  53. temp[0] = '0';
  54. temp[1] = '0';
  55. itoa(tempInt,&temp[2],10);
  56. }
  57. else if(tempInt<100)
  58. {
  59. temp[0] = '0';
  60. itoa(tempInt,&temp[1],10);
  61. }
  62. else
  63. itoa(tempInt,temp,10);
  64. tempName.Replace(tempStr,temp);
  65. return tempName;
  66. }
  67. BYTE * OpenSIF(CString fileName, int *width, int *height)
  68. {
  69. BYTE * pData;
  70. if(fileName=="")
  71. return FALSE;
  72. *width = 352;//578;
  73. *height = 288;//385;
  74.   long lFileSize = (*width) * (*height);
  75. pData = (BYTE*)new char[lFileSize*3/2];
  76. if(!pData)
  77. return NULL;
  78. CFile file;
  79. if((file.Open(fileName,CFile::modeRead|CFile::shareDenyNone))==NULL)
  80. {
  81. AfxMessageBox("Can not open the file");
  82. return NULL;
  83. }
  84.   file.ReadHuge(pData,lFileSize);
  85. file.Close();
  86. memset(pData+lFileSize,128,lFileSize/2);
  87. return pData;
  88. free(pData);
  89. }
  90. BYTE * OpenBMP(CString fileName, int *width, int *height)
  91. {
  92. BYTE * pData, * pData1;
  93. if(fileName=="")
  94. return NULL;
  95. BITMAPFILEHEADER bmpFileHead;
  96. BITMAPINFOHEADER bmpInfo;
  97. CFile file;
  98. if((file.Open(fileName,CFile::modeRead|CFile::shareDenyNone))==NULL)
  99. {
  100. AfxMessageBox("Can not open the file");
  101. return NULL;
  102. }
  103.  
  104. file.SeekToBegin();
  105. file.Read(&bmpFileHead,sizeof(BITMAPFILEHEADER));
  106. file.Read(&bmpInfo,sizeof(BITMAPINFOHEADER));
  107. DWORD LineBytes=(DWORD)WIDTHBYTES(bmpInfo.biWidth*bmpInfo.biBitCount);
  108.     DWORD ImageSize =(DWORD)LineBytes*bmpInfo.biHeight;
  109.     int NumColors;
  110. if(bmpInfo.biClrUsed!=0)
  111.        NumColors=(DWORD)bmpInfo.biClrUsed;
  112. else
  113. switch(bmpInfo.biBitCount){
  114. case 1:
  115. NumColors=2;
  116. break;
  117. case 4:
  118. NumColors=16;
  119. break;
  120. case 8:
  121. NumColors=256;
  122. break;
  123. case 24:
  124. NumColors=0;
  125. break;
  126. default:
  127. AfxMessageBox("Invalid color numbers!");
  128. file.Close();
  129. return NULL;
  130. }
  131. if(bmpFileHead.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
  132. +sizeof(BITMAPINFOHEADER)))
  133. {
  134.      AfxMessageBox("offBits 和实际头长度不符");
  135. // ,"Error Message" ,MB_OK|MB_ICONEXCLAMATION);
  136. return NULL; 
  137. }
  138. pData = (BYTE*)new char[ImageSize];
  139. pData1 = (BYTE*)new char[ImageSize*3/2];
  140. file.Seek(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),SEEK_SET);
  141.     file.Read(pData,ImageSize);
  142. *width = bmpInfo.biWidth;
  143. *height = bmpInfo.biHeight;
  144. file.Close();
  145. int h,w;
  146. h=*height;
  147. w=*width;
  148. for(int i=0;i<h;i++)
  149. {
  150. for(int j=0;j<w;j++)
  151. {
  152. BYTE * temp;
  153. temp=pData+(h-1-i)*w+j;
  154. pData1[i*w+j]=*temp;
  155. }
  156. }
  157. delete pData;
  158. memset(pData1+ImageSize,128,ImageSize/2);
  159.   return pData1;
  160. free(pData1);
  161. }
  162. BYTE * OpenRAW(CString fileName, int *width, int *height)
  163. {
  164. BYTE * pData;
  165. if(fileName=="")
  166. return FALSE;
  167. *width = 352;//512;
  168. *height = 288;//240;512;
  169.  
  170.   long lFileSize = (*width) * (*height);
  171. pData = (BYTE*)new char[lFileSize*3/2];
  172. CFile file;
  173. if((file.Open(fileName,CFile::modeRead|CFile::shareDenyNone))==NULL)
  174. {
  175. AfxMessageBox("Can not open the file");
  176. return NULL;
  177. }
  178.    
  179. if(!pData)
  180. return NULL;
  181.   file.ReadHuge(pData,lFileSize);
  182. file.Close();
  183. memset(pData+lFileSize,128,lFileSize/2);
  184. return pData;
  185. free(pData);
  186. }