75 lines
2.4 KiB
C#
75 lines
2.4 KiB
C#
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 );
|
|
}
|
|
}
|
|
}
|