我写一个程序,想在一个位图里写上我的名字。
已经有一个HBITMAP变量,好像也写进去了,
但是不知道怎么把它再保存为位图。用GetBitmapBits没有用呀。help......
help..............

解决方案 »

  1.   

    建立memdc,把位图选到这个DC上,在这个DC上写名字,把整个图形bitblt到屏幕DC上。
      

  2.   

    to nlstone:
      我不是要写到屏幕DC上,我是想把它再写到文件里呀。
      

  3.   

    要想简单实现就先写到DC里,这时位图数据已变.然后把位图存成文件.
    需要了解位图文件结构,其实很简单,就三个结构体.去MSDN看看就知道了.
      

  4.   

    http://expert.csdn.net/Expert/topic/1551/1551599.xml?temp=.5715906
      

  5.   

    谢谢,我看了他们的方法,好像都要创建一个调色板,如果我不存256色的位图,
    是不是可以省去这一步骤?还有他们说Bmp.bmBits里是完整的数据,但是我调试时看到这个字段每次都是0,
    所以每次都写出一个灰色的位图出来,是不是我取得数据时错了?
      

  6.   

    const int XY=40;
    CPoint ScrollPoint;
    ScrollPoint=GetScrollPosition();
    m_RulerPosition.x+=ScrollPoint.x;
    m_RulerPosition.y+=ScrollPoint.y;
    int RulerLen=100;//标尺长度
    int RulerLineLen;//标尺画线的像素数
    int RulerBeginX,RulerBeginY,RulerEndX,RulerEndY;
    int TextX,TextY;
    int PenWidth;
    int RulerPosition=4;//0为左上角,1为右上角,2为左下角,3为右下角,4为自定义
    int RulerDirection=1;//0为水平,1为竖直
    int RulerYesNo=1;//标尺是否有刻度;
    COLORREF PenColor;
    // 创建对话框
    CRulerSet DiaRulerSet;

    if (DiaRulerSet.DoModal() != IDOK)
    {
    // 返回
    return;
    }
    PenWidth=DiaRulerSet.m_EditPenWidth;
    PenColor=DiaRulerSet.ReturnColor();
    RulerDirection=DiaRulerSet.m_HV;
    RulerYesNo=DiaRulerSet.m_YesNo;
    RulerLen=DiaRulerSet.m_EditRulerLen;
    // 删除对话框
    delete DiaRulerSet;
    //int TextLen;
    if(m_RulerPosition.x<=0)
    RulerPosition=0;
    int RulerUnitLen;
    if(RulerDirection==0)
    {
     RulerUnitLen=(int)(5/CurrentScaler.HCoefficient+0.5);
     RulerLineLen=RulerLen/5*RulerUnitLen;
     if(RulerYesNo==0)
     RulerLineLen=(int)(RulerLen/CurrentScaler.HCoefficient+0.5);
    }
    else
    {
     RulerUnitLen=(int)(5/CurrentScaler.VCoefficient+0.5);
     RulerLineLen=RulerLen/5*RulerUnitLen;
     if(RulerYesNo==0)
     RulerLineLen=(int)(RulerLen/CurrentScaler.VCoefficient+0.5);
    }
    if(RulerUnitLen==0&&RulerYesNo==1) return;
    CString strMessage;
    strMessage.Format (_T ("%d"),RulerLen); 
    strMessage+="um";
    CCh1_1Doc* pDoc =GetDocument();
    HDIB hDIB=pDoc->GetHDIB();
    m_UnDo[++m_UnDoCount]=CopyHandle(hDIB);
    m_bUnDo=true;
    // 指向DIB的指针
    LPSTR lpDIB;
    // 锁定DIB,返回指向DIB的第一个地址指针,以后解锁。
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
    int lHeight,lWidth;
    lHeight=DIBHeight(lpDIB);
    lWidth=DIBWidth(lpDIB);
    switch (RulerPosition)
    {
    case 0://左上角
    if(RulerDirection==0)
    {
    RulerBeginX=XY;
    RulerBeginY=XY;
    RulerEndX=XY+RulerLineLen;
    RulerEndY=XY;
    TextX=RulerBeginX+(RulerLineLen)/2-21;
    TextY=XY-20;
    }
    else
    {
    RulerBeginX=XY;
    RulerBeginY=XY;
    RulerEndX=XY;
    RulerEndY=XY+RulerLineLen;
    TextX=RulerBeginX+10;;
    TextY=RulerBeginY+RulerLineLen/2-8; }
    break;
    case 1://右上角
    if(RulerDirection==0)
    {
    RulerBeginX=lWidth-XY;
    RulerBeginY=XY;
    RulerEndX=lWidth-(XY+RulerLineLen);
    RulerEndY=XY;
    TextX=lWidth-(40+RulerLineLen/2+21);
    TextY=XY-20;
    }
    else
    {
    RulerBeginX=lHeight-XY;
    RulerBeginY=XY;
    RulerEndX=lHeight-XY;
    RulerEndY=XY+RulerLineLen;
    TextX=lHeight-XY-20;
    TextY=40+RulerLineLen/2-21; }
    break;
    case 2://左下角
    if(RulerDirection==0)
    {
    RulerBeginX=XY;
    RulerBeginY=lHeight-XY;
    RulerEndX=XY+RulerLineLen;
    RulerEndY=lHeight-XY;
    TextX=40+RulerLineLen/2-21;
    TextY=lHeight-XY-20;
    }
    else
    {
    RulerBeginX=XY;
    RulerBeginY=lHeight-XY;
    RulerEndX=XY;
    RulerEndY=lHeight-(XY+RulerLineLen);
    TextX=XY-20;
    TextY=lHeight-XY+RulerLineLen/2-21;
    }
    break;
    case 3://右下角
    if(RulerDirection==0)
    {
    RulerBeginX=lWidth-(XY+RulerLineLen);//lWidth-40;
    RulerBeginY=lHeight-XY;
    RulerEndX=lWidth-XY;
    RulerEndY=lHeight-XY;
    TextX=RulerBeginX+RulerLineLen/2-21;
    TextY=RulerEndY-20;//RulerLineLen/2-16;
    }
    else
    {
    RulerBeginX=lWidth-XY;
    RulerBeginY=lHeight-XY;
    RulerEndX=lWidth-XY;
    RulerEndY=lHeight-(XY+RulerLineLen);
    TextX=XY-20;
    TextY=lHeight-40+RulerLineLen/2-21;
    }
    break;
    case 4:
    if(RulerDirection==0)
    {
    RulerBeginX=m_RulerPosition.x-RulerLineLen/2;
    RulerBeginY=m_RulerPosition.y;
    RulerEndX=m_RulerPosition.x+RulerLineLen/2;
    RulerEndY=m_RulerPosition.y;
    TextX=RulerBeginX+RulerLineLen/2-19;;
    TextY=RulerBeginY-XY+20;
    }
    else
    {
    RulerBeginX=m_RulerPosition.x;
    RulerBeginY=m_RulerPosition.y-RulerLineLen/2;
    RulerEndX=m_RulerPosition.x;
    RulerEndY=m_RulerPosition.y+RulerLineLen/2;
    TextX=RulerBeginX+10;
    TextY=RulerBeginY+RulerLineLen/2-8;
    }
    break;
    default :
    if(RulerDirection==0)
    {
    RulerBeginX=XY;
    RulerBeginY=XY;
    RulerEndX=XY+RulerLineLen;
    RulerEndY=XY;
    TextX=RulerBeginX+(RulerLineLen)/2-21;
    TextY=XY-20;
    }
    else
    {
    RulerBeginX=XY;
    RulerBeginY=XY;
    RulerEndX=XY;
    RulerEndY=XY+RulerLineLen;
    TextX=XY+20;
    TextY=XY+RulerLineLen/2-21; }
    break;
    }
        HDC  hDC = NULL, hSourceDC; 
        HBITMAP      hSourceBitmap; 
        DWORD        dwSourceBitsSize;  LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)lpDIB;

        // Gonna use DIBSections and BitBlt() to do the conversion, so make 'em 
    hDC = ::GetDC(NULL); 
        hSourceBitmap = CreateDIBSection( hDC, lpSrcDIB, 0, &m_lpSourceBits, NULL, 0 ); 
        hSourceDC = CreateCompatibleDC( hDC ); 
        dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount); 
        memcpy( m_lpSourceBits, ::FindDIBBits(lpDIB), dwSourceBitsSize );
    m_pMemDC = new CDC;
    m_pMemDC->CreateCompatibleDC(NULL);
    m_hOldSourceBitmap=(HBITMAP) m_pMemDC->SelectObject(hSourceBitmap);
    DeleteDC( hSourceDC ); 
    ::ReleaseDC( NULL,hDC );
    //CBrush *OldBrush;
    //OldBrush=(CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH);//创建一个不填充的画刷
    // m_pMemDC->SetBkColor(TRANSPARENT);//OPAQUE
    int OldBKMode=m_pMemDC->SetBkMode(TRANSPARENT);
    // m_pMemDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
    CPen pen,*OldPen;
    pen.CreatePen(0,PenWidth,PenColor);//(PenStyle,PenWidth,RGB(PenColor,PenColor,PenColor));
    OldPen=(CPen *)m_pMemDC->SelectObject(pen);
    COLORREF OldColor=m_pMemDC->SetTextColor(PenColor); m_pMemDC->MoveTo(RulerBeginX,RulerBeginY);
    m_pMemDC->LineTo(RulerEndX,RulerEndY );
    if(RulerDirection==0)
    {
    m_pMemDC->MoveTo(RulerBeginX,RulerEndY+5);
    m_pMemDC->LineTo(RulerBeginX,RulerEndY-5 );
    }
    else
    {
    m_pMemDC->MoveTo(RulerEndX-5,RulerBeginY);
    m_pMemDC->LineTo(RulerEndX+5,RulerBeginY );
    }
    if(RulerYesNo==1)
    {
    int i,j;
    int TemEndY,TemBeginY,Tem1,Tem2;
    if(RulerDirection==0)
    {
    Tem1=RulerBeginX;
    Tem2=RulerEndX;
    }
    else
    {
    Tem1=RulerBeginY;
    Tem2=RulerEndY;
    }

    for(i=Tem1,j=0;i<=Tem2;i+=RulerUnitLen,j++)
    {
    if(RulerDirection==0)
    {
    TemEndY=RulerEndY;
    TemBeginY=RulerBeginY;
    }
    else
    {
    TemEndY=RulerEndX;
    TemBeginY=RulerBeginX; }
    if(j%2==0)
    {
    TemBeginY+=5;
    TemEndY-=5;
    }
    else
    {
    TemBeginY+=3;
    TemEndY-=3;
    }
    if(RulerDirection==0)
    {
    m_pMemDC->MoveTo(i,TemBeginY);
    m_pMemDC->LineTo(i,TemEndY );
    }
    else
    {
    m_pMemDC->MoveTo(TemBeginY,i);
    m_pMemDC->LineTo(TemEndY,i );
    }
    }
    }
    if(RulerDirection==0)
    {
    m_pMemDC->MoveTo(RulerEndX,RulerEndY+5);
    m_pMemDC->LineTo(RulerEndX,RulerEndY-5 );
    m_pMemDC->TextOut( TextX,TextY, strMessage);
    }
    else
    {
    m_pMemDC->MoveTo(RulerEndX-5,RulerEndY);
    m_pMemDC->LineTo(RulerEndX+5,RulerEndY );
    m_pMemDC->TextOut( TextX,TextY, strMessage);
    }



    dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount); 
        memcpy( ::FindDIBBits(lpDIB),m_lpSourceBits,dwSourceBitsSize);
    m_pMemDC->SelectObject(m_hOldSourceBitmap);
    m_pMemDC->SelectObject(&OldPen);
    m_pMemDC->SetBkMode(OldBKMode);
    m_pMemDC->SetTextColor(OldColor);
    pen.DeleteObject();
    //m_pMemDC->SelectObject(OldBrush);
    GlobalUnlock((HGLOBAL) hDIB);//解锁DIB,丢掉这段内存
    delete m_pMemDC;
    pDoc->UpdateAllViews(NULL);
    照着做,其中关于swithc中的部分不用管他。那里有许多没用的和错的。是为了以后扩程序用的。现在用不着。只用着左上角和自定义两部分。
      

  7.   

    写到图像上再保存图像的代码不用写了。《visual 数字图像处理》上很详细。
      

  8.   

    to  shiyongfan(追梦人):
    我是写到DC里去了,但是位图里的数据没变。to wrcluomo(落木):
    谢谢,我用这个方法试试。
      

  9.   

    用CBuilder做很容易,建议弄个CB的接受参数的exe挂上
      

  10.   

    DrawNameOnBMP(char* pBuffer,BITMAP* pBitmap)
    {
    HDC hdcBitmap; //原位图的设备
    HBITMAP hbitmap; //原位图
    HDC hdcMem; //处理后的设备
    HBITMAP hbitmapMem; //处理的位图
    BITMAP bitmap; //处理位图的描述
    char* pBufChange=NULL; //处理后的位图像素
    int bufsize; //位图大小  bufsize=pBitmap->bmWidthBytes*pBitmap->bmHeight;
    pBufChange=new char[bufsize];
    memcpy(pBufChange,pBuffer,bufsize); //创建原始位图
    hdcBitmap=CreateCompatibleDC(NULL);
    hbitmap=CreateBitmapIndirect(pBitmap);
    SetBitmapBits(hbitmap,bufsize,pBuffer);
    SelectObject(hdcBitmap,hbitmap); //创建处理位图
    hdcMem=CreateCompatibleDC(NULL);
    memcpy(&bitmap,pBitmap,sizeof(BITMAP));
    hbitmapMem=CreateBitmapIndirect(&bitmap);
    SetBitmapBits(hbitmapMem,bufsize,pBufChange);
    SelectObject(hdcMem,hbitmapMem); //画过来
    BitBlt(hdcMem,0,0,pBitmap->bmWidth,pBitmap->bmHeight,
    hdcBitmap,0,0,SRCCOPY); GetObject(hbitmapMem,sizeof(BITMAP),&bitmap); char Buf[20];
    wsprintf(Buf,"Justin");
    iReturn=TextOut(hdcMem,10,10,BufTime,strlen(Buf)); //将位数据再拷贝回去
    memcpy(pBuffer,pBufChange,bufsize); //删除不用的变量
    delete pBufChange;
    DeleteObject(hbitmapMem);
    DeleteObject(hbitmap);
    DeleteDC(hdcMem);
    DeleteDC(hdcBitmap);
    return;
    }////////////////////////////////////////////////////////////////
    看看我的代码,错在哪里?