質問編集履歴

2

アドバイス頂いた情報から色情報取得の2度目の挑戦

2021/05/04 06:06

投稿

dendenmushi
dendenmushi

スコア98

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

一行削除『上記あたりから~』(意味がないため)

2021/05/04 06:05

投稿

dendenmushi
dendenmushi

スコア98

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行