一个网络传输图片的程序,求助。已将位图保存在数组中,如放在数组a中。
其中a(0)保存第一象素的R值,a(1)保存第一象素的G值,a(2)保存第一象素的B值,a(3)保存第二象素的R值,。。以此类推将位图数据完全保存在了数组中。
现在想对这个数组进行压缩。想把他转换为JPG格式的,但网上提供的DLL都是对文件进行操作的。我不想操作文件。直接转换为JPG,然后再把它在网络上传输给对方后再还原为原来的位图数组(当然肯定也不能完全还原为原来的数组了,BMP转换为JPG肯定会有失真的,只要还原后的位图数组画出来的图有JPG的逼真度就可以了)求大家给个思路。
或者提供BMP转换为JPG的算法也行,谢谢了。

解决方案 »

  1.   

    把你的jpeg库代码中写文件的改成写到指定的内存。
      

  2.   

    试试用这个库:CxImage
    http://www.codeproject.com/bitmap/cximage.aspHBITMAP hCaptureBitmap = CaptureScreen();

    CxImage *newima = new CxImage(CXIMAGE_FORMAT_BMP);
    if (hCaptureBitmap)
    {
         newima->CreateFromHBITMAP(hCaptureBitmap);
    }
    if (newima->IsValid())
    {
         long size=0;
         BYTE* buffer=0;
         newima->Encode(buffer,size,CXIMAGE_FORMAT_JPG);
         ...
         free(buffer);//需要自己释放内存
    }
      

  3.   

    楼主可以用一些无损压缩算法的库,压缩效果比jpeg好,速度也快。
    推荐zlib库,主要是用着方便,适合我这种拿来主义者,呵呵。http://www.zlib.net/
    楼主要是搞算法研究的,那我这就是班门弄斧啦。
      

  4.   

    如2 楼所说,可以使用CxImage 
      

  5.   

    微软新推出的GDI+功能强大,  图片类型的转换支持:bmp、dib、png、gif、jpeg/jpg、tiff、emf等。以下是详细步骤
    首先,在StdAfx.h中静态调用diplus.lib,即由编译系统完成对DLL的加载,应用程序结束时卸载DLL的编码。如下: #ifndef ULONG_PTR
    #define ULONG_PTR unsigned long*
    #include "GdiPlus.h"
    using namespace Gdiplus;
    #pragma comment(lib, "gdiplus.lib")
    #endif   在类的头文件中定义,以下成员变量,用来初始化GDI+的使用和结束使用。GdiplusStartupInput m_gdiplusStartupInput; 
    ULONG_PTR m_gdiplusToken;   然后在OnCreate()函数中加入初始化GDI+的函数:GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);    在OnDestroy()函数中加入结束GDI+使用的函数: GdiplusShutdown(m_gdiplusToken);  接着,定义转换函数:BOOL MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage, CString strType)   其中:  CMemFile& cbfBmp表示原位图文件;
      CMemFile& cbfImage表示转换后的图形文件;
      CString strType表示转换的图片类型。  该函数中主要的处理为以下几步:  将原位图文件转换为IStream 
      定义Image类实例,并使用第1步获得的IStream初始化 
      获取转换的图片类型的CLSID 
      将Image以转换的图片类型保存到IStream中 
      将IStream转换为CMemFile内存文件(也可为CFile)   详细代码如下: BOOL MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage, CString strType)
    {
     int iBmpSize = cbfBmp.GetLength();
     HGLOBAL hMemBmp = GlobalAlloc(GMEM_FIXED, iBmpSize);
     if (hMemBmp == NULL) return FALSE;
     IStream* pStmBmp = NULL;
     CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmBmp);
     if (pStmBmp == NULL) 
     {
      GlobalFree(hMemBmp);
      return FALSE;
     }
     BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);
     cbfBmp.SeekToBegin();
     cbfBmp.Read(pbyBmp, iBmpSize); Image* imImage = NULL;
     imImage = Image::FromStream(pStmBmp, FALSE);
     if (imImage == NULL) 
     {
      GlobalUnlock(hMemBmp);
      GlobalFree(hMemBmp);
      return FALSE;
     }
     USES_CONVERSION;
     CLSID clImageClsid;
     GetImageCLSID(A2W("image/"+strType.GetBuffer(0)), &clImageClsid); HGLOBAL hMemImage = GlobalAlloc(GMEM_MOVEABLE, 0);
     if (hMemImage == NULL)
     {
      pStmBmp->Release();
      GlobalUnlock(hMemBmp);
      GlobalFree(hMemBmp);
      if (imImage != NULL) delete imImage;
      return FALSE;
     } 
     IStream* pStmImage = NULL;
     CreateStreamOnHGlobal(hMemImage, TRUE, &pStmImage);
     if (pStmImage == NULL)
     {
      pStmBmp->Release();
      GlobalUnlock(hMemBmp);
      GlobalFree(hMemBmp);
      GlobalFree(hMemImage);
      if (imImage != NULL) delete imImage
       return FALSE;
     } 
     imImage->Save(pStmImage, &clJpgClsid);
     if (pStmImage == NULL) 
     {
      pStmBmp->Release();
      pStmImage>Release();
      GlobalUnlock(hMemBmp);
      GlobalFree(hMemBmp);
      GlobalFree(hMemImage;
      if (imImage != NULL) delete imImage;
      return FALSE;
     }
     LARGE_INTEGER liBegin = {0};
     pStmImage->Seek(liBegin, STREAM_SEEK_SET, NULL);
     BYTE* pbyImage = (BYTE *)GlobalLock(hMemImage);
     cbfImage.SeekToBegin();
     cbfImage.Write(pbyImage, GlobalSize(hMemImage)); if (imImage != NULL) delete imImage;
     pStmBmp->Release();
     pStmImage->Release();
     GlobalUnlock(hMemBmp);
     GlobalUnlock(hMemImage);
     GlobalFree(hMemBmp);
     GlobalFree(hMemImage);
     return TRUE;