读书人

存储Bitmap图片,该怎么处理

发布时间: 2012-04-15 18:39:21 作者: rapoo

存储Bitmap图片
我在模拟实现QQ的屏幕截图功能,然后在保存位图的时候没法改变图片的大小,也就是没实现存储的图片是我截取的图片。这个我的图片是在哦内存中存取的,请问下怎么改变其大小。我用的是VC程序,别说PS的

C/C++ code
    long lWidth;    long lHeight;    DWORD dwScanDPI;    CString m_szFileName;// 位图文件名称    CWnd* pWnd;//    CSampleGrabberCB( ){//        strcpy(m_szFileName, "c:\\donaldo.bmp");//    }    STDMETHODIMP_(ULONG) AddRef() { return 2; }    STDMETHODIMP_(ULONG) Release() { return 1; }    STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)    {        if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )        {            *ppv = (void *) static_cast<ISampleGrabberCB*> ( this );            return NOERROR;        }        return E_NOINTERFACE;    }    STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )    {        return 0;    }    STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )    {        if( !bSaveFrame )return 0;                if(!pBuffer)return E_POINTER;        SaveBitmap(pBuffer, lBufferSize);        bSaveFrame = FALSE;        return 0;    }    //创建位图文件    BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize )    {        BITMAPINFOHEADER * pHeader = new BITMAPINFOHEADER;        memset(pHeader, 0, sizeof(BITMAPINFOHEADER));        pHeader->biSize = sizeof(BITMAPINFOHEADER);        pHeader->biPlanes = 1;        pHeader->biBitCount = 32;        pHeader->biCompression = BI_RGB;        pHeader->biWidth = lWidth;        pHeader->biHeight = lHeight;        LPVOID object = image_create_bitmap3(pHeader, NULL);        delete pHeader;        pHeader=NULL;        int cpylen = lWidth*4;        BYTE * pDest = image_bitmap_dibits(object);        memset(pDest, 0, cpylen*lHeight);        BYTE * pSrc;        char sTemp[3];        memset(sTemp,0,3);        sTemp[0]=255;        sTemp[1]=0;        sTemp[2]=0;        for(int i = lHeight-1; i >=0; i--)        {            pSrc = pBuffer + (lHeight-i-1)*lWidth*3;            for(int j=0; j<lWidth; j++)            {//                if(j<500&&i>lHeight-1-500)//                {//                    memcpy(pDest,sTemp,3);//                }//                else                memcpy(pDest, pSrc, 3);                pDest += 4;                pSrc += 3;            }        }        //**********************************        image_save_bitmap(object, m_szFileName,IMAGE_JPEG,dwScanDPI);        image_delete_bitmap(object);    //    delete []pBuffer;    //    pBuffer = NULL;        WPARAM TwParam = (WPARAM)(char*)(LPCTSTR)"VEDIOFILESAVEFINISH";        pWnd->SendMessage(WM_IMGSCAN_SCAN_FINISHLOCALFILE,TwParam,0);             return 0;    }};


[解决办法]
冷清,帮顶下,可以用鼠标拉小吗?
[解决办法]
那存储的是什么图片??
[解决办法]
查下如何改变位图 直接在内存中处理,然后再保存
[解决办法]
你是说截取的是全屏的图片,而不是你选择区域的小块图片么?
好比截到一个1280*800,你只要靠近左上角的200*200,那么建议你另外建一个200*200新位图,然后把要贴的数据复制过去再保存。不知道是不是你想要的。
[解决办法]
眼花...
我觉得你得搞清楚你在什么地方限制了生成图片的大小?
[解决办法]
hdc = GetDC (hwnd) ; //获取桌面DC,前面锁定桌面窗口
hdcMem = CreateCompatibleDC (hdc) ;//创建内存DC
hBitmap = CreateCompatibleBitmap (hdc,
abs (ptEnd.x - ptBeg.x),
abs (ptEnd.y - ptBeg.y)) ;//创建图片,这里需要改成你要保存的大小。

SelectObject (hdcMem, hBitmap) ;

StretchBlt (hdcMem, 0, 0, abs (ptEnd.x - ptBeg.x),
abs (ptEnd.y - ptBeg.y),


hdc, ptBeg.x, ptBeg.y, ptEnd.x - ptBeg.x,
ptEnd.y - ptBeg.y, SRCCOPY) ;//拷贝图片,这里也需要改成你要保存的大小。
[解决办法]
msdn查找copyimage,希望对你有帮助

读书人网 >VC/MFC

热点推荐