//★ GetDIBits でピクセルを取得 前田 稔
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
struct BITMAPINFOHEADER
{
public UInt32 biSize;
public Int32 biWidth;
public Int32 biHeight;
public UInt16 biPlanes;
public UInt16 biBitCount;
public UInt32 biCompression;
public UInt32 biSizeImage;
public Int32 biXPelsPerMeter;
public Int32 biYPelsPerMeter;
public UInt32 biClrUsed;
public UInt32 biClrImportant;
};
unsafe struct BITMAPINFO
{
public BITMAPINFOHEADER bmih;
public fixed UInt32 bmiColors[1];
};
public class MyForm : Form
{ Face App;
public MyForm()
{
App = new Face("c:\\data\\test\\test16.bmp");
Paint += new PaintEventHandler(MyHandler);
}
private void MyHandler(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
if (App.m_bmp == null) Application.Exit();
App.View(g,0,0);
}
}
//☆ Face Object Class
class Face
{
public Bitmap m_bmp;
byte[] m_p;
public const int BI_RGB = 0;
public const int DIB_RGB_COLORS = 0;
[DllImport("User32.Dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.Dll")]
public static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("gdi32.dll")]
public static extern int GetDIBits(IntPtr hdc, IntPtr hbmp, UInt32 uStartScan, UInt32 cScanLines, IntPtr lpvBits, IntPtr lpbi, UInt32 uUsage);
// Constructor
unsafe public Face(string ImgFile)
{
try
{ m_bmp = new Bitmap(ImgFile); }
catch
{ MessageBox.Show("画像ファイルが読めません!", ImgFile);
return ;
}
Debug.Write("Width:" + m_bmp.Width + " Hight:" + m_bmp.Height + "\n");
m_p = new byte[m_bmp.Width*m_bmp.Height*4];
BITMAPINFO bi = new BITMAPINFO();
bi.bmih.biSize = (UInt32)sizeof(BITMAPINFOHEADER);
bi.bmih.biPlanes = (UInt16)1;
bi.bmih.biCompression = BI_RGB;
bi.bmih.biBitCount = 32;
bi.bmih.biWidth = m_bmp.Width;
bi.bmih.biHeight = m_bmp.Height;
IntPtr hbitmap = m_bmp.GetHbitmap();
IntPtr hdc = GetDC(IntPtr.Zero);
fixed(void* lpvBits = m_p)
{
if (GetDIBits(hdc, hbitmap, 0, (UInt32)m_bmp.Height, (IntPtr)lpvBits, new IntPtr(&bi), DIB_RGB_COLORS) == 0)
MessageBox.Show("GetDIBits error");
}
ReleaseDC(IntPtr.Zero, hdc);
for(int y=0; y<m_bmp.Height; y++)
{ for(int x=0; x<m_bmp.Width; x++)
{
int idx= (y*m_bmp.Width+x)*4;
byte B = m_p[idx];
byte G = m_p[idx+1];
byte R = m_p[idx+2];
byte A = m_p[idx+3];
Debug.Write("BGRA: " + B + ", " + G + ", " + R + ", " + A + "\n");
}
Debug.Write("--------\n");
}
}
// 画像を描画
public void View(Graphics g, int x, int y)
{
if (m_bmp != null) g.DrawImage(m_bmp, x, y);
}
}
class image01
{
public static void Main()
{
MyForm mf = new MyForm();
Application.Run(mf);
}
}
|