質問編集履歴
2
アドバイス頂いた情報から色情報取得の2度目の挑戦
test
CHANGED
File without changes
|
test
CHANGED
@@ -523,3 +523,255 @@
|
|
523
523
|
言語:c
|
524
524
|
|
525
525
|
コンパイラ:gcc
|
526
|
+
|
527
|
+
|
528
|
+
|
529
|
+
|
530
|
+
|
531
|
+
### 2021/5/4 追記
|
532
|
+
|
533
|
+
|
534
|
+
|
535
|
+
デスクトップをCreateDIBSectionを使用しHBITMAP型の返却値を取得し、デスクトップ画の情報を反映させ、hbmpPrevに情報反映しましたが、その後のメモリアクセスとRGM色情報の取得で詰まっております。このあとにアクセスする方法のアドバイス頂けないでしょうか。よろしくお願い致します。
|
536
|
+
|
537
|
+
|
538
|
+
|
539
|
+
|
540
|
+
|
541
|
+
```c
|
542
|
+
|
543
|
+
#include <windows.h>
|
544
|
+
|
545
|
+
#include <stdio.h>
|
546
|
+
|
547
|
+
void DrawCursor(HDC hdc);
|
548
|
+
|
549
|
+
BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits);
|
550
|
+
|
551
|
+
HBITMAP CreateBackbuffer(int nWidth, int nHeight);
|
552
|
+
|
553
|
+
|
554
|
+
|
555
|
+
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
|
556
|
+
|
557
|
+
{
|
558
|
+
|
559
|
+
HDC hdc;
|
560
|
+
|
561
|
+
HWND hwndDesk;
|
562
|
+
|
563
|
+
RECT rc;
|
564
|
+
|
565
|
+
BITMAP bm;
|
566
|
+
|
567
|
+
HBITMAP hbmp;
|
568
|
+
|
569
|
+
HBITMAP hbmpPrev;
|
570
|
+
|
571
|
+
|
572
|
+
|
573
|
+
hwndDesk = GetDesktopWindow();
|
574
|
+
|
575
|
+
GetWindowRect(hwndDesk, &rc);
|
576
|
+
|
577
|
+
|
578
|
+
|
579
|
+
hdc = CreateCompatibleDC(NULL);
|
580
|
+
|
581
|
+
|
582
|
+
|
583
|
+
// CreateDIBSectionで作成したビットマップは直接ピクセルデータにアクセス出来るポインタが使用出来る
|
584
|
+
|
585
|
+
hbmp = CreateBackbuffer(rc.right, rc.bottom);
|
586
|
+
|
587
|
+
|
588
|
+
|
589
|
+
BITMAP i;
|
590
|
+
|
591
|
+
hbmpPrev = (HBITMAP)SelectObject(hdc, hbmp);
|
592
|
+
|
593
|
+
//printf("%d\n", hbmpPrev[0]);
|
594
|
+
|
595
|
+
|
596
|
+
|
597
|
+
|
598
|
+
|
599
|
+
// ピクセルデータを取得したいイメージをBitBltで転送して取り出せばよい
|
600
|
+
|
601
|
+
BitBlt(hdc, 0, 0, rc.right, rc.bottom, GetWindowDC(hwndDesk), 0, 0, SRCCOPY);
|
602
|
+
|
603
|
+
DrawCursor(hdc);
|
604
|
+
|
605
|
+
|
606
|
+
|
607
|
+
GetObject(hbmp, sizeof(BITMAP), &bm);
|
608
|
+
|
609
|
+
if (WriteBitmap(TEXT("capture.bmp"), rc.right, rc.bottom, bm.bmBits))
|
610
|
+
|
611
|
+
MessageBox(NULL, TEXT("ファイルを作成しました。"), TEXT("OK"), MB_OK);
|
612
|
+
|
613
|
+
else
|
614
|
+
|
615
|
+
MessageBox(NULL, TEXT("ファイルの作成に失敗しました。"), NULL, MB_ICONWARNING);
|
616
|
+
|
617
|
+
// DIBセクションのHBITMAPをSelectObjectしたメモリDCを転送先にしてBitBltしたら、作成時に受け取ったポインタにピクセルデータが格納
|
618
|
+
|
619
|
+
SelectObject(hdc, hbmpPrev);
|
620
|
+
|
621
|
+
DeleteObject(hbmp);
|
622
|
+
|
623
|
+
DeleteDC(hdc);
|
624
|
+
|
625
|
+
|
626
|
+
|
627
|
+
return 0;
|
628
|
+
|
629
|
+
}
|
630
|
+
|
631
|
+
|
632
|
+
|
633
|
+
void DrawCursor(HDC hdc)
|
634
|
+
|
635
|
+
{
|
636
|
+
|
637
|
+
int x, y;
|
638
|
+
|
639
|
+
CURSORINFO cursorInfo;
|
640
|
+
|
641
|
+
ICONINFO iconInfo;
|
642
|
+
|
643
|
+
|
644
|
+
|
645
|
+
cursorInfo.cbSize = sizeof(CURSORINFO);
|
646
|
+
|
647
|
+
GetCursorInfo(&cursorInfo);
|
648
|
+
|
649
|
+
|
650
|
+
|
651
|
+
GetIconInfo(cursorInfo.hCursor, &iconInfo);
|
652
|
+
|
653
|
+
|
654
|
+
|
655
|
+
x = cursorInfo.ptScreenPos.x - iconInfo.xHotspot;
|
656
|
+
|
657
|
+
y = cursorInfo.ptScreenPos.y - iconInfo.yHotspot;
|
658
|
+
|
659
|
+
DrawIcon(hdc, x, y, cursorInfo.hCursor);
|
660
|
+
|
661
|
+
}
|
662
|
+
|
663
|
+
|
664
|
+
|
665
|
+
BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits)
|
666
|
+
|
667
|
+
{
|
668
|
+
|
669
|
+
HANDLE hFile;
|
670
|
+
|
671
|
+
DWORD dwResult;
|
672
|
+
|
673
|
+
DWORD dwSizeImage;
|
674
|
+
|
675
|
+
BITMAPFILEHEADER bmfHeader;
|
676
|
+
|
677
|
+
BITMAPINFOHEADER bmiHeader;
|
678
|
+
|
679
|
+
|
680
|
+
|
681
|
+
hFile = CreateFile(lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
682
|
+
|
683
|
+
if (hFile == INVALID_HANDLE_VALUE)
|
684
|
+
|
685
|
+
return FALSE;
|
686
|
+
|
687
|
+
|
688
|
+
|
689
|
+
dwSizeImage = nHeight * ((3 * nWidth + 3) / 4) * 4;
|
690
|
+
|
691
|
+
|
692
|
+
|
693
|
+
ZeroMemory(&bmfHeader, sizeof(BITMAPFILEHEADER));
|
694
|
+
|
695
|
+
bmfHeader.bfType = *(LPWORD)"BM";
|
696
|
+
|
697
|
+
bmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSizeImage;
|
698
|
+
|
699
|
+
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
700
|
+
|
701
|
+
|
702
|
+
|
703
|
+
WriteFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwResult, NULL);
|
704
|
+
|
705
|
+
|
706
|
+
|
707
|
+
ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
|
708
|
+
|
709
|
+
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
710
|
+
|
711
|
+
bmiHeader.biWidth = nWidth;
|
712
|
+
|
713
|
+
bmiHeader.biHeight = nHeight;
|
714
|
+
|
715
|
+
bmiHeader.biPlanes = 1;
|
716
|
+
|
717
|
+
bmiHeader.biBitCount = 24;
|
718
|
+
|
719
|
+
bmiHeader.biSizeImage = dwSizeImage;
|
720
|
+
|
721
|
+
bmiHeader.biCompression = BI_RGB;
|
722
|
+
|
723
|
+
|
724
|
+
|
725
|
+
WriteFile(hFile, &bmiHeader, sizeof(BITMAPINFOHEADER), &dwResult, NULL);
|
726
|
+
|
727
|
+
|
728
|
+
|
729
|
+
WriteFile(hFile, lpBits, dwSizeImage, &dwResult, NULL);
|
730
|
+
|
731
|
+
|
732
|
+
|
733
|
+
CloseHandle(hFile);
|
734
|
+
|
735
|
+
|
736
|
+
|
737
|
+
return TRUE;
|
738
|
+
|
739
|
+
}
|
740
|
+
|
741
|
+
|
742
|
+
|
743
|
+
HBITMAP CreateBackbuffer(int nWidth, int nHeight)
|
744
|
+
|
745
|
+
{
|
746
|
+
|
747
|
+
LPVOID lp;
|
748
|
+
|
749
|
+
BITMAPINFO bmi;
|
750
|
+
|
751
|
+
BITMAPINFOHEADER bmiHeader;
|
752
|
+
|
753
|
+
|
754
|
+
|
755
|
+
ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
|
756
|
+
|
757
|
+
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
758
|
+
|
759
|
+
bmiHeader.biWidth = nWidth;
|
760
|
+
|
761
|
+
bmiHeader.biHeight = nHeight;
|
762
|
+
|
763
|
+
bmiHeader.biPlanes = 1;
|
764
|
+
|
765
|
+
bmiHeader.biBitCount = 24;
|
766
|
+
|
767
|
+
|
768
|
+
|
769
|
+
bmi.bmiHeader = bmiHeader;
|
770
|
+
|
771
|
+
|
772
|
+
|
773
|
+
return CreateDIBSection(NULL, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &lp, NULL, 0);
|
774
|
+
|
775
|
+
}
|
776
|
+
|
777
|
+
```
|
1
一行削除『上記あたりから~』(意味がないため)
test
CHANGED
File without changes
|
test
CHANGED
@@ -456,8 +456,6 @@
|
|
456
456
|
|
457
457
|
|
458
458
|
|
459
|
-
上記あたりから取得できないか確認。
|
460
|
-
|
461
459
|
```c
|
462
460
|
|
463
461
|
// 追加2行
|