Le but de mon programme est de faire une capture d'écran toutes les 1/16 seconde, et de l'envoyer par socket au serveur distant.puis-je convertir les données en mémoire bmp en des données png in-momory beaucoup plus petites?
ce programme peut fonctionner avec la capture d'écran au format BMP, cependant, les données au format BMP ont trop d'octets à envoyer, cela ralentit évidemment le processus d'envoi et de recv. Mon idée est la suivante: si je peux convertir le BMP en PNG, et le compresser avant d'envoyer, peut-être le programme peut fonctionner plus lisse.
ici est mon code, sélectionnez projet gh0st
LPVOID m_lpvFullBits = NULL;
HDC m_hFullDC, m_hFullMemDC;
LPBITMAPINFO m_lpbmi_full;
m_hFullDC = GetDC(NULL);
int m_nFullWidth = ::GetSystemMetrics(SM_CXSCREEN);
int m_nFullHeight = ::GetSystemMetrics(SM_CYSCREEN);
m_hFullMemDC = ::CreateCompatibleDC(m_hFullDC);
m_lpbmi_full = (BITMAPINFO *) new BYTE[40];
BITMAPINFOHEADER *lpbmih = &(m_lpbmi_full ->bmiHeader);
lpbmih->biSize = sizeof(BITMAPINFOHEADER);
lpbmih->biWidth = m_nFullWidth ;
lpbmih->biHeight = m_nFullHeight ;
lpbmih->biPlanes = 1;
lpbmih->biBitCount = 32; // 32 bit per pixel
lpbmih->biCompression = BI_RGB;
lpbmih->biXPelsPerMeter = 0;
lpbmih->biYPelsPerMeter = 0;
lpbmih->biClrUsed = 0;
lpbmih->biClrImportant = 0;
lpbmih->biSizeImage = (((lpbmih->biWidth * lpbmih->biBitCount + 31) & ~31) >> 3) * lpbmih->biHeight;
HBITMAP m_hFullBitmap = ::CreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvFullBits, NULL, NULL);
::SelectObject(m_hFullMemDC, m_hFullBitmap);
::BitBlt(m_hFullMemDC, 0, 0, m_nFullWidth, m_nFullHeight, m_hFullDC, 0, 0, SRCCOPY);
jusqu'à cette déclaration:
::BitBlt(m_hFullMemDC, 0, 0, m_nFullWidth, m_nFullHeight, m_hFullDC, 0, 0, SRCCOPY);
données de pixels BMP est enregistré à l'adresse de commencer m_lpvFullBits, non? Maintenant, ce que je veux savoir, est-ce que je peux utiliser les informations connues actuelles telles que la largeur, la hauteur, les données de pixel BMP .., reconstruire un nouveau format png en mémoire qui est beaucoup plus petit que les données BMP actuelles, et envoyer les nouvelles données de format png par socket au serveur distant?
merci pour toute aide
Oui, c'est possible. Vous devrez utiliser un encodeur PNG à partir du [Composant Windows Imaging] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/ee719902.aspx). Cela fonctionne sur une interface 'IStream', donc vous pouvez passer une implémentation de flux de mémoire. – IInspectable
_convertir le BMP en PNG, et le compresser avant send_ ... pas besoin de ZIP après la conversion en PNG car le format PNG "zippe" déjà les données et il le fait encore plus efficacement que le ZIP. – zett42
Gdiplus ne serait pas plus facile à utiliser pour enregistrer au png? Ou peut-il seulement enregistrer des PNG sur disque, pas de mémoire? –