Advertisement
xiahanlu

坑爹的图片转数组小程序

Jun 7th, 2018
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.16 KB | None | 0 0
  1. // 坑爹的图片转数组小程序.
  2. // 资源头
  3. #  if RESOURCE_HPP
  4.   //{{NO_DEPENDENCIES}}
  5.   // Microsoft Visual C++ 生成的包含文件。
  6.   // 供 ImgToArray.rc 使用
  7.   //
  8.   #define IDBT_LOAD                       3
  9.   #define IDD_MAIN                        101
  10.   #define IDET_IMG_PATH                   1001
  11.   #define IDET_IMG_WIDTH                  1002
  12.   #define IDET_IMG_HEIGHT                 1003
  13.   #define IDET_NEWPITCH                   1004
  14.   #define IDRD_D0RD8GD16B                 1005
  15.   #define IDRD_D0BD8GD16R                 1006
  16.   #define IDBT_SAVE                       1007
  17.   #define IDC_CHECK1                      1008
  18.   #define IDCK_BIN                        1008
  19.  
  20.   // Next default values for new objects
  21.   //
  22.   #ifdef APSTUDIO_INVOKED
  23.   #ifndef APSTUDIO_READONLY_SYMBOLS
  24.   #define _APS_NEXT_RESOURCE_VALUE        102
  25.   #define _APS_NEXT_COMMAND_VALUE         40001
  26.   #define _APS_NEXT_CONTROL_VALUE         1009
  27.   #define _APS_NEXT_SYMED_VALUE           101
  28.   #endif
  29.   #endif
  30. #  endif
  31. // 资源脚本
  32. # if RESOURCE_SCRIPT
  33. // Microsoft Visual C++ generated resource script.
  34. //
  35. #include "resource.h"
  36.  
  37. #define APSTUDIO_READONLY_SYMBOLS
  38. /////////////////////////////////////////////////////////////////////////////
  39. //
  40. // Generated from the TEXTINCLUDE 2 resource.
  41. //
  42. #include "afxres.h"
  43.  
  44. /////////////////////////////////////////////////////////////////////////////
  45. #undef APSTUDIO_READONLY_SYMBOLS
  46.  
  47. /////////////////////////////////////////////////////////////////////////////
  48. // 中文(简体,中国) resources
  49.  
  50. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
  51. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
  52.  
  53. #ifdef APSTUDIO_INVOKED
  54. /////////////////////////////////////////////////////////////////////////////
  55. //
  56. // TEXTINCLUDE
  57. //
  58.  
  59. 1 TEXTINCLUDE
  60. BEGIN
  61.     "resource.h\0"
  62. END
  63.  
  64. 2 TEXTINCLUDE
  65. BEGIN
  66.     "#include ""afxres.h""\r\n"
  67.     "\0"
  68. END
  69.  
  70. 3 TEXTINCLUDE
  71. BEGIN
  72.     "\r\n"
  73.     "\0"
  74. END
  75.  
  76. #endif    // APSTUDIO_INVOKED
  77.  
  78.  
  79. /////////////////////////////////////////////////////////////////////////////
  80. //
  81. // Dialog
  82. //
  83.  
  84. IDD_MAIN DIALOGEX 0, 0, 185, 103
  85. STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
  86. EXSTYLE WS_EX_PALETTEWINDOW
  87. CAPTION "ImgToRGB32Array"
  88. FONT 8, "MS Shell Dlg", 400, 0, 0x1
  89. BEGIN
  90.     DEFPUSHBUTTON   "Save...",IDBT_SAVE,117,50,50,14
  91.     PUSHBUTTON      "Cancel",IDCANCEL,117,67,50,14
  92.     LTEXT           "ImagePath",IDC_STATIC,17,14,41,9
  93.     EDITTEXT        IDET_IMG_PATH,65,15,101,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
  94.     GROUPBOX        "Infos",IDC_STATIC,7,3,172,95
  95.     LTEXT           "ImageWidth",IDC_STATIC,17,31,41,10
  96.     EDITTEXT        IDET_IMG_WIDTH,65,31,43,12,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_DISABLED | NOT WS_BORDER,WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
  97.     LTEXT           "ImageHeight",IDC_STATIC,17,51,45,11
  98.     EDITTEXT        IDET_IMG_HEIGHT,65,50,43,12,ES_AUTOHSCROLL | WS_DISABLED,WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
  99.     LTEXT           "NewPitch",IDC_STATIC,17,68,37,10
  100.     EDITTEXT        IDET_NEWPITCH,65,66,44,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
  101.     DEFPUSHBUTTON   "Load...",IDBT_LOAD,117,30,50,14
  102.     CONTROL         "D0RD16B",IDRD_D0RD8GD16B,"Button",BS_AUTORADIOBUTTON,15,82,43,8
  103.     CONTROL         "D0BD16R",IDRD_D0BD8GD16R,"Button",BS_AUTORADIOBUTTON,63,81,43,8
  104.     CONTROL         "bin",IDCK_BIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,113,83,38,10
  105. END
  106.  
  107.  
  108. /////////////////////////////////////////////////////////////////////////////
  109. //
  110. // DESIGNINFO
  111. //
  112.  
  113. #ifdef APSTUDIO_INVOKED
  114. GUIDELINES DESIGNINFO
  115. BEGIN
  116.     IDD_MAIN, DIALOG
  117.     BEGIN
  118.     END
  119. END
  120. #endif    // APSTUDIO_INVOKED
  121.  
  122. #endif    // 中文(简体,中国) resources
  123. /////////////////////////////////////////////////////////////////////////////
  124.  
  125.  
  126.  
  127. #ifndef APSTUDIO_INVOKED
  128. /////////////////////////////////////////////////////////////////////////////
  129. //
  130. // Generated from the TEXTINCLUDE 3 resource.
  131. //
  132.  
  133.  
  134. /////////////////////////////////////////////////////////////////////////////
  135. #endif    // not APSTUDIO_INVOKED
  136.  
  137. # endif
  138.  
  139.  
  140. // ====================================================================================
  141.  
  142. # include <windows.h>
  143. # include <d3d9.h>
  144. # include <d3dx9.h>
  145. # include <assert.h>
  146. # include <tchar.h>
  147. # include <stdio.h>
  148. # include "resource.h"
  149.  
  150. #pragma comment(linker,"\"/manifestdependency:type='win32' \
  151. name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  152. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
  153.  
  154. namespace GlobalObjects {
  155.   static IDirect3D9 *sm_Direct3D9_root = NULL;
  156.   static IDirect3DDevice9  *sm_Direct3D9_devic = NULL;  
  157.   static IDirect3DTexture9 *sm_Surface9 = NULL;
  158.   static int SettingsPitch = 0;
  159. };
  160.  
  161. static void initGlobal (HWND hWindow)  {
  162.   D3DPRESENT_PARAMETERS d3dpp;
  163.   GlobalObjects :: sm_Direct3D9_root = Direct3DCreate9 (D3D_SDK_VERSION);
  164.   assert (GlobalObjects :: sm_Direct3D9_root != NULL);
  165.  
  166.   ZeroMemory (& d3dpp, sizeof (d3dpp));
  167.  
  168.   d3dpp.BackBufferFormat      = D3DFMT_X8R8G8B8;
  169.   d3dpp.SwapEffect            = D3DSWAPEFFECT_DISCARD;
  170.   d3dpp.Flags                 = 0;
  171.   d3dpp.hDeviceWindow         = hWindow;
  172.   d3dpp.Windowed              = TRUE;
  173.   d3dpp.PresentationInterval  = 0;
  174.   d3dpp.BackBufferHeight = 128;
  175.   d3dpp.BackBufferWidth = 128;
  176.  
  177.   HRESULT sig =  GlobalObjects :: sm_Direct3D9_root->CreateDevice (0,
  178.                       D3DDEVTYPE_HAL,
  179.                           hWindow,
  180.                             D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, & GlobalObjects :: sm_Direct3D9_devic);
  181.   assert (SUCCEEDED (sig));
  182. }
  183. static void uninitGlobal (void) {
  184.   if ( GlobalObjects::sm_Surface9 != NULL)  {
  185.     GlobalObjects::sm_Surface9->Release ();
  186.     GlobalObjects::sm_Surface9 = NULL;
  187.   }
  188.   if ( GlobalObjects::sm_Direct3D9_devic != NULL)  {
  189.     GlobalObjects::sm_Direct3D9_devic->Release ();
  190.     GlobalObjects::sm_Direct3D9_devic = NULL;
  191.   }
  192.   if ( GlobalObjects::sm_Direct3D9_root != NULL)  {
  193.     GlobalObjects::sm_Direct3D9_root->Release ();
  194.     GlobalObjects::sm_Direct3D9_root = NULL;
  195.   }
  196. }
  197.  
  198. INT_PTR CALLBACK DlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
  199.   switch (message)  {
  200.   case  WM_INITDIALOG:
  201.     initGlobal (hDlg);
  202.     EnableWindow ( GetDlgItem (hDlg, IDBT_SAVE), FALSE);
  203.     SendMessage (GetDlgItem (hDlg, IDRD_D0BD8GD16R), BM_SETCHECK, BST_CHECKED, 0);
  204.     break;
  205.   case  WM_COMMAND:
  206.     switch(LOWORD(wParam)) {
  207.     case  IDBT_SAVE:
  208.       {
  209.         int n = GetDlgItemInt (hDlg, IDET_NEWPITCH, NULL, 0);
  210.         int w = GetDlgItemInt (hDlg, IDET_IMG_WIDTH, NULL, 0);
  211.         int h = GetDlgItemInt (hDlg, IDET_IMG_HEIGHT, NULL, 0);
  212.         if (w*4 > n)  
  213.         {
  214.           MessageBox (NULL, _T ("Pitch too small"), _T ("IMGTOARRAY"), MB_ICONERROR);
  215.           return (INT_PTR) FALSE;
  216.         }
  217.           OPENFILENAME opfn;
  218.           TCHAR strFilename[MAX_PATH];
  219.           ZeroMemory(&opfn, sizeof(OPENFILENAME));
  220.           opfn.lStructSize = sizeof(OPENFILENAME);//结构体大小
  221.           opfn.nFilterIndex = 1;
  222.           opfn.lpstrFile = strFilename;
  223.           opfn.lpstrFile[0] = '\0';
  224.           opfn.nMaxFile = sizeof(strFilename);
  225.           opfn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
  226.           if(GetSaveFileName(&opfn))
  227.           {
  228.           // 拷贝纹理为数组.
  229.           BOOL D0isBlue = FALSE;
  230.           BOOL doBin = FALSE;
  231.           if  ( SendMessage (GetDlgItem (hDlg, IDRD_D0BD8GD16R), BM_GETCHECK, 0, 0) == BST_CHECKED)  
  232.             D0isBlue = TRUE;
  233.           if  ( SendMessage (GetDlgItem (hDlg, IDCK_BIN), BM_GETCHECK, 0, 0) == BST_CHECKED)  
  234.             doBin = TRUE;
  235.          
  236.           //  // Width:nn Height:nn Pitch:nn Format :
  237.           //   uint8_t nn = {  0xnn, 0xnn, ..};
  238.           //  
  239.           FILE *fd_ = _tfopen (strFilename, _T ("wb"));
  240.           assert (fd_ != NULL);
  241.           if (doBin == FALSE)
  242.           _ftprintf (fd_, _T ("// Width:%d Height:%d Pitch:%d Format:%s\nuint8_t image = { "),
  243.              w, h, n, D0isBlue ? _T ("D0BD8GD16R") : _T ("D0GD8GD16B"));
  244.          
  245.           D3DLOCKED_RECT vdLock;
  246.  
  247.           GlobalObjects ::sm_Surface9->LockRect (0, & vdLock, NULL, D3DLOCK_DISCARD);
  248.  
  249.           DWORD *pm = (DWORD *)vdLock.pBits;
  250.           DWORD pn = vdLock.Pitch >> 2;
  251.           DWORD pnn = w * 4;
  252.           union {
  253.             BYTE min[4];
  254.             DWORD big;
  255.           } dumBlock;
  256.                        
  257.           if (doBin == FALSE)  {
  258.             for (int y = 0; y != h; y++)  {
  259.               for (int x= 0; x != n; x++)   {
  260.                 if (x >= pnn)    {
  261.                   _ftprintf (fd_, _T ("0x00"));
  262.                 } else   {
  263.                   // pitch内的像素.
  264.                   int b = x/4;
  265.                   int m = x &3;
  266.                   dumBlock.big = pm [b+y*vdLock.Pitch/4];
  267.                   if  (D0isBlue == FALSE)   {
  268.                     BYTE t = dumBlock.min[0];
  269.                     dumBlock.min[0] = dumBlock.min[2];
  270.                     dumBlock.min[2] = t;
  271.                   }
  272.                   _ftprintf (fd_, _T ("0x%02x"), dumBlock.min[m]);
  273.                 }
  274.                 if ( !  (x == (n - 1) && (y == h - 1)))  {
  275.                   _ftprintf (fd_, _T (","));
  276.                 }
  277.               }
  278.             }
  279.             _ftprintf (fd_, _T ("};"));
  280.           } else  {
  281.             BYTE c = 0;
  282.             for (int y = 0; y != h; y++)  {
  283.               for (int x= 0; x != n; x++)   {
  284.                 if (x >= pnn)    {
  285.                   c = 0;
  286.                   fwrite (& c, 1, 1, fd_);
  287.                 } else   {
  288.                   // pitch内的像素.
  289.                   int b = x/4;
  290.                   int m = x &3;
  291.                   dumBlock.big = pm [b+y*vdLock.Pitch/4];
  292.                   if  (D0isBlue == FALSE)   {
  293.                     BYTE t = dumBlock.min[0];
  294.                     dumBlock.min[0] = dumBlock.min[2];
  295.                     dumBlock.min[2] = t;
  296.                   }
  297.                   fwrite (& dumBlock.min[m], 1, 1, fd_);
  298.                 }
  299.               }
  300.             }
  301.           }
  302.           GlobalObjects ::sm_Surface9->UnlockRect (0);
  303.           fclose (fd_);
  304.           }
  305.       }
  306.       break;
  307.     case IDBT_LOAD: // 加载图片.
  308.       {
  309.           OPENFILENAME opfn;
  310.           TCHAR strFilename[MAX_PATH];
  311.           ZeroMemory(&opfn, sizeof(OPENFILENAME));
  312.           opfn.lStructSize = sizeof(OPENFILENAME);//结构体大小
  313.           opfn.nFilterIndex = 1;
  314.           opfn.lpstrFile = strFilename;
  315.           opfn.lpstrFile[0] = '\0';
  316.           opfn.nMaxFile = sizeof(strFilename);
  317.           opfn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
  318.           if(GetOpenFileName(&opfn))
  319.           {
  320.           // 尝试读取纹理
  321.           D3DXIMAGE_INFO infos;
  322.           if (GlobalObjects ::sm_Surface9 != NULL)  {
  323.             GlobalObjects ::sm_Surface9->Release ();
  324.             GlobalObjects ::sm_Surface9 = NULL;
  325.           }
  326.           if (FAILED ( D3DXCreateTextureFromFileEx (GlobalObjects ::sm_Direct3D9_devic, strFilename,
  327.             D3DX_DEFAULT_NONPOW2,
  328.             D3DX_DEFAULT_NONPOW2,
  329.             D3DX_FROM_FILE,
  330.             0,
  331.             D3DFMT_UNKNOWN,
  332.             D3DPOOL_MANAGED,
  333.             D3DX_DEFAULT, // D3DX_DEFAULT
  334.             D3DX_DEFAULT, // D3DX_DEFAULT
  335.             0, //D3DCOLOR_XRGB (0, 0, 0),  
  336.             & infos, NULL, & GlobalObjects ::sm_Surface9)) )
  337.           {
  338.             MessageBox (NULL, _T ("D3DXCreateTextureFromFileEx Failed"), _T ("IMGTOARRAY"), MB_ICONERROR);
  339.           }
  340.           else
  341.           {
  342.             SetDlgItemInt (hDlg, IDET_IMG_WIDTH, infos.Width, FALSE);
  343.             SetDlgItemInt (hDlg, IDET_IMG_HEIGHT, infos.Height, FALSE);
  344.             SetWindowText (  GetDlgItem (hDlg, IDET_IMG_PATH), strFilename);
  345.             EnableWindow ( GetDlgItem (hDlg, IDBT_SAVE), TRUE);
  346.           }
  347.           }
  348.       }
  349.       break;
  350.     case IDOK:
  351.         case IDCANCEL:
  352.             EndDialog (hDlg, IDCANCEL);
  353.             break;
  354.       }
  355.   }
  356.  
  357.   return (INT_PTR) FALSE;
  358. }
  359.  
  360. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  361.                     PSTR szCmdLine, int iCmdShow)
  362. {
  363.   DialogBox (hInstance, MAKEINTRESOURCE (IDD_MAIN), NULL, DlgProc);
  364.   uninitGlobal ();
  365.   return 0;
  366. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement