本帖最后由 lin98666lin 于 2013-11-30 11:16:40 编辑

解决方案 »

  1.   

    “g.Clear(myColor);” 的问题。 
      

  2.   

    你改改 255,255,255 看 a=0 时 是 没用的;Color   myColor(0,255,255,255);
      

  3.   

    改了改:#define W 200
    #define H 50void CPngbarView::Test(CDC *pDC)
    {
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap bm,*Old;
    bm.CreateCompatibleBitmap(pDC,W,H);
    Old=memDC.SelectObject(&bm);
    Rect rcText(0,0,W,H);
        memDC.FillSolidRect((CRect*)&rcText,RGB(255,255,255));// 白色 底
    //
    Graphics g(memDC);
    //
    SolidBrush br(Color(128, 255, 0, 0));// 红色 半透明
    g.FillRectangle(&br,rcText);
    // 输出文字
    WCHAR sText[] = L"测试测试测试";
    FontFamily   fontFamily(L"宋体");
    Font         font(&fontFamily, 22, FontStyleRegular, UnitPoint);
    PointF       pointF(10.0f, 10.0f);// 左上
    SolidBrush   solidBrush(Color(255, 0, 0, 255));// 不透明 蓝 
    g.DrawString(sText,6, &font, pointF, 0, &solidBrush);
    //  输出到屏幕
    pDC->BitBlt(0,0,W,H,&memDC,0,0,SRCCOPY);
    //
    memDC.SelectObject(Old);
    DeleteObject(bm);
    DeleteObject(memDC);
    }
    不知道行不行
      

  4.   


    你这个例子 字显示没有问题,但是能转成透明的PNG图片么? 我就是想要一个除了文字部分都是透明的。我在转你这个 看看转成图片之后是不是透明的
      

  5.   


    不行,还是有背景色,貌似只有没有背景色,就会像我显示的那样,
    我用
    //1:建立透明内存32位位图文件;
    Image* pImage =new Bitmap( 200,50, PixelFormat32bppARGB );
    Gdiplus::Graphics gi(pImage);
    Color   myColor(0,255,255,255);
    gi.Clear( myColor ); HDC hDc = gi.GetHDC(); BitBlt(hDc,0,0,W,H,memDC.m_hDC,0,0,SRCCOPY); gi.ReleaseHDC(hDc); CLSID pngClsid;
    GetEncoderClsid(L"image/png", &pngClsid);
    pImage->Save(L"D:\\Mosaic2.png", &pngClsid, NULL);
    我这么调用 然后保存到本地 是有背景的,我要的是没有背景的。
      

  6.   

    那就是 除了文字 其他 pixel 的 alpha =0 。(也就是 rgb 也可以 =0)
    ,可以把 背景色 搞成 红的 , 存盘 时 把 红色 点 的 alpha 都置 0
      

  7.   


    这个方法我试过的,效果并不理想。  在处理红色的时候 设置了红色alpha为0,但是文字周边的颜色并不全是红色背景,有一部分已经被改了,我想应该是drawtext 将文字与周围颜色混合了。所以这个方法其实也不行。我测试了下 ps是可以做出 背景透明的大号文字的,应该还有其他的方法吧。 现在在图书馆,回去试下其他方法,gdi+是不是有填充文字路径之类的方法? 用这样的方法 是不是就可行了呢?
      

  8.   

    下面程序产生 透明的:
    void CPngbarView::Test(CDC *pDC)
    {
    #if 1
    Image* pImage = new Bitmap(W, H, PixelFormat32bppARGB);
    Graphics g(pImage);
    //
    Color myColor(0,255,255,255);
    g.Clear( myColor );
    // 输出文字
    Rect rcText(0,0,W,H);
    WCHAR sText[] = L"测试测试测试";
    FontFamily   fontFamily(L"宋体");
    Font         font(&fontFamily, 22, FontStyleRegular, UnitPoint);
    PointF       pointF(10.0f, 10.0f);// 左上
    SolidBrush   solidBrush(Color(255, 0, 0, 255));// 不透明 蓝 
    g.DrawString(sText,6, &font, pointF, 0, &solidBrush);
    // Save to file
    CLSID pngClsid;
    GetEncoderClsid(L"image/png", &pngClsid);
    pImage->Save(L"Mosaic.png", &pngClsid, NULL);
    #else
    不知道你 如何 测试的。
      

  9.   

    我有个“vcopenpng.zip”是分析png的 可以参考。
      

  10.   


    3Q 给了不少建议,我刚才试了下,还是文字填充路径的方法好点。看效果和ps差不多,ps的大号透明文字应该也用了这个。以下给出代码 并结贴! LRESULT CMainDlg::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
    CPaintDC _dc(m_hWnd);
    RECT rcClient;
    GetClientRect(&rcClient); CMemoryDC _memdc(_dc,rcClient); _memdc.FillSolidRect(&rcClient,RGB(255,255,255)); Gdiplus::Graphics gMem(_memdc); //1:建立透明内存32位位图文件;
    Image* pImage =new Bitmap( 900,200, PixelFormat32bppARGB );
    Gdiplus::Graphics g(pImage);
    Color   myColor(255,255,255,255);
    g.Clear( myColor );
    FontFamily   fontFamily(L"微软雅黑");
    Gdiplus::StringFormat sfFormat(Gdiplus::StringFormat::GenericTypographic());
    SolidBrush sBrush(Color(254,255,0,0)); Gdiplus::PointF pt(0,0);
    Gdiplus::GraphicsPath gPath;
    gPath.AddString(sTest.c_str(),sTest.length(),&fontFamily,0,72,pt,&sfFormat);  g.FillPath(&sBrush,&gPath);  gMem.DrawImage(pImage,50,50);
    //gp.DrawImage(pImage,50,50,200,50); return TRUE;
    }
      

  11.   

    Gdiplus::Graphics g(pImage);
    Color   myColor(0,255,255,255);
    g.Clear( myColor );修正上面的代码 否则达不到透明,修改后 效果没有变化, 还是上图效果。看来大号子 只能填充路径了。
      

  12.   

    不错,简单。
    这句是画屏幕吧:Gdiplus::Graphics gMem(pDC->m_hDC);//memdc);
    我是vc6