OSDN Git Service

DTXManiaソリューション、DTXManiaプロジェクト、DTXCreatorプロジェクト、FDKプロジェクトについて英語化。
[dtxmania/dtxmania.git] / FDK / コード / 04.グラフィック / BitmapUtil.cs
diff --git a/FDK/コード/04.グラフィック/BitmapUtil.cs b/FDK/コード/04.グラフィック/BitmapUtil.cs
new file mode 100644 (file)
index 0000000..8306132
--- /dev/null
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Drawing;
+using System.IO;
+
+namespace FDK
+{
+       public static class BitmapUtil
+       {
+               // 定数
+
+               public const uint DIB_PAL_COLORS = 1;
+               public const uint DIB_RGB_COLORS = 0;
+
+
+               // 構造体
+
+               [StructLayout( LayoutKind.Sequential, Pack = 1 )]
+               public struct BITMAPFILEHEADER
+               {
+                       public ushort bfType;
+                       public uint bfSize;
+                       public ushort bfReserved1;
+                       public ushort bfReserved2;
+                       public uint bfOffBits;
+               }
+
+               [StructLayout( LayoutKind.Sequential, Pack = 1 )]
+               public struct BITMAPINFOHEADER
+               {
+                       public const int BI_RGB = 0;
+                       public uint biSize構造体のサイズ;
+                       public int biWidthビットマップの幅dot;
+                       public int biHeightビットマップの高さdot;
+                       public ushort biPlanes面の数;
+                       public ushort biBitCount;
+                       public uint biCompression圧縮形式;
+                       public uint biSizeImage画像イメージのサイズ;
+                       public int biXPelsPerMete水平方向の解像度;
+                       public int biYPelsPerMeter垂直方向の解像度;
+                       public uint biClrUsed色テーブルのインデックス数;
+                       public uint biClrImportant表示に必要な色インデックスの数;
+               }
+
+
+               // メソッド
+
+               public static unsafe Bitmap ToBitmap( IntPtr pBITMAPINFOHEADER )
+               {
+                       BITMAPFILEHEADER bitmapfileheader;
+                       BITMAPINFOHEADER* bitmapinfoheaderPtr = (BITMAPINFOHEADER*) pBITMAPINFOHEADER;
+                       bitmapfileheader.bfType = 0x4d42;
+                       bitmapfileheader.bfOffBits = (uint) ( sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) );
+                       bitmapfileheader.bfSize = bitmapfileheader.bfOffBits + bitmapinfoheaderPtr->biSizeImage画像イメージのサイズ;
+                       MemoryStream output = new MemoryStream();
+                       BinaryWriter writer = new BinaryWriter( output );
+                       byte[] destination = new byte[ sizeof( BITMAPFILEHEADER ) ];
+                       Marshal.Copy( (IntPtr) ( &bitmapfileheader ), destination, 0, destination.Length );
+                       writer.Write( destination );
+                       destination = new byte[ sizeof( BITMAPINFOHEADER ) ];
+                       Marshal.Copy( pBITMAPINFOHEADER, destination, 0, destination.Length );
+                       writer.Write( destination );
+                       destination = new byte[ bitmapinfoheaderPtr->biSizeImage画像イメージのサイズ ];
+                       bitmapinfoheaderPtr++;
+                       Marshal.Copy( (IntPtr) bitmapinfoheaderPtr, destination, 0, destination.Length );
+                       writer.Write( destination );
+                       writer.Flush();
+                       writer.BaseStream.Position = 0L;
+                       return new Bitmap( writer.BaseStream );
+               }
+       }
+}