OSDN Git Service

rename var v to refvs.
[tdcgexplorer/tso2mqo.git] / PSDFile.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Drawing;\r
4 using System.Drawing.Imaging;\r
5 using System.IO;\r
6 using System.Text;\r
7 using System.Runtime.InteropServices;\r
8 \r
9 namespace Tso2MqoGui\r
10 {\r
11     using DWORD = UInt32;\r
12     using LONG  = Int32;\r
13     using WORD  = UInt16;\r
14 \r
15     public struct BITMAPINFOHEADER\r
16     {\r
17         public DWORD  biSize; \r
18         public LONG   biWidth; \r
19         public LONG   biHeight; \r
20         public WORD   biPlanes; \r
21         public WORD   biBitCount; \r
22         public DWORD  biCompression; \r
23         public DWORD  biSizeImage; \r
24         public LONG   biXPelsPerMeter; \r
25         public LONG   biYPelsPerMeter; \r
26         public DWORD  biClrUsed; \r
27         public DWORD  biClrImportant; \r
28     };\r
29 \r
30     public unsafe class PSDFile\r
31     {\r
32         internal Image  image;\r
33 \r
34         public PSDFile(string file)\r
35         {\r
36             image   = LoadImage(file);\r
37         }\r
38 \r
39         public static Bitmap LoadImage(string file)\r
40         {\r
41             FileStream  fs  = File.OpenRead(file);\r
42             byte[]      buf = new byte[fs.Length];\r
43             fs.Read(buf, 0, buf.Length);\r
44             \r
45             IntPtr  pHBInfo = IntPtr.Zero;\r
46             IntPtr  pHBm    = IntPtr.Zero;\r
47             Bitmap  bmp     = null;\r
48 \r
49             fixed(byte* p= &buf[0])\r
50             {\r
51                 int rc  = GetPicture(p, buf.Length, 1, out pHBInfo, out pHBm, null, 0);\r
52 \r
53                 if(rc != 0)\r
54                     return null;\r
55 \r
56                 BITMAPINFOHEADER*   pInfo   = (BITMAPINFOHEADER*)LocalLock(pHBInfo);\r
57                 byte*               pBM     = (byte*)LocalLock(pHBm);\r
58                 int                 s       = 0;\r
59                 Rectangle           r       = new Rectangle(0, 0, pInfo->biWidth, pInfo->biHeight);\r
60                 bmp                         = new Bitmap(pInfo->biWidth, pInfo->biHeight, PixelFormat.Format24bppRgb);\r
61                 BitmapData          data    = bmp.LockBits(r, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);\r
62                 byte*               dst     = (byte*)data.Scan0;\r
63                 dst                         +=data.Stride * data.Height;\r
64 \r
65                 switch(pInfo->biBitCount)\r
66                 {\r
67                 case  8:    break;\r
68                 case 16:    break;\r
69                 case 24:\r
70                     for(uint y= 0; y < pInfo->biHeight; ++y)\r
71                     {\r
72                         dst             -=data.Stride;\r
73 \r
74                         for(uint x= 0; x < pInfo->biWidth; ++x)\r
75                         {\r
76                             dst[x*3+0]  = pBM[s++];\r
77                             dst[x*3+1]  = pBM[s++];\r
78                             dst[x*3+2]  = pBM[s++];\r
79                         }\r
80                     }\r
81                     break;\r
82 \r
83                 case 32:\r
84                     for(uint y= 0; y < pInfo->biHeight; ++y)\r
85                     {\r
86                         dst             -=data.Stride;\r
87 \r
88                         for(uint x= 0; x < pInfo->biWidth; ++x)\r
89                         {\r
90                             dst[x*3+0]  = pBM[s++];\r
91                             dst[x*3+1]  = pBM[s++];\r
92                             dst[x*3+2]  = pBM[s++];\r
93                             ++s;\r
94                         }\r
95                     }\r
96                     break;\r
97                 }\r
98 \r
99                 bmp.UnlockBits(data);\r
100 \r
101                 LocalUnlock(pHBInfo);\r
102                 LocalUnlock(pHBm);\r
103 \r
104                 return bmp;\r
105             }\r
106         }\r
107 \r
108         [DllImport("kernel32.dll")]\r
109         public extern static void* LocalLock(IntPtr handle);\r
110 \r
111         [DllImport("kernel32.dll")]\r
112         public extern static int LocalUnlock(IntPtr handle);\r
113 \r
114         [DllImport("ifpsd.spi")]\r
115         public extern static int GetPicture(byte* file, int len, uint flag, out IntPtr pHBInfo, out IntPtr pHBm, void* lpPrgressCallback, uint lData); \r
116 \r
117       //[DllImport("axpsd.spi")]\r
118       //public extern static int GetPicture(string file, int len, uint flag, out IntPtr pHBInfo, out IntPtr pHBm, void* lpPrgressCallback, uint lData); \r
119     }\r
120 }\r