投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/6/5 21:21:38
> エクセルのデバイスコンテキストを取得して、GETPXELをしても-1にしかならなくて、
GETPXEL というのは、GDI API の
GetPixel のことでしょうか?
' COLORREF GetPixel( HDC hdc, int x, int y ); 
Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hDC As LongPtr, ByVal x As LongByVal y As LongAs Long
https://excel.syogyoumujou.com/memorandum/get_bmp.html

こちらでも確認してみたいので、デバイスコンテストの取得部分も含めて、
現象を再現可能な実際のコードを提示できますか?


> netでクラスライブラリではpngのgetpixelは実現できたのですが、
.NET の System.Drawing 名前空間のほとんどは、
GDI+ の API を使って VBA から呼び出せます。

Bitmap.GetPixel メソッドなら、GdipBitmapGetPixel API です。
' GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y, ARGB *color) 
Private Declare PtrSafe Function GdipBitmapGetPixel Lib "gdiplus" (ByVal bitmap As LongPtr, ByVal x As LongByVal y As LongByRef color As LongAs Long


GDI の時はデバイコンテキストハンドルを指定しましたが、
GDI+ の時は Bitmap オブジェクトを指定します。といっても、他にも初期化処理や
解放処理など、いくつか手続きが必要なのですが…(どこかにサンプル無いかな)。
http://gdipluscode.sakura.ne.jp/gdip/gdip.html
https://excel.syogyoumujou.com/memorandum/without_picture.html

Excel の画面領域を撮影するのは、.NET なら Graphics.CopyFromScreen メソッドを
使うところですが、これは GDI+ API ではなく GDI の BitBlt API で実装されています。
ちなみに Graphics オブジェクトからデバイスコンテキストへの変換は、
GdipGetDC API です(解放は GdipReleaseDC)。

ただ… GDI+ の GdipBitmapGetPixel にせよ、GDI の GetPixel にせよ、
処理速度は比較的遅い処理となります。もしも高速に取得する必要がある場合には、
GDI なら GetDIBits API、GDI+ なら GdipCreateBitmapFromScan0 API を使う手があります。
ビットマップ データの構造を分かっていないと解析できないので、
GetPixel よりはコードが煩雑になりますけれどね。