convert.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:30k
源码类别:

打印编程

开发平台:

Visual C++

  1. #include "convert.h"
  2. #define FAX_WIDTH  1728
  3. #define FAX_HEIGTH 2292
  4. static unsigned char bmpHeader[62]; 
  5. static unsigned char bmpHeader1[62] =
  6. {        'B',  'M', 0xBE, 0x48, 0x28, 0x00, 0x00, 0x00,
  7. 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
  8. 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, 0x9D, 0x00,
  9. 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
  10. 0x00, 0x00, 0xBC, 0x04, 0x03, 0x00, 0x00, 0x00,
  11. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  12. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  13. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  14. };
  15. static unsigned char bmpHeader2[62] =
  16. {        'B',  'M', 0x3E, 0xF9, 0x15, 0x00, 0x00, 0x00,
  17. 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
  18. 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, 0x9D, 0x00,
  19. 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
  20. 0x00, 0x00, 0xBC, 0x04, 0x03, 0x00, 0x00, 0x00,
  21. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  22. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  23. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  24. };
  25. static BMPINFO bmpinfo;
  26. static long oldNo = 1,PageNo = 1;
  27. static TCHAR PageNameBmp[1024] = _T("");
  28. static int i_count = 0;
  29. static int i_dpi = 0;
  30. static double i_hegint = 0;
  31. static int i_h = 0;
  32. static int i_width = 0;
  33. static int i_size = 0;
  34. static int i_row = 0;
  35. static int i_row_old = -1;
  36. static bool b_row = false;
  37. const char* pjl = "@PJL";
  38. WCHAR marker[] = L"popfax";
  39. BOOL is_pjl( LPCTSTR fileName )
  40. {
  41. BOOL ret = FALSE;
  42. HANDLE hFile = NULL;
  43. char str[10] = "";
  44. DWORD nr = 0;
  45. if( (NULL != fileName)&&(0 != _tcslen(fileName))&&(-1 != _taccess( fileName, 0)) )
  46. {
  47. if( INVALID_HANDLE_VALUE != ( hFile = CreateFile( fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ) )
  48. {
  49. ReadFile( hFile, str, (DWORD)strlen(pjl), &nr, 0 );
  50. if( nr == strlen(pjl ) )
  51. ret = ( 0 == _stricmp( str, pjl ) );
  52. CloseHandle( hFile );
  53. }
  54. }
  55. return ret;
  56. }
  57. BOOL is_marked( LPCTSTR fileName )
  58. {
  59. BOOL ret = FALSE;
  60. HANDLE hFile = NULL;
  61. WCHAR str[10] = L"";
  62. DWORD nr = 0;
  63. if( (NULL != fileName)&&(0 != _tcslen(fileName))&&(-1 != _taccess( fileName, 0)) )
  64. {
  65. if( INVALID_HANDLE_VALUE != ( hFile = CreateFile( fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ) )
  66. {
  67. ReadFile( hFile, str, (DWORD)_tcslen(marker)*sizeof(marker[0]), &nr, 0 );
  68. ret = ( 0 == wcsicmp( marker, str ) );
  69. CloseHandle( hFile );
  70. }
  71. }
  72. return ret;
  73. }
  74. int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
  75. {
  76.    UINT  num = 0;          // number of image encoders
  77.    UINT  size = 0;         // size of the image encoder array in bytes
  78.    ImageCodecInfo* pImageCodecInfo = NULL;
  79.    GetImageEncodersSize(&num, &size);
  80.    if(size == 0)
  81.       return -1;  // Failure
  82.    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  83.    if(pImageCodecInfo == NULL)
  84.       return -1;  // Failure
  85.    GetImageEncoders(num, size, pImageCodecInfo);
  86.    for(UINT j = 0; j < num; ++j)
  87.    {
  88.       if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  89.       {
  90.          *pClsid = pImageCodecInfo[j].Clsid;
  91.          free(pImageCodecInfo);
  92.          return j;  // Success
  93.       }    
  94.    }
  95.    free(pImageCodecInfo);
  96.    return -1;  // Failure
  97. }
  98. BOOL is_need_to_resize( CxImage* inImg )
  99. {
  100. BOOL ret = FALSE;
  101. RGBQUAD pi = {0};
  102. for( DWORD xx = 0; xx < inImg->GetWidth(); xx++ )
  103. {
  104. for( DWORD yy = 0; yy < min( inImg->GetHeight()-1, 5 ); yy++ )
  105. {
  106. pi = inImg->GetPixelColor( xx, yy );
  107. if( pi.rgbBlue == 0 )
  108. {
  109. ret = TRUE;
  110. break;
  111. }
  112. }
  113. for( DWORD yy = inImg->GetHeight()-1; yy > (inImg->GetHeight() - 5); yy-- )
  114. {
  115. pi = inImg->GetPixelColor( xx, yy );
  116. if( pi.rgbBlue == 0 )
  117. {
  118. ret = TRUE;
  119. break;
  120. }
  121. }
  122. }
  123. for( DWORD yy = 0; yy < inImg->GetHeight(); yy++ )
  124. {
  125. for( DWORD xx = 0; xx < min( inImg->GetWidth()-1, 5 ); xx++ )
  126. {
  127. pi = inImg->GetPixelColor( xx, yy );
  128. if( pi.rgbBlue == 0 )
  129. {
  130. ret = TRUE;
  131. break;
  132. }
  133. }
  134. for( DWORD xx = inImg->GetWidth()-1; xx > (inImg->GetWidth() - 5); xx-- )
  135. {
  136. pi = inImg->GetPixelColor( xx, yy );
  137. if( pi.rgbBlue == 0 )
  138. {
  139. ret = TRUE;
  140. break;
  141. }
  142. }
  143. }
  144. return ret;
  145. }
  146. BOOL create_tiff( LPADDITIONALCONFIG aac, DWORD index, LPCTSTR fileName, DWORD pages )
  147. {
  148. BOOL ret = FALSE;
  149. Bitmap *bmp = new Bitmap( fileName );
  150. Bitmap *bmpClone = NULL;
  151. WCHAR bmpNames[LONG_PATH] = L"";
  152. TCHAR pageNameBmp[LONG_PATH] = _T("");
  153. TCHAR pageNameBmpMn[LONG_PATH] = _T("");
  154. std::wstring  names;
  155. STARTUPINFO si;
  156. PROCESS_INFORMATION pi;
  157. RGBQUAD whiteColor = { 255, 255, 255, 0 };
  158. //BOOL doResize = FALSE;
  159. ZeroMemory( &si, sizeof(si) );
  160. si.cb = sizeof(si);
  161. ZeroMemory( &pi, sizeof(pi) );
  162. if( NULL != bmp )
  163. {
  164. CLSID bmpClsid;
  165. GetEncoderClsid(L"image/bmp", &bmpClsid);
  166. for( DWORD i = 0; i < pages; i++ )
  167. {
  168. if( NULL != (bmpClone = bmp->Clone( 0, i*(bmp->GetHeight()/pages), bmp->GetWidth(), (bmp->GetHeight()/pages), bmp->GetPixelFormat()) ) )
  169. {
  170. swprintf_s( bmpNames, ARRAYSIZE(bmpNames), L"%s_%d", fileName, i+1);
  171. bmpClone->Save( bmpNames, &bmpClsid);
  172. delete bmpClone;
  173. CxImage* inImg = new CxImage( bmpNames, CXIMAGE_FORMAT_BMP );
  174. if( NULL != inImg )
  175. {
  176. if( aac->dithering )
  177. inImg->Dither( 0 );
  178. else
  179. inImg->Threshold( 123 );
  180. _stprintf_s( pageNameBmp, ARRAYSIZE(pageNameBmp), _T("%s_dither.bmp"), bmpNames );
  181. if( inImg->GetHeight() < inImg->GetWidth() )//this is landscape
  182. inImg->Rotate( 90 );
  183. if( is_need_to_resize( inImg ) )//漕徉忤