いつも丁寧なご回答を頂きありがとうございます。
GetDIBits関数の使い方について質問させて頂きます。
http://msdn.microsoft.com/ja-jp/library/cc428673 …
上記サイトを参考にして色々と試してみてWin32APIでは正常に動作したのですが、C#で正常に動作しません。
<Win32API>
LPCOLORREF pScanData = NULL;
BITMAPINFOHEADER bmpinfo = {0};
pScanData = new COLORREF[ bmp.bmWidth ];
bmpinfo.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.biWidth = bmp.bmWidth;
bmpinfo.biHeight = bmp.bmHeight;
bmpinfo.biPlanes = 1;
bmpinfo.biBitCount = 32;
bmpinfo.biCompression = BI_RGB;
// 一行分画像データを DIB で取り出す
GetDIBits( hdc, hBitmap,1, 1, pScanData, (LPBITMAPINFO)&bmpinfo, DIB_RGB_COLORS );
特に第5、6引数に何を渡してやればいいのかがわかりません。
以上ご助言よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
こんばんは。
IntPtrではないでしょうか。unsafeキーワードの使用も避ける事が出来なさそうです。
後、通常は画像イメージが上下逆転しているので、上から1行分読み込む場合は「ビットマップの高さ-1」を指定します。以下参考程度に。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication
{
public partial class Form1 : Form
{
public const int BI_RGB = 0;
public const int DIB_RGB_COLORS = 0;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
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;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct BITMAPINFO
{
public BITMAPINFOHEADER bmih;
public fixed UInt32 bmiColors[1];
};
[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);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//ビットマップを読む
Bitmap bitmap = new Bitmap("test.bmp");
IntPtr hbitmap = bitmap.GetHbitmap();
//1行分の受け取りバッファを割り当てる
UInt32[] ui32Buffer = new UInt32[bitmap.Width];
unsafe
{
BITMAPINFO bi;
bi.bmih.biSize = (UInt32)sizeof(BITMAPINFOHEADER);
bi.bmih.biPlanes = (UInt16)1;
bi.bmih.biCompression = BI_RGB;
bi.bmih.biBitCount = 32;
bi.bmih.biWidth = bitmap.Width;
bi.bmih.biHeight = bitmap.Height;
IntPtr hdc = GetDC(IntPtr.Zero);
fixed (void* lpvBits = ui32Buffer)
{
//構造体へ詳細を取り込む
if (GetDIBits(hdc, hbitmap, 0, 0, IntPtr.Zero, new IntPtr(&bi), DIB_RGB_COLORS) == 0)
MessageBox.Show("error");
//1行分読み込む
if (GetDIBits(hdc, hbitmap, (UInt32)(bitmap.Height - 1), 1, new IntPtr(lpvBits), new IntPtr(&bi), DIB_RGB_COLORS) == 0)
MessageBox.Show("error");
}
ReleaseDC(IntPtr.Zero, hdc);
}
//データの確認
foreach (UInt32 ui32 in ui32Buffer)
{
Color color = Color.FromArgb((Int32)ui32);
Int32 R = color.R;
Int32 G = color.G;
Int32 B = color.B;
}
}
}
}
ご教授頂きありがとうございます。
すごく参考になりました。C#でGetDIBits関数を使う方法は解決しました。
ありがとうございました。^^感謝感謝です。
.netで使用される型がC++のどの型に対応しているのか分からなくて困っていたのですが下記のサイトに載っていました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/024 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- その他(データベース) 20万行あるデータを動かしたい 2 2023/06/13 15:21
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
大量のデータを読み込んで表示...
-
C#でのWNetAddConnection3の使...
-
Processingでマウスクリックで...
-
Thread.sleepのInterruptedExce...
-
【java】座標の値をテキストフ...
-
Javaでパラパラアニメを作成す...
-
Visual C♯ フォーム間での値の...
-
文字コードチェックについて
-
【C#】ソースコードをファイル...
-
iアプリ 複数パネル切替時の変...
-
配列の受け渡し
-
Javaの課題について質問です。...
-
フェードアウト時にぶちっと画...
-
ジャバスクリプトについて。
-
[JAVA]try 内の変数を外で!?
-
ダブルクォーテーションのrepla...
-
1~100までの数字を表示し、か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
C# visibleプロパティをfalseに...
-
unityでのC++エラーの原因がわ...
-
ボタンの複数割り当てについて
-
C#で別のFormへ複数の値を返そ...
-
エンターキーを押すとOKボタン...
-
LVM_SETITEMSTATEでListViewの...
-
ユーザーコントロールを動的に...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
C#から、C++で作成したdll内の...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
Thread.sleepのInterruptedExce...
-
C#でのオブジェクトのコピーに...
-
C# 半角カナの文字化けについて
-
文字列の置換
おすすめ情報