Clipboard bitmapowy systemu

Clipboard bitmapowy systemu
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 7x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 4x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

HDC hdc;
COLORREF color;
color = GetPixel( hdc, x, y );
znalazłem sprawdze czy działa

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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);

edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
1

dobra ja przepraszam zacząłem wątek a sam skończyłem , temat zamknięty 😀

tBane
  • Rejestracja:ponad rok
  • Ostatnio:3 minuty
  • Lokalizacja:Poznań
  • Postów:312
0

@wilkwielki: to jakie jest rozwiązanie, bo sam jestem ciekawy


W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około godziny
  • Postów:2094
1

@wilkwielki: masz zakaz używania chatGpt ?
Proszę o to kod:
Zwróć uwagę że podając kompletne rozwiązanie łatwiej złapać kontekst

Kopiuj
#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;
}


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 1x, ostatnio: wilkwielki
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około godziny
  • Postów:2094
0

@wilkwielki: Dyskutuj z chatGpt !


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

ja bym chciał zapodaną tylko tablice z danymi bitmapy i szerokość z wysokością ... to wszystko

tBane
  • Rejestracja:ponad rok
  • Ostatnio:3 minuty
  • Lokalizacja:Poznań
  • Postów:312
0

https://chatgpt.com/

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ć


W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 1x, ostatnio: tBane
obscurity
niepotrzebnie płacisz, na https://copilot.microsoft.com/ masz model warty $200/mc za free (wystarczy zaznaczyć opcję "think deeper" i odpala się ten sam model o1 z którego korzysta chatgpt pro)
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

ładnie tylko uchwyt HBITMAP is a typedef for a handle, not a struct.

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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.

edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

dziękuje za pomoc mysle ze temat zamkniety

edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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
edytowany 4x, ostatnio: wilkwielki
several
naucz się proszę formatować kod we wpisach bo w takiej formie ciężko się to czyta
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 2x, ostatnio: wilkwielki
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około godziny
  • Postów:2094
0
Kopiuj
    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();

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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
edytowany 4x, ostatnio: wilkwielki
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około godziny
  • Postów:2094
0

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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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

AD
  • Rejestracja:około 2 lata
  • Ostatnio:4 dni
  • Postów:31
0

Ten ostatni kod @Marius.Maximus działa idealnie. Zrobiłem printscreen i u mnie width i height pokazuje normalnie (1920 x 1080). Kompilowałem za pomocą C++ Builder 12.

edytowany 1x, ostatnio: adolf
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

ja robie printscreen i pisze "Failed to get bitmap data"

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około godziny
  • Postów:2094
0

@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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
AD
  • Rejestracja:około 2 lata
  • Ostatnio:4 dni
  • Postów:31
0

To ja nie wiem. Mi ten sam kod działa w aplikacji konsoli, jak i VCL. Tylko w tym ostatnim wyświetlam w ShowMessage. Spróbuj jeszcze inaczej zrobić screena. Przytrzymaj WinKey i naciśnij printscreen.

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:426
0

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++

edytowany 2x, ostatnio: wilkwielki
AD
Przed uruchomieniem Twojego programu, zobacz jakimś innym programem do przeglądania schowka co tam jest.
Marius.Maximus
Ja niestety nie mam g++ używam clang-a

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.