Admixior Temat założony przez niniejszego użytkownika |
BMP & JPG » 2012-07-17 00:35:24 Piszę program a'la teamviewer i potrzebuję przesyłać obraz przez internet, nie wiem czy JPG będzie najlepsze(jak nie to napiszcie co lepiej - jakość/rozmiar). Jak można szybko zrobić konwersje bmp->jpg tak aby nie korzystać z innych niż STD libków(kolega podesłał mi GDIPlus, ale...), oraz tak by nie zapisywać na dysk gdyż to może spowolnić? Ew. gdy korzystanie z prostego libka może mi ułatwić pisanie(znacznie) to też możecie podać.
I jak ktoś ma doś. to czy sumując konwersja za pomocą SFML (jpg(bajty w pamięci)->bmp(sf::Image::LoadFromMemory()) będzie szybsza niż konwersja z std, i załadowanie później do sf::Image? |
|
DejaVu |
» 2012-07-17 01:00:46 Trochę chaotycznie opisałeś swój problem... W każdym razie pomijając operacje dyskowe program zawsze będzie dużo szybszy niż ten, który używa operacji dyskowych. Myślę, że sprawa przesyłania obrazków takim czy innym formacie jest problemem drugorzędnym i powinieneś najpierw skupić się aby program działał dla pierwszego lepszego formatu plików w którym potrafisz zapisywać obraz.
PS. Biblioteka CxImage ma spore możliwości. |
|
Admixior Temat założony przez niniejszego użytkownika |
» 2012-07-18 12:02:35 Chodzi mi o to że chciałbym zrobić konwert najlepiej surowe piksele ostatecznie bitmape na jpg, żeby była możliwość wyboru jakości kompresji oraz żeby operacje były prowadzone w pamięci RAM, nie korzystając z dysku. Oraz nie chciałbym dołączać innych bibliotek (chyba że znacznie mi to uprości życie, a appka dużo nie urośnie). //EDIT: Powiem to inaczej: Mam wolne piksele i wskaźnik do nich(pierwszego)(BGR o ile się nie myle),[ a dokładnie przekopiowuje je bezpośrednio z hdc] i potrzebuje abym w pamięci miał jpg-ka lub inny format który bardzo dobrze skompresuje mi screen. Kod jak wygląda to teraz: void * bmpBits; HBITMAP hBmp; BITMAPINFO bmpinfo; bmpinfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); bmpinfo.bmiHeader.biWidth = roz.right; bmpinfo.bmiHeader.biHeight = roz.bottom; bmpinfo.bmiHeader.biPlanes = 1; bmpinfo.bmiHeader.biBitCount =( WORD ) 32; bmpinfo.bmiHeader.biCompression = BI_RGB; bmpinfo.bmiHeader.biSizeImage = 0; bmpinfo.bmiHeader.biXPelsPerMeter = roz.right; bmpinfo.bmiHeader.biYPelsPerMeter = roz.bottom; bmpinfo.bmiHeader.biClrUsed = 32; bmpinfo.bmiHeader.biClrImportant = 32; hBmp = CreateDIBSection( myDC, & bmpinfo, DIB_RGB_COLORS, & bmpBits, NULL, 0 );
DeleteObject(( HBITMAP ) SelectObject( myDC, hBmp ) ); UINT size_pack = roz.right * roz.bottom * 4;
while( 1 ) { BitBlt( myDC, 0, 0, roz.right, roz.bottom, window, 0, 0, SRCCOPY ); }
|
|
DejaVu |
» 2012-07-19 19:20:36 No to użyj tej biblioteki, którą Ci podałem (co prawda nie wiem czy lekko i przyjemnie się ją kompiluje ale ma spore możliwości). |
|
CodeMeister |
» 2012-07-22 11:01:22 |
|
Admixior Temat założony przez niniejszego użytkownika |
» 2012-07-22 20:14:45 hmm.. a więc skompilowałem sobie libke i jest. Mam dllki. Tylko jak je dodać do projektu jak nie mam libek???[OK]Problem rozwiązanyProblem: ciągle niezdefiniowana funkcja: ]1>main.obj : error LNK2019: unresolved external symbol "public: bool __thiscall CxImage::Save(wchar_t const *,unsigned int)" (?Save@CxImage@@QAE_NPB_WI@Z) referenced in function _main 1>C:\Users\Admixior\documents\visual studio 2010\Projects\test img\Debug\test img.exe : fatal error LNK1120: 1 unresolved externals 1>
|
|
xevuel |
» 2012-07-23 07:08:27 |
|
Admixior Temat założony przez niniejszego użytkownika |
» 2012-07-23 13:17:13 Pomogło. THX Ale i tak nie mogę znaleźć w tej bibliotece funkcji która by coś takiego robiła. Na necie za to znalazłem kod. CByteArray baPicture; IStream * pStream = NULL; if( CreateStreamOnHGlobal( NULL, TRUE, & pStream ) == S_OK ) { if( image.Save( pStream, Gdiplus::ImageFormatPNG ) == S_OK ) { ULARGE_INTEGER ulnSize; LARGE_INTEGER lnOffset; lnOffset.QuadPart = 0; if( pStream->Seek( lnOffset, STREAM_SEEK_END, & ulnSize ) == S_OK ) { if( pStream->Seek( lnOffset, STREAM_SEEK_SET, NULL ) == S_OK ) { baPicture.SetSize( ulnSize.QuadPart ); ULONG ulBytesRead; pStream->Read( baPicture.GetData(), ulnSize.QuadPart, & ulBytesRead ); } } } } pStream->Release();
5 odpowiedź w: http://stackoverflow.com/questions/366768/convert-bitmap-to-png-in-memory-in-c-win32Tylko nie za bardzo wiem gdzie po przekonwertowaniu mam wskaźnik do danych czy to jest pod baPicture.GetData()??? |
|
« 1 » |