ja pobrac Clipboard bitmapowy z ekarnu systemu do talbicy w c++ znając szerokość i wysokość ekranu ? z Clipboard'em tekstowym sobie poradziłem a teraz potrzebuje print screen'a ....
tutaj coś jest https://www.experts-exchange.com/questions/24769725/Saving-a-clipboard-print-screen-image-to-disk-in-a-jpg-or-bmp-file-format.html
tutaj tez https://learn.microsoft.com/pl-pl/windows/win32/dataxchg/using-the-clipboard?redirectedfrom=MSDN wie ktoś jak kto uprościć ?
tam są przykłady na GDI a ja chce na API

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
ja bym chciał tak pobranie bitmapy a z obiektu pochodnego z struktury szerokość ii wysokośc i tyle mi starczy .... bitmapa=xmax * ymax * 3 , 3 kolory red green blue
potrzebuje to do zrobienia czcionki bitmapowej na podstawie kodów ASCII z konsoli od -128 do 128
jesli jest mozliwosc dostepu do buffora konsoli to nie trzeba było by kombinować z Clipboard 'em

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
HDC hdc;
COLORREF color;
color = GetPixel( hdc, x, y );
znalazłem sprawdze czy działa

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
działa pobiera kolor pixela o podanych wartosciach X,Y
mam
RGBTRIPLE rgb;
rgb.rgbtRed = GetRValue(color);
rgb.rgbtGreen = GetGValue(color);
rgb.rgbtBlue = GetBValue(color);

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
dobra ja przepraszam zacząłem wątek a sam skończyłem , temat zamknięty
@wilkwielki: to jakie jest rozwiązanie, bo sam jestem ciekawy

- Rejestracja:ponad 14 lat
- Ostatnio:2 minuty
- Postów:2076
@wilkwielki: masz zakaz używania chatGpt ?
Proszę o to kod:
Zwróć uwagę że podając kompletne rozwiązanie łatwiej złapać kontekst
#include <windows.h>
#include <iostream>
#include <fstream>
void SaveBitmapToFile(HBITMAP hBitmap, const char* filename) {
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bmp.bmWidth;
bi.biHeight = bmp.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 32; // Assuming 32-bit BMP
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
DWORD dwBmpSize = ((bmp.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmp.bmHeight;
HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize);
char* lpbitmap = (char*)GlobalLock(hDIB);
HDC hDC = GetDC(NULL);
GetDIBits(hDC, hBitmap, 0, (UINT)bmp.bmHeight, lpbitmap, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
ReleaseDC(NULL, hDC);
std::ofstream file(filename, std::ios::out | std::ios::binary);
bmfHeader.bfType = 0x4D42; // BM
bmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwBmpSize;
bmfHeader.bfReserved1 = 0;
bmfHeader.bfReserved2 = 0;
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
file.write((char*)&bmfHeader, sizeof(BITMAPFILEHEADER));
file.write((char*)&bi, sizeof(BITMAPINFOHEADER));
file.write(lpbitmap, dwBmpSize);
GlobalUnlock(hDIB);
GlobalFree(hDIB);
file.close();
}
void GetClipboardBMP() {
if (!OpenClipboard(NULL)) {
std::cerr << "Failed to open clipboard!" << std::endl;
return;
}
if (!IsClipboardFormatAvailable(CF_BITMAP)) {
std::cerr << "Clipboard does not contain a bitmap!" << std::endl;
CloseClipboard();
return;
}
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
if (!hBitmap) {
std::cerr << "Failed to get clipboard bitmap!" << std::endl;
CloseClipboard();
return;
}
SaveBitmapToFile(hBitmap, "clipboard_image.bmp");
CloseClipboard();
std::cout << "Saved clipboard image as clipboard_image.bmp" << std::endl;
}
int main() {
GetClipboardBMP();
return 0;
}

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
plik bmp to ja potrafie zapisać , bardziej mnie interesuje to HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
jaka jest struktura HBITMAP bo jest obiekt hBitmap i jak pobrać po kropce np hBitmap.DATA_IMAGE albo hBitmap.resolutionX i hBitmap.resolution.Y tylko te trzy prametry więcej mnie juz nie interesuje tyle będzie mi dalej starczylo ale dzięki za pomoc

- Rejestracja:ponad 14 lat
- Ostatnio:2 minuty
- Postów:2076
@wilkwielki: Dyskutuj z chatGpt !

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
jaki jest adres chatGpt i jak tam się zalogować , czy to jest za darmo? sorry ale ja jestem ciemny kiedys na goolgle tam trafiłem ale nie wiedziałem jak sie zalogowac

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
ja bym chciał zapodaną tylko tablice z danymi bitmapy i szerokość z wysokością ... to wszystko
Ogólnie jest za darmo, ale płatna wersja jest o wiele lepsza. Sam korzystam z płatnej - 100 zł/mc. Wystarczy konto Google z tego co kojarzę, by się zarejestrować


- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
ładnie tylko uchwyt HBITMAP is a typedef for a handle, not a struct.

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
bmp.bmBits <<< czy to jest tablica z danymi
bmp.bmBitsPixel <<< czy to tez czasami nie to
juz mam bmBits: A pointer to the bitmap's pixel data.

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
powtórka , .. mam tak , uprościłem to wszystko na początek aby sprawdzić i jest błąd
OpenClipboard(NULL);
IsClipboardFormatAvailable(CF_BITMAP);
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
WriteBitmapFile("test.bmp",bmp.bmWidth,bmp.bmHeight,bmp.bmBits); // nazwa , szerokosc , wysokosc, i tablica z obrazem
i jest taki błąd
error C2664: 'WriteBitmapFile' : cannot convert parameter 4 from 'unsigned short' to 'unsigned char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
jak to poprawić takie pytanie ? bo skład funkcji jest taki
WriteBitmapFile(char *filename, int width, int height, unsigned char *imageData)
plik powstaje i jest pusty

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
co tutaj za cuda się dzieją:
DWORD dwBmpSize = ((bmp.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmp.bmHeight;
HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize);
char* lpbitmap = (char*)GlobalLock(hDIB);
HDC hDC = GetDC(NULL);
GetDIBits(hDC, hBitmap, 0, (UINT)bmp.bmHeight, lpbitmap, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
ReleaseDC(NULL, hDC);
tutaj jest jakas konwersja zamiast czystej tablicy typu unsigned char gdzie nawet tutaj nie ma wzmianki o bmp."dane"
a jeszcze jedno w tym przykładzie pixel jest 32 bitowo opiasany to głupota robi się 24 po 8 na kolor czyli bajt
32 bitowke to sie opisuje w inicjacji opengl na kanał alfa do alfa blendingu


- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
ma ktoś wiedzę na ten temat i na ten problem do rozwiązania?
podejrzałem zmienne bmp.bmWidth , bmp.bmHeight cout'em i pokazuje śmieci to nawett nie pobiera szerokosci i wyoskosci pulpitu systemu

- Rejestracja:ponad 14 lat
- Ostatnio:2 minuty
- Postów:2076
if (!OpenClipboard(NULL)) {
std::cerr << "Failed to open clipboard!" << std::endl;
return;
}
if (!IsClipboardFormatAvailable(CF_BITMAP)) {
std::cerr << "Clipboard does not contain a bitmap!" << std::endl;
CloseClipboard();
return;
}
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
if (!hBitmap) {
std::cerr << "Failed to get bitmap from clipboard!" << std::endl;
CloseClipboard();
return;
}
// Get bitmap info
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
// Prepare a buffer for raw pixel data
int width = bmp.bmWidth;
int height = bmp.bmHeight;
int bytesPerPixel = bmp.bmBitsPixel / 8;
BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height; // Negative to keep image top-down
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = bmp.bmBitsPixel;
bmi.bmiHeader.biCompression = BI_RGB;
std::vector<unsigned char> pixels(width * height * bytesPerPixel);
HDC hdc = GetDC(NULL);
GetDIBits(hdc, hBitmap, 0, height, pixels.data(), &bmi, DIB_RGB_COLORS);
ReleaseDC(NULL, hdc);
CloseClipboard();

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
OpenClipboard(NULL);
IsClipboardFormatAvailable(CF_BITMAP);
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
int width = bmp.bmWidth;
int height = bmp.bmHeight;
cout << "width: " << width << endl;
cout << "height:" << height << endl;
pisze width:4198920 to głupota
pisze height:4214598
coś za duży ten pulpit systemu
pod "g++ -l gdi32" width=0 a height ponad miliardy

- Rejestracja:ponad 14 lat
- Ostatnio:2 minuty
- Postów:2076
Standardowa Odpowiedź Administratora nr 1: „u mnie działa”
Jezeli kod wyglada tak jak wkeiłes to na 99% wina jest w tym ze nie sprawdzasz wyniku funkcji i juz na pierwszych etapach masz problem np. nie masz w schowku BMP
Z durnych danych dostajesz durne odpowiedzi

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
przecież łatwiej się juz nie da, napisałem tą prowizorke tak wstepująco w skrócie aby tylko sprawdzić działanie tego schematu i u mnie nie dizała , jeśli masz pomysł jak to napisać moją metodą na szybko wersje działającą to jak możesz prosze pomóż mi , na razie na tym etapie pobranie tylko tych dwojga wartosci szerokosc i wyskosc a dalej powinno pójsc jak składka, na wstępie są warunki sprawdzające dostępność tego systemu a przeciez na 99% procent powinno obsługiwaćt Clipboard przez system , jądro systemu i przez kompilator dlaczego jestes taki srogi dla mnie ja tylko prosze o pomoc to przepraszam jesli zajmuje Ci czas , o co chodzi Ci z tym schowkiem BMP jak kolejność funkcji jest prawidłowo wywołana

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
chatGPT mówi tak
if (IsClipboardFormatAvailable(CF_BITMAP)) {
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
BITMAP bmp;
if (GetObject(hBitmap, sizeof(BITMAP), &bmp)) {
// Process the bitmap information (e.g., width, height)
int width = bmp.bmWidth;
int height = bmp.bmHeight;
// Now you can do something with this bitmap, like drawing or saving
} else {
// Handle error: unable to retrieve bitmap info
}
} else {
// Handle error: clipboard does not contain a bitmap
}
ten sam efekt co u mnie i nic

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
BITMAP bmp;
if (GetObject(hBitmap, sizeof(BITMAP), &bmp)) {
// Successfully retrieved bitmap information
int width = bmp.bmWidth;
int height = bmp.bmHeight;
int colorDepth = bmp.bmBitsPixel;
int rowBytes = bmp.bmWidthBytes;
// You can now work with these properties
printf("Width: %d, Height: %d, Color Depth: %d, Row Bytes: %d\n", width, height, colorDepth, rowBytes);
} else {
// Handle error (failed to retrieve bitmap)
printf("Failed to get bitmap data.\n");
}
odpowiedź taka : printf("Failed to get bitmap data.\n"); czyli po prostu ta wersja w całości z całym projektem jest spalona i nie działa, ja juz koncze ten wątek bo dalej to walka z wiatrkami i starczy

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
ja robie printscreen i pisze "Failed to get bitmap data"

- Rejestracja:ponad 14 lat
- Ostatnio:2 minuty
- Postów:2076
@wilkwielki: zainstaluj MSYS2
w tym watku masz zalecane środowisko pracy (wg mojej filozofii)
https://4programmers.net/Forum/C_i_C++/375553-vs_code_problem_z_plikami_naglowkowymi?p=1991570#id1991570

- Rejestracja:ponad rok
- Ostatnio:około 12 godzin
- Postów:390
i nic ten sam błąd Failed to get bitmap data
ja mam MSYS64 na dysku "C"
C:\msys64\mingw64\bin a w tym zawarty g++
