c++ StretchBlt函数返回一个奇怪的白色点位图

s1ag04yj  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(122)

我试图写一个简单的位图大小调整应用程序使用窗口API,这是我的位图大小调整功能:

  1. BOOL ResizeBitmap(HBITMAP hOriginalBitmap, const char resizedFilename[], BitmapAngle NewAngle, BitmapAngle BmAngle){
  2. HDC hdcSrc = CreateCompatibleDC(NULL);
  3. HGDIOBJ originalObject = SelectObject(hdcSrc, hOriginalBitmap);
  4. HDC hdcDest = CreateCompatibleDC(NULL);
  5. HBITMAP hNewBitmap = CreateCompatibleBitmap(hdcDest, NewAngle.Width, NewAngle.Height);
  6. if (!hNewBitmap) {
  7. GetErrorCode("CreateCompatibleBitmap");
  8. ExitProcess(0);
  9. }
  10. SelectObject(hdcDest, hNewBitmap);
  11. // Set the stretch mode to HALFTONE for better quality
  12. SetStretchBltMode(hdcDest, HALFTONE);
  13. SetBrushOrgEx(hdcDest, 0, 0, NULL);
  14. // Use StretchBlt to resize the original bitmap onto the new bitmap
  15. StretchBlt(hdcDest, 0, 0, NewAngle.Width, NewAngle.Height,
  16. hdcSrc, 0, 0, BmAngle.Width, BmAngle.Height,
  17. SRCCOPY);
  18. // BitBlt(hdcDest, 0, 0, NewAngle.Width, NewAngle.Height, hdcSrc, 0, 0, SRCCOPY);
  19. // Save the resized bitmap to a file
  20. SaveBitmapToFile(hNewBitmap, NewAngle, resizedFilename);
  21. SelectObject(hdcSrc, originalObject);
  22. DeleteDC(hdcSrc);
  23. DeleteDC(hdcDest);
  24. DeleteObject(hNewBitmap);
  25. return TRUE;
  26. }

字符串
这是我的SaveBitmapToFile函数:

  1. BOOL SaveBitmapToFile(HBITMAP hBitMap, BitmapAngle Angle, const char NewFileName[]) {
  2. HDC hDevice = CreateCompatibleDC(NULL);
  3. SelectObject(hDevice, hBitMap);
  4. BITMAPINFOHEADER BitmapInfoHeader = GetBitmapInfoHeader(Angle);
  5. BITMAPFILEHEADER BitMapFileHeader = GetBitmapFileHeader(Angle);
  6. DWORD AllocatedSize = Angle.Width * Angle.Height * 3; // Assuming 24 bits per pixel
  7. BYTE* BitmapData = VirtualAlloc(NULL, AllocatedSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  8. int Result = GetDIBits(hDevice, hBitMap, 0, Angle.Height, BitmapData, (BITMAPINFO*)&BitmapInfoHeader, DIB_RGB_COLORS);
  9. if (!Result) {
  10. GetErrorCode("GetDIBits");
  11. ExitProcess(0);
  12. }
  13. HANDLE hFile = CreateFileA(NewFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  14. if (!hFile) {
  15. GetErrorCode("CreateFileA");
  16. ExitProcess(0);
  17. }
  18. // Write headers and bitmap data to the file
  19. WriteFile(hFile, &BitMapFileHeader, sizeof(BITMAPFILEHEADER), NULL, NULL);
  20. WriteFile(hFile, &BitmapInfoHeader, sizeof(BITMAPINFOHEADER), NULL, NULL);
  21. WriteFile(hFile, BitmapData, AllocatedSize, NULL, NULL);
  22. CloseHandle(hFile);
  23. VirtualFree(BitmapData, AllocatedSize, MEM_RELEASE);
  24. DeleteDC(hDevice);
  25. if (!GetLastError()) {
  26. return TRUE;
  27. } else {
  28. GetErrorCode("SaveBitmapToFile");
  29. return FALSE;
  30. }
  31. }


然而,结果位图文件看起来真的很奇怪,它只是一个带有白色点的位图:
The input bitmapThe Output bitmap的数据库
SaveBitmapToFile函数工作得很好,当我尝试截图时,所以我认为问题出在ResizeBitmap函数上
这是我的截图功能,它工作得很好。

  1. HBITMAP GetScreenBitmap() {
  2. HDC hdcScreen = GetDC(NULL);
  3. int screenWidth = GetSystemMetrics(SM_CXSCREEN);
  4. int screenHeight = GetSystemMetrics(SM_CYSCREEN);
  5. // Create a compatible memory DC using the screen DC
  6. HDC hdcMem = CreateCompatibleDC(hdcScreen);
  7. // Create a compatible bitmap using the screen DC
  8. HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, screenWidth, screenHeight);
  9. // Select the bitmap into the memory DC
  10. SelectObject(hdcMem, hBitmap);
  11. // BitBlt to copy the contents of the screen to the memory DC
  12. BitBlt(hdcMem, 0, 0, screenWidth, screenHeight, hdcScreen, 0, 0, SRCCOPY);
  13. // Release resources
  14. ReleaseDC(NULL, hdcScreen);
  15. DeleteDC(hdcMem);
  16. return hBitmap;
  17. }
  18. HBITMAP hCurrentScreen = GetScreenBitmap();
  19. BitmapAngle BmAngle; BmAngle.Height = GetSystemMetrics(SM_CYSCREEN); BmAngle.Width = GetSystemMetrics(SM_CXSCREEN);
  20. SaveBitmapToFile(hCurrentScreen, BmAngle, "TEST.bmp");

gijlo24d

gijlo24d1#

感谢@iInspectable
只要把CreateCompatibleBitmap(hdcDest, NewAngle.Width, NewAngle.Height);这一行改一下
CreateCompatibleBitmap(hdcSrc, NewAngle.Width, NewAngle.Height);
会解决问题的!
resource

相关问题