100分 再求问一个问题。 关于PNG透明部分 绘制大号文本异常的问题。 用gdi+ 和gdi都一样。有知道的 追加分,!!!!!! 本帖最后由 lin98666lin 于 2013-11-30 11:16:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 “g.Clear(myColor);” 的问题。 你改改 255,255,255 看 a=0 时 是 没用的;Color myColor(0,255,255,255); 改了改:#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);}不知道行不行 你这个例子 字显示没有问题,但是能转成透明的PNG图片么? 我就是想要一个除了文字部分都是透明的。我在转你这个 看看转成图片之后是不是透明的 不行,还是有背景色,貌似只有没有背景色,就会像我显示的那样,我用 //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);我这么调用 然后保存到本地 是有背景的,我要的是没有背景的。 那就是 除了文字 其他 pixel 的 alpha =0 。(也就是 rgb 也可以 =0),可以把 背景色 搞成 红的 , 存盘 时 把 红色 点 的 alpha 都置 0 这个方法我试过的,效果并不理想。 在处理红色的时候 设置了红色alpha为0,但是文字周边的颜色并不全是红色背景,有一部分已经被改了,我想应该是drawtext 将文字与周围颜色混合了。所以这个方法其实也不行。我测试了下 ps是可以做出 背景透明的大号文字的,应该还有其他的方法吧。 现在在图书馆,回去试下其他方法,gdi+是不是有填充文字路径之类的方法? 用这样的方法 是不是就可行了呢? 下面程序产生 透明的: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不知道你 如何 测试的。 我有个“vcopenpng.zip”是分析png的 可以参考。 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;} Gdiplus::Graphics g(pImage); Color myColor(0,255,255,255); g.Clear( myColor );修正上面的代码 否则达不到透明,修改后 效果没有变化, 还是上图效果。看来大号子 只能填充路径了。 不错,简单。这句是画屏幕吧:Gdiplus::Graphics gMem(pDC->m_hDC);//memdc);我是vc6 在线程里如何给窗口显示状态?书中说不要在线程中使用控件,那怎么办? 控制台窗口横纵比例不同? 拔出u盘就死机 [求助]SetDlgItemText()的工作原理是什么?使用spy++进行窗口消息探测…… 不用atl,用c++写的com注册问题。SOS 急! 基于对话框程序中的打印 VC串口通讯错误:当端口打开时操作无效 help,dll中不包含MFC可以使用CString类么? 如何修改静态文本框的字体和颜色 ado的取值问题!!拜托大家了! WSAStartAsync初始化的Socket的Send/Recv函数是非堵塞的? vc ++ 2010 新手,有没有高手愿意带一下啊??
#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);
}
不知道行不行
你这个例子 字显示没有问题,但是能转成透明的PNG图片么? 我就是想要一个除了文字部分都是透明的。我在转你这个 看看转成图片之后是不是透明的
不行,还是有背景色,貌似只有没有背景色,就会像我显示的那样,
我用
//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);
我这么调用 然后保存到本地 是有背景的,我要的是没有背景的。
,可以把 背景色 搞成 红的 , 存盘 时 把 红色 点 的 alpha 都置 0
这个方法我试过的,效果并不理想。 在处理红色的时候 设置了红色alpha为0,但是文字周边的颜色并不全是红色背景,有一部分已经被改了,我想应该是drawtext 将文字与周围颜色混合了。所以这个方法其实也不行。我测试了下 ps是可以做出 背景透明的大号文字的,应该还有其他的方法吧。 现在在图书馆,回去试下其他方法,gdi+是不是有填充文字路径之类的方法? 用这样的方法 是不是就可行了呢?
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
不知道你 如何 测试的。
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;
}
Color myColor(0,255,255,255);
g.Clear( myColor );修正上面的代码 否则达不到透明,修改后 效果没有变化, 还是上图效果。看来大号子 只能填充路径了。
这句是画屏幕吧:Gdiplus::Graphics gMem(pDC->m_hDC);//memdc);
我是vc6