Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

BMP & JPG

Ostatnio zmodyfikowano 2012-07-23 13:17
Autor Wiadomość
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?
P-60268
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.
P-60270
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:

C/C++
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 );
//-------ostatnie przygotowanie--------
DeleteObject(( HBITMAP ) SelectObject( myDC, hBmp ) );
UINT size_pack = roz.right * roz.bottom * 4;
//główna pętelka
while( 1 )
{
    BitBlt( myDC, 0, 0, roz.right, roz.bottom, window, 0, 0, SRCCOPY );
    // i w tym miejscu musi być konwert
}
P-60452
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).
P-60604
CodeMeister
» 2012-07-22 11:01:22
Na stronie http://www.codeproject.com/Articles/1300/CxImage masz nawet pikny kod jak konwetrować i wszystko elegancko opisane
P-60829
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ązany
Problem:
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>
P-60878
xevuel
» 2012-07-23 07:08:27
P-60912
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.
C/C++
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-win32

Tylko nie za bardzo wiem gdzie po przekonwertowaniu mam wskaźnik do danych czy to jest pod baPicture.GetData()???
P-60929
« 1 »
  Strona 1 z 1