100分 再求问一个有关问题。 关于PNG透明部分 绘制大号文本错误的有关问题。 用gdi+ 和gdi都一样。有知道的 追加分,

100分 再求问一个问题。 关于PNG透明部分 绘制大号文本异常的问题。 用gdi+ 和gdi都一样。有知道的 追加分,!!!!!!
本帖最后由 lin98666lin 于 2013-11-30 11:16:40 编辑

1.描述:
  我想做一个png图片,创建一个背景透明的gdi+对象,再调用drawstring或者 drawtext将文字绘制上,然后保存成图片,但是遇到了问题。
2.效果图:
   100分 再求问一个有关问题。 关于PNG透明部分 绘制大号文本错误的有关问题。  用gdi+ 和gdi都一样。有知道的 追加分,

3.code:

CPaintDC _dc(m_hWnd);
RECT rcClient;
GetClientRect(&rcClient);

CMemoryDC _memdc(_dc,rcClient);

_memdc.FillSolidRect(&rcClient,RGB(255,255,255));

std::wstring sText = _T("测试测试测试");
LOGFONT gLogFont;
SystemParametersInfo(SPI_GETICONTITLELOGFONT,sizeof(LOGFONT),&gLogFont,0);
gLogFont.lfHeight = -22;
HFONT hFont = CreateFontIndirect(&gLogFont);
//HFONT hOld = _memdc.SelectFont(hFont);
////DeleteObject(hFont);
//DrawText(_memdc.m_hDC,sText.c_str(),sText.length(),&rcClient,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);

//1:建立透明内存32位位图文件;
Image* pImage =new Bitmap( 200,50, PixelFormat32bppARGB );
Gdiplus::Graphics g(pImage);


Color   myColor(0,255,255,255);
g.Clear( myColor );

HDC hDc = g.GetHDC();
SelectFont(hDc,hFont);

        //如果这里的alpha设置为255 就完全没有问题,
                //去掉这句就好了
SetBkMode(hDc,TRANSPARENT); 



::SetTextColor(hDc,RGB(0,162,232));

RECT rcText = {0,0,200,50};
DrawText(hDc,sText.c_str(),sText.length(),&rcText,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);

g.ReleaseHDC(hDc);

Gdiplus::Graphics gp(_memdc);

gp.DrawImage(pImage,50,50,200,50);

mfc  wtl  界面 png

------解决方案--------------------
你改改 255,255,255 看 a=0 时 是 没用的;Color   myColor(0,255,255,255);
------解决方案--------------------
改了改:

#define W 200
#define H 50

void 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);
}

100分 再求问一个有关问题。 关于PNG透明部分 绘制大号文本错误的有关问题。  用gdi+ 和gdi都一样。有知道的 追加分,
不知道行不行
------解决方案--------------------
那就是 除了文字 其他 pixel 的 alpha =0 。(也就是 rgb 也可以 =0)
,可以把 背景色 搞成 红的 , 存盘 时 把 红色 点 的 alpha 都置 0
------解决方案--------------------
下面程序产生 透明的:
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);