Ĺadny brzuch
Jak za pomocą języka c++ zrobić screena ekranu, ew. zaznaczając za pomocą px jaką częśc obrazu zaznaczyć?
2. Jak to potem zapisać jako JPG?
1. TUTAJ jest napisane przez Cyrkla
2. Też szukam jak zapisać coś JPEG. Jakoś żadnych bibliotek nie umiem obsługiwać :P
1. TUTAJ jest napisane przez Cyrkla
2. Też szukam jak zapisać coś JPEG. Jakoś żadnych bibliotek nie umiem obsługiwać :P
libjpeg ?
Tutaj ( http://cyrkiel.goin.pl/cjpg.rar ) masz dlla z podstawową obsługą kompresji jpg (nudziło mi się :P).
#include <Jpeg.hpp>
TJPEGImage *JPG = new TJPEGImage(); JPG->Assign(Image1->Picture->Bitmap); Form2->Show(); JPG->CompressionQuality= Form2->TrackBar1->Position; // Low 1-100 High JPG->Compress(); JPG->SaveToFile(SavePictureDialog1->FileName + ".jpg"); JPG->Free();
kompresja jpeg'a
Co prawda ja tego tematu nie założyłem ale dzięki Cyrkiel... zaraz przeanaluzuje przykład. Edit: Ooo jedna linijka kodu i komprsja jpg gotowa :)
DarkCez: To działa tylko w Buildierze ;) Może i dgf45 chodziło o BCB?
A i jeszcze jedno pytanie: Czy da się W Dev c++ "scalić" tą DLL'kę z plikiem exe?
Użytkownik Konrad_st edytował ten post 21 kwiecień 2006, 22:50
W instalce bcb w katalogu \Info\Extras\Jpeg\src są źródełka (a w \Info\Extras\Jpeg\obj skompilowane odpowiedniki) kompresji jpg dla cpp ;)
Jest jeszcze jeden problem. Twój kod Cyrkiel: Zapis screena do pliku chyba trochę wadliwie działa. Utworzony plik nie chce się otworzyć np w Paincie, i nie chce się skompresować funkcją z tej biblioteki którą zapodałeś wyżej.
Jest jeszcze jeden problem. Twój kod Cyrkiel: Zapis screena do pliku chyba trochę wadliwie działa. Utworzony plik nie chce się otworzyć np w Paincie, i nie chce się skompresować funkcją z tej biblioteki którą zapodałeś wyżej. To chyba Ty coś źle zrobiłeś, przed chwilą sprawdziłem oba programy, wszystko działa bez zarzutu ;)
Dziwne... przespisałem na nowo cały kod i nie chce skompresować, mojego screenu inne bitmapy kompresuje, ale screenu wykonanego tą funkcją nie chce. Dziwne też, że screen zajmuje aż 4MB (zapisany w paincie zajmuje 1 MB mniej) . Jak chcesz to zobacz czy u Ciebie sie skompresuje ta bitmapa .
Nic nie mówie może u mnie coś źle działa... :huh:
Użytkownik Konrad_st edytował ten post 22 kwiecień 2006, 18:04
Bo zapisywał 32 bity :P Spróbuj teraz - 24 bity:#include <windows.h> void screen(HWND okno, char* plik) { HDC _dc = GetWindowDC(okno); RECT re; GetWindowRect(okno,&re); int w = re.right, h = re.bottom; HDC dc = CreateCompatibleDC(0); HBITMAP bm = CreateCompatibleBitmap(_dc,w,h); SelectObject(dc,bm); StretchBlt(dc,0,0,w,h,_dc,0,0,w,h,SRCCOPY); void* f = CreateFile(plik,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0); void* buf = new char[w*h*3]; GetObject(bm,84,buf); HDC ddd = GetDC(0); HDC dc2 = CreateCompatibleDC(ddd); tagBITMAPINFO bi; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = w; bi.bmiHeader.biHeight = h; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; bi.bmiHeader.biCompression = 0; bi.bmiHeader.biSizeImage = 0; CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0); GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS); BITMAPFILEHEADER bif; bif.bfType = MAKEWORD('B','M'); bif.bfSize = w*h*3+54; bif.bfOffBits = 54; BITMAPINFOHEADER bii; bii.biSize = 40; bii.biWidth = w; bii.biHeight = h; bii.biPlanes = 1; bii.biBitCount = 24; bii.biCompression = 0; bii.biSizeImage = w*h*3; DWORD r; WriteFile(f,&bif,sizeof(bif),&r,NULL); WriteFile(f,&bii,sizeof(bii),&r,NULL); WriteFile(f,buf,w*h*3,&r,NULL); CloseHandle(f); } int main() { screen(GetDesktopWindow(),".\\bitmapa.bmp"); system("pause"); }Twój screen rzeczywiście nigdzie się nie otwiera oprócz explorera :/
Niestety dalej nie chce się skompresować. Teraz gdy otworzę go w paincie, kolory nie są zgodne z rzeczywistymi.
U Ciebie dobrze zapisuje i kopresuje bitmape utworzoną za pomocą tej funkcji?
Tutaj jest następna bitmapa
Mój screen: http://cyrkiel.goin.pl/bitmapa.rar w paincie ganz gut :)
A no działa już. Dzięki ;)
Witam, sorry że odświerzam topic ale ten kod Cyrkla (24-bity) dziwnie działa znaczy się bitmape w explorerze widze ładnie wszysto OK a jak włączam z painta to jest jakby podzielona na pół i odwrocona stronami.
http://www.filecabin...610-bitmapa.bmp
Użytkownik patseb edytował ten post 19 maj 2006, 19:31
Zobacz jeszcze ten kod: void screen(HWND okno, char *FileName) { // Capture a BMP HDC hScreen, hCompat; HBITMAP hBm; BITMAP bmp; BITMAPINFO bmpinfo; LPVOID pBits; DWORD dwWidth, dwHeight, dwBPP, dwNumColors, dwBytes; BITMAPFILEHEADER bitmapfileheader; BITMAPINFOHEADER bitmapinfoheader; RGBQUAD colors[256]; HANDLE hfile; int iRet; WORD Ximage_original, Yimage_original; ZeroMemory( &bmp, sizeof( bmp ) ); ZeroMemory( &bmpinfo, sizeof( bmpinfo ) ); ZeroMemory( &bitmapfileheader, sizeof( bitmapfileheader ) ); ZeroMemory( &bitmapinfoheader, sizeof( bitmapinfoheader ) ); ZeroMemory( &colors, sizeof( colors ) ); // hScreen = CreateDC( "DISPLAY", NULL, NULL, NULL ); hScreen =GetWindowDC(okno); dwWidth = GetDeviceCaps( hScreen, HORZRES ); dwHeight = GetDeviceCaps( hScreen, VERTRES ); dwBPP = 24; dwNumColors = GetDeviceCaps( hScreen, NUMCOLORS ); hCompat = CreateCompatibleDC( hScreen ); bmpinfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); bmpinfo.bmiHeader.biWidth = dwWidth; bmpinfo.bmiHeader.biHeight = dwHeight; bmpinfo.bmiHeader.biPlanes = 1; bmpinfo.bmiHeader.biBitCount = (WORD)dwBPP; bmpinfo.bmiHeader.biCompression = BI_RGB; bmpinfo.bmiHeader.biSizeImage = 0; bmpinfo.bmiHeader.biXPelsPerMeter = 0; bmpinfo.bmiHeader.biYPelsPerMeter = 0; bmpinfo.bmiHeader.biClrUsed = dwNumColors; bmpinfo.bmiHeader.biClrImportant = dwNumColors; hBm = CreateDIBSection( hScreen, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0 ); SelectObject( hCompat, hBm ); BitBlt( hCompat, 0, 0, dwWidth, dwHeight, hScreen, 0, 0, SRCCOPY ); // BMP if ( dwNumColors != 0 ) dwNumColors = GetDIBColorTable( hCompat, 0, dwNumColors, colors ); bitmapfileheader.bfType = 0x4D42; bitmapfileheader.bfSize = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD)); bitmapfileheader.bfReserved1 = 0; bitmapfileheader.bfReserved2 = 0; bitmapfileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD)); bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER); bitmapinfoheader.biWidth = dwWidth; bitmapinfoheader.biHeight = dwHeight; bitmapinfoheader.biPlanes = 1; bitmapinfoheader.biBitCount = (WORD)dwBPP; bitmapinfoheader.biCompression = BI_RGB; bitmapinfoheader.biSizeImage = 0; bitmapinfoheader.biXPelsPerMeter = 0; bitmapinfoheader.biYPelsPerMeter = 0; bitmapinfoheader.biClrUsed = dwNumColors; bitmapinfoheader.biClrImportant = 0; hfile = CreateFile( FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile( hfile, &bitmapfileheader, sizeof(BITMAPFILEHEADER), &dwBytes, NULL ); WriteFile( hfile, &bitmapinfoheader, sizeof(BITMAPINFOHEADER), &dwBytes, NULL ); if ( dwNumColors != 0 ) WriteFile( hfile, colors, sizeof(RGBQUAD) * dwNumColors, &dwBytes, NULL ); WriteFile( hfile, pBits, (dwWidth*dwHeight*dwBPP)/8, &dwBytes, NULL ); CloseHandle( hfile ); DeleteObject( hBm ); DeleteDC( hScreen ); DeleteDC( hCompat ); } U mnie poprzedni działa troche wadliwie a ten dobrze. Zobacz jak u Ciebie.
Działa wielkie dzięki, a masz może wersje z komentami? :> Haha wiem wiem że to jest szczyt beszczelności ale zapytać zawsze można.
Ehh... nie mam :P
Co do zapisywania w formacie JPEG to na początku programu trzeba dodać
#include "jpeg.hpp"
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
2. Jak to potem zapisać jako JPG?
1. TUTAJ jest napisane przez Cyrkla
2. Też szukam jak zapisać coś JPEG. Jakoś żadnych bibliotek nie umiem obsługiwać :P
1. TUTAJ jest napisane przez Cyrkla
2. Też szukam jak zapisać coś JPEG. Jakoś żadnych bibliotek nie umiem obsługiwać :P

libjpeg ?

Tutaj ( http://cyrkiel.goin.pl/cjpg.rar ) masz dlla z podstawową obsługą kompresji jpg (nudziło mi się :P).
#include <Jpeg.hpp>
TJPEGImage *JPG = new TJPEGImage(); JPG->Assign(Image1->Picture->Bitmap); Form2->Show(); JPG->CompressionQuality= Form2->TrackBar1->Position; // Low 1-100 High JPG->Compress(); JPG->SaveToFile(SavePictureDialog1->FileName + ".jpg"); JPG->Free();
kompresja jpeg'a
Co prawda ja tego tematu nie założyłem ale dzięki Cyrkiel... zaraz przeanaluzuje przykład. Edit: Ooo jedna linijka kodu i komprsja jpg gotowa :)
DarkCez: To działa tylko w Buildierze ;) Może i dgf45 chodziło o BCB?
A i jeszcze jedno pytanie: Czy da się W Dev c++ "scalić" tą DLL'kę z plikiem exe?
Użytkownik Konrad_st edytował ten post 21 kwiecień 2006, 22:50
W instalce bcb w katalogu \Info\Extras\Jpeg\src są źródełka (a w \Info\Extras\Jpeg\obj skompilowane odpowiedniki) kompresji jpg dla cpp ;)
Jest jeszcze jeden problem. Twój kod Cyrkiel: Zapis screena do pliku chyba trochę wadliwie działa. Utworzony plik nie chce się otworzyć np w Paincie, i nie chce się skompresować funkcją z tej biblioteki którą zapodałeś wyżej.
Jest jeszcze jeden problem. Twój kod Cyrkiel: Zapis screena do pliku chyba trochę wadliwie działa. Utworzony plik nie chce się otworzyć np w Paincie, i nie chce się skompresować funkcją z tej biblioteki którą zapodałeś wyżej. To chyba Ty coś źle zrobiłeś, przed chwilą sprawdziłem oba programy, wszystko działa bez zarzutu ;)
Dziwne... przespisałem na nowo cały kod i nie chce skompresować, mojego screenu inne bitmapy kompresuje, ale screenu wykonanego tą funkcją nie chce. Dziwne też, że screen zajmuje aż 4MB (zapisany w paincie zajmuje 1 MB mniej) . Jak chcesz to zobacz czy u Ciebie sie skompresuje ta bitmapa .
Nic nie mówie może u mnie coś źle działa... :huh:
Użytkownik Konrad_st edytował ten post 22 kwiecień 2006, 18:04
Bo zapisywał 32 bity :P Spróbuj teraz - 24 bity:#include <windows.h> void screen(HWND okno, char* plik) { HDC _dc = GetWindowDC(okno); RECT re; GetWindowRect(okno,&re); int w = re.right, h = re.bottom; HDC dc = CreateCompatibleDC(0); HBITMAP bm = CreateCompatibleBitmap(_dc,w,h); SelectObject(dc,bm); StretchBlt(dc,0,0,w,h,_dc,0,0,w,h,SRCCOPY); void* f = CreateFile(plik,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0); void* buf = new char[w*h*3]; GetObject(bm,84,buf); HDC ddd = GetDC(0); HDC dc2 = CreateCompatibleDC(ddd); tagBITMAPINFO bi; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = w; bi.bmiHeader.biHeight = h; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; bi.bmiHeader.biCompression = 0; bi.bmiHeader.biSizeImage = 0; CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0); GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS); BITMAPFILEHEADER bif; bif.bfType = MAKEWORD('B','M'); bif.bfSize = w*h*3+54; bif.bfOffBits = 54; BITMAPINFOHEADER bii; bii.biSize = 40; bii.biWidth = w; bii.biHeight = h; bii.biPlanes = 1; bii.biBitCount = 24; bii.biCompression = 0; bii.biSizeImage = w*h*3; DWORD r; WriteFile(f,&bif,sizeof(bif),&r,NULL); WriteFile(f,&bii,sizeof(bii),&r,NULL); WriteFile(f,buf,w*h*3,&r,NULL); CloseHandle(f); } int main() { screen(GetDesktopWindow(),".\\bitmapa.bmp"); system("pause"); }Twój screen rzeczywiście nigdzie się nie otwiera oprócz explorera :/
Niestety dalej nie chce się skompresować. Teraz gdy otworzę go w paincie, kolory nie są zgodne z rzeczywistymi.
U Ciebie dobrze zapisuje i kopresuje bitmape utworzoną za pomocą tej funkcji?
Tutaj jest następna bitmapa
Mój screen: http://cyrkiel.goin.pl/bitmapa.rar w paincie ganz gut :)
A no działa już. Dzięki ;)
Witam, sorry że odświerzam topic ale ten kod Cyrkla (24-bity) dziwnie działa znaczy się bitmape w explorerze widze ładnie wszysto OK a jak włączam z painta to jest jakby podzielona na pół i odwrocona stronami.
http://www.filecabin...610-bitmapa.bmp
Użytkownik patseb edytował ten post 19 maj 2006, 19:31
Zobacz jeszcze ten kod: void screen(HWND okno, char *FileName) { // Capture a BMP HDC hScreen, hCompat; HBITMAP hBm; BITMAP bmp; BITMAPINFO bmpinfo; LPVOID pBits; DWORD dwWidth, dwHeight, dwBPP, dwNumColors, dwBytes; BITMAPFILEHEADER bitmapfileheader; BITMAPINFOHEADER bitmapinfoheader; RGBQUAD colors[256]; HANDLE hfile; int iRet; WORD Ximage_original, Yimage_original; ZeroMemory( &bmp, sizeof( bmp ) ); ZeroMemory( &bmpinfo, sizeof( bmpinfo ) ); ZeroMemory( &bitmapfileheader, sizeof( bitmapfileheader ) ); ZeroMemory( &bitmapinfoheader, sizeof( bitmapinfoheader ) ); ZeroMemory( &colors, sizeof( colors ) ); // hScreen = CreateDC( "DISPLAY", NULL, NULL, NULL ); hScreen =GetWindowDC(okno); dwWidth = GetDeviceCaps( hScreen, HORZRES ); dwHeight = GetDeviceCaps( hScreen, VERTRES ); dwBPP = 24; dwNumColors = GetDeviceCaps( hScreen, NUMCOLORS ); hCompat = CreateCompatibleDC( hScreen ); bmpinfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); bmpinfo.bmiHeader.biWidth = dwWidth; bmpinfo.bmiHeader.biHeight = dwHeight; bmpinfo.bmiHeader.biPlanes = 1; bmpinfo.bmiHeader.biBitCount = (WORD)dwBPP; bmpinfo.bmiHeader.biCompression = BI_RGB; bmpinfo.bmiHeader.biSizeImage = 0; bmpinfo.bmiHeader.biXPelsPerMeter = 0; bmpinfo.bmiHeader.biYPelsPerMeter = 0; bmpinfo.bmiHeader.biClrUsed = dwNumColors; bmpinfo.bmiHeader.biClrImportant = dwNumColors; hBm = CreateDIBSection( hScreen, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0 ); SelectObject( hCompat, hBm ); BitBlt( hCompat, 0, 0, dwWidth, dwHeight, hScreen, 0, 0, SRCCOPY ); // BMP if ( dwNumColors != 0 ) dwNumColors = GetDIBColorTable( hCompat, 0, dwNumColors, colors ); bitmapfileheader.bfType = 0x4D42; bitmapfileheader.bfSize = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD)); bitmapfileheader.bfReserved1 = 0; bitmapfileheader.bfReserved2 = 0; bitmapfileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD)); bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER); bitmapinfoheader.biWidth = dwWidth; bitmapinfoheader.biHeight = dwHeight; bitmapinfoheader.biPlanes = 1; bitmapinfoheader.biBitCount = (WORD)dwBPP; bitmapinfoheader.biCompression = BI_RGB; bitmapinfoheader.biSizeImage = 0; bitmapinfoheader.biXPelsPerMeter = 0; bitmapinfoheader.biYPelsPerMeter = 0; bitmapinfoheader.biClrUsed = dwNumColors; bitmapinfoheader.biClrImportant = 0; hfile = CreateFile( FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile( hfile, &bitmapfileheader, sizeof(BITMAPFILEHEADER), &dwBytes, NULL ); WriteFile( hfile, &bitmapinfoheader, sizeof(BITMAPINFOHEADER), &dwBytes, NULL ); if ( dwNumColors != 0 ) WriteFile( hfile, colors, sizeof(RGBQUAD) * dwNumColors, &dwBytes, NULL ); WriteFile( hfile, pBits, (dwWidth*dwHeight*dwBPP)/8, &dwBytes, NULL ); CloseHandle( hfile ); DeleteObject( hBm ); DeleteDC( hScreen ); DeleteDC( hCompat ); } U mnie poprzedni działa troche wadliwie a ten dobrze. Zobacz jak u Ciebie.
Działa wielkie dzięki, a masz może wersje z komentami? :> Haha wiem wiem że to jest szczyt beszczelności ale zapytać zawsze można.
Ehh... nie mam :P
Co do zapisywania w formacie JPEG to na początku programu trzeba dodać
#include "jpeg.hpp"