Re: Передать картинку по сокету
От: qwe_asd_zxc Россия  
Дата: 02.12.05 10:51
Оценка: 2 (1)
класс для работы с Jpeg
здесь

библиотека ijl.dll:
здесь

преобразуй HBITMAP в DIB:

BOOL CBmpFile::LoadFromHBitmap(HBITMAP hBitmap, WORD biBitCount)
{
    BITMAP bmInfo;
    int nRes = GetObject(hBitmap, sizeof(bmInfo), &bmInfo);
    if (nRes != sizeof(bmInfo))
        return FALSE;

    // prepare header

    m_lpBMI = (LPBITMAPINFO) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, 
        sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 0x100);
    if (m_lpBMI == NULL) return FALSE;

    LPBITMAPINFOHEADER lpBMIH = &m_lpBMI->bmiHeader;

    lpBMIH->biSize = sizeof(BITMAPINFOHEADER);
    lpBMIH->biWidth = m_cxBmp = bmInfo.bmWidth;
    lpBMIH->biHeight = m_cyBmp = bmInfo.bmHeight;
    lpBMIH->biPlanes = 1;
    lpBMIH->biBitCount = (biBitCount) ? biBitCount : bmInfo.bmBitsPixel;
    lpBMIH->biCompression = BI_RGB;

    // prepare image data

    m_dwBytesPerScanLine = ((DWORD) m_cxBmp * m_lpBMI->bmiHeader.biBitCount) / 32;
    if (((DWORD) m_cxBmp * m_lpBMI->bmiHeader.biBitCount) % 32)
        m_dwBytesPerScanLine++;
    m_dwBytesPerScanLine *= 4;

    m_dwSizeBmpImage = m_dwBytesPerScanLine * m_cyBmp;

    m_lpBmpImage = (LPBYTE) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, m_dwSizeBmpImage);
    if (m_lpBmpImage == NULL)
    {
        LocalFree(m_lpBMI);
        m_lpBMI = NULL;
        return FALSE;
    }

    // get image data

    HDC hdcScreen = CreateDC( _T("DISPLAY"), NULL, NULL, NULL );
    int nLines = GetDIBits(hdcScreen, hBitmap, 0, m_cyBmp, m_lpBmpImage, m_lpBMI, DIB_RGB_COLORS);
    DeleteDC(hdcScreen);

    if (nLines != m_cyBmp)
    {
        DestroyBmpImage();
        return FALSE;
    }

    return TRUE;
}


загони полученные данные в jpeg и передай их по сети.
затем разожми и отобрази:


HBITMAP CBmpFile::GetHBitmap()
{
    if (!m_lpBMI || !m_lpBmpImage)
        return NULL;

    m_lpBMI->bmiHeader.biSizeImage = m_dwSizeBmpImage;

    LPVOID pvBits;
    HBITMAP hBitmap = NULL;

    // create hbitmap from image data

    HDC hdcScreen = CreateDC( _T("DISPLAY"), NULL, NULL, NULL );
    hBitmap = CreateDIBSection(hdcScreen, m_lpBMI, DIB_RGB_COLORS, &pvBits, NULL, 0);
    DeleteDC(hdcScreen);

    if (hBitmap != NULL)
        memcpy(pvBits, m_lpBmpImage, m_dwSizeBmpImage);

    return hBitmap;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.