如题。

解决方案 »

  1.   

    用原来的head和info,从新改写长度和宽度,然后把图像数据写入
      

  2.   


    //保证开始小于结束坐标
    //…………………………………………………………………………
    int tem=0;
    if(m_RegionBegin.x>m_RegionEnd.x)
    {
    tem=m_RegionBegin.x;
    m_RegionBegin.x=m_RegionEnd.x;
    m_RegionEnd.x=tem;

    }
    if(m_RegionBegin.y>m_RegionEnd.y)
    {
    tem=m_RegionBegin.y;
    m_RegionBegin.y=m_RegionEnd.y;
    m_RegionEnd.y=tem;
    }


    //................................................................
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    CCh1_1Doc* pDoc =GetDocument();
    //DIB句柄
    HDIB hDIB,hNewDIB;
    // 指向DIB的指针
    LPSTR lpDIB,lpNewDIB;
    hDIB=pDoc->GetHDIB();
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
    // 源图像的宽度和高度
    LONG lWidth;
    LONG lHeight;
    // 旋转后图像的宽度和高度
    LONG lNewWidth;
    LONG lNewHeight;
    LONG lLineBytes,lNewLineBytes;
    // 计算旋转后的图像实际宽度
    lNewWidth  = (LONG) m_RegionEnd.x-m_RegionBegin.x;
    // 计算旋转后的图像高度
    lNewHeight = (LONG) m_RegionEnd.y-m_RegionBegin.y;
    int PictureBits;
    PictureBits=DIBBits(lpDIB);
    if (PictureBits/8==0)//不处理低于8位的图像格式
    {
    MessageBox("不支持该图像的数据格式!", "系统提示" , MB_ICONINFORMATION | MB_OK);
    return;
    }
    // 指向源图像的指针
    LPSTR lpDIBBits,lpNewDIBBits;
    // 找到源DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);
    // 获取图像的宽度
    lWidth = ::DIBWidth(lpDIB);
    // 获取图像的高度
    lHeight = ::DIBHeight(lpDIB);
    if(m_RegionEnd.y>lHeight||m_RegionEnd.x>lWidth)
    {
    MessageBox("超出图像范围!", "系统提示" , MB_ICONINFORMATION | MB_OK);
    ::GlobalUnlock((HGLOBAL)hDIB);
    return;
    }
    lLineBytes = WIDTHBYTES(PictureBits*lWidth );//将宽度转换成4的整数倍
    lNewLineBytes=WIDTHBYTES(PictureBits*lNewWidth );
    // 分配内存,以保存新DIB
    //lNewWidth=WIDTHBYTES(PictureBits*lNewWidth );
    hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
    // 判断是否内存分配失败
    if (hNewDIB == NULL)
    {
    // 分配内存失败
    return ;
    }

    m_UnDo[++m_UnDoCount]=CopyHandle(hDIB);
    m_bUnDo=true;
    // 锁定内存
    lpNewDIB =  (LPSTR )::GlobalLock((HGLOBAL) hNewDIB);
    // 复制DIB信息头和调色板
    memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
    LPBITMAPINFOHEADER lpInfo,lpNewInfo;//位图信息头
    // 读取BITMAPINFO结构,初始化指针
    lpInfo = (LPBITMAPINFOHEADER)lpDIB;
    lpNewInfo=(LPBITMAPINFOHEADER)lpNewDIB;
    lpNewInfo->biWidth=lNewWidth;
    lpNewInfo->biHeight=lNewHeight;
    lpNewInfo->biSizeImage=lNewLineBytes*lNewHeight;//lNewWidth*lNewHeight;//lNewLineBytes*lNewHeight;
    // 找到新DIB象素起始位置
    lpNewDIBBits = ::FindDIBBits(lpNewDIB);
    unsigned char* lpSrc,*lpDest;
    int i,j,m,n;
    switch(PictureBits)
    {
    case 8:
    for(j=m_RegionBegin.y,n=0;j<m_RegionEnd.y,n<lNewHeight;j++,n++)
    for(i=m_RegionBegin.x,m=0;i<m_RegionEnd.x,m<lNewWidth;i++,m++)
    {
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i;
    lpDest = (unsigned char*)lpNewDIBBits + lNewLineBytes *(lNewHeight-1-n) + m;
    *lpDest=*lpSrc;
    }
    break;
    case 24:

    for(j=m_RegionBegin.y,n=0;j<m_RegionEnd.y,n<lNewHeight;j++,n++)
    for(i=3*m_RegionBegin.x,m=0;i<3*m_RegionEnd.x,m<3*lNewWidth;i++,m++)
    {
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i;
    lpDest = (unsigned char*)lpNewDIBBits + lNewLineBytes *(lNewHeight-1-n) + m;
    *lpDest=*lpSrc;

    }
    break;
    case 32:
    lLineBytes = WIDTHBYTES(4*lWidth * 8);
    for(j=m_RegionBegin.y,n=0;j<m_RegionEnd.y;j++,n=n++)
    for(i=4*m_RegionBegin.x,m=0;i<4*m_RegionEnd.x;i++,m++)
    {
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i;
    lpDest = (unsigned char*)lpNewDIBBits + lNewLineBytes *(lNewHeight-1-n) + m;
    *lpDest=*lpSrc;

    }
    break;
    default:
    MessageBox("不支持该图像的数据格式!", "系统提示" , MB_ICONINFORMATION | MB_OK);

    break;
    }

    // 替换DIB,同时释放旧DIB对象
    pDoc->ReplaceHDIB(hNewDIB);
    pDoc->InitDIBData();
    SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
    // 更新视图
    pDoc->UpdateAllViews(NULL);
    ::GlobalUnlock((HGLOBAL)hNewDIB);
    ::GlobalUnlock((HGLOBAL)hDIB);
    mb_RegionMeasure=mb_PictureCut=mb_PictureCopy=false;
    看看这个,这是个把图像根据所选区域将外部剪掉的程序,你改动一下,将句柄返给文档保存是不是可以呀。
      

  3.   

    把原图读到内存里放四个memdc里, 每个都读原图的一部分然后再建bmp保存不就行了吗?