[收藏]使用GDI+绘制高质量图和字体

使用GDI+绘制高质量图和字体

对于GDI+,在正常的操作,Bitmap-- Graphcis -- DrawImage或者DrawString ,生成图片的话,会产生很多杂点,或者是图片质量不稳定..尤其是在读取图片后,生成缩略图之后,文件会被压缩而失真..

主要原因是因为没有重新设置Graphics的几个属性..

1.Graphics.SmoothingMode属性: 例如SmoothingMode.HighQuality可以产生高质量图片,但是效率低.

2.Graphics.CompositingQuality 属性: 例如:CompositingQuality.HighQuality也是产生高质量图,效率低下.

3.Graphics.InterpolationMode 属性,例如:InterpolationMode.HighQualityBicubic与前两个也是同样的效果.

这三个属性的值都是enum,具体的enum参数可以查看MSDN的说明..在这里就我不赘述..
如果是对图片进行放大,缩小,可以调整Graphics.CompositingQuality 和Graphics.InterpolationMode 两个属性..如果是图片生成,则可以调整Graphics.SmoothingMode属性..

另外一个问题就是关于文字生成的..按照正常的模式生成的文字,可以很明显的看到文字带有锯齿..解决的办法也是需要修改Graphics的一个属性: Graphics.TextRenderingHint...注意一点,修改TextRenderingHint的话,需要引入System.Drawing.Text,例如:Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;


经过对这四个属性的修改,操作大部分的图片之后,产生的结果都是比较让人满意的..

在这里提供一个简单的例子..是生成印章签名的效果..提供四种字体选择..并产生一个图片..如果你的机器中没有安装指定的几种字体,你需要把字体修改一下...直接把代码拷贝..就可以看到效果...

ASPX页面:
程序代码 程序代码
<%@ Page language="c#" Codebehind="underWrite.aspx.cs" AutoEventWireup="false" Inherits="testItem.movie.underWrite" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>underWrite</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content=" http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <asp:Image id="Image1" style="Z-INDEX: 101; LEFT: 208px; POSITION: absolute; TOP: 360px" runat="server"></asp:Image>
            <asp:HyperLink id="HyperLink1" style="Z-INDEX: 105; LEFT: 304px; POSITION: absolute; TOP: 312px"
                runat="server" NavigateUrl="../mv/index.html">大头帖</asp:HyperLink>
            <asp:TextBox id="name" style="Z-INDEX: 104; LEFT: 208px; POSITION: absolute; TOP: 144px" runat="server"
                MaxLength="4"></asp:TextBox>
            <asp:RadioButtonList id="fontType" style="Z-INDEX: 103; LEFT: 208px; POSITION: absolute; TOP: 184px"
                runat="server" Width="240px">
                <asp:ListItem Value="方正黄草简体" Selected="True">方正黄草简体</asp:ListItem>
                <asp:ListItem Value="汉鼎繁淡古">汉鼎繁淡古</asp:ListItem>
                <asp:ListItem Value="汉鼎繁印篆">汉鼎繁印篆</asp:ListItem>
                <asp:ListItem Value="经典繁桟亭">经典繁桟亭</asp:ListItem>
            </asp:RadioButtonList>
            <asp:Button id="bu" style="Z-INDEX: 102; LEFT: 208px; POSITION: absolute; TOP: 312px" runat="server"
                Text=" 刻 字 "></asp:Button>
        </form>
    </body>
</HTML>



CS文件:

程序代码 程序代码
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace testItem.movie
{
    /** <summary>
    ///        生成印章签名
    /// </summary>
    public class underWrite : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Image Image1;
        protected System.Web.UI.WebControls.RadioButtonList fontType;
        protected System.Web.UI.WebControls.HyperLink HyperLink1;
        protected System.Web.UI.WebControls.Button bu;
        protected System.Web.UI.WebControls.TextBox name;
        
        private void Page_Load(object sender, System.EventArgs e)
        {
            Image1.Visible = false;
        }

        Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /** <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {    
            this.bu.Click += new System.EventHandler(this.Button1_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void Button1_Click(object sender, System.EventArgs e)
        {
            string Name = name.Text;
            if ( Name.Length < 4 ) {
                Response.Write( "请输入最少4个字符!" );
                return;
            }
            
            string FontName = fontType.SelectedValue;
            
            int fontSize = 36;
            int x = 10;
            int y = 10;
            
            switch( FontName ) {
                case "方正黄草简体":
                    x = -8;
                    y = -2;
                    fontSize = 42;
                    break;
                  
                case "汉鼎繁淡古":
                    x = -10;
                    y = -2;
                    break;
                
                case "汉鼎繁印篆":
                    x = -15;
                    y = -2;
                    break;
                
                case "经典繁桟亭":
                    fontSize = 34;
                    x = -10;
                    y = -3;
                    break;                    
            }
            
            Bitmap bm = new Bitmap(110,100,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Font font = new Font(FontName,fontSize,FontStyle.Bold);
            
            Graphics g = Graphics.FromImage( bm );
            
            g.TextRenderingHint =  System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            
            /**//*    这里的三个属性可以根据情况开放.
             *
            //g.CompositingQuality = CompositingQuality.HighQuality;
            //g.SmoothingMode = SmoothingMode.HighQuality;
            //g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            
            */
            g.Clear(Color.Red);        //赋予图像一个背景色
            
            g.DrawString( Name.Substring(2,1),font,new SolidBrush(Color.White),0,2 );
            g.DrawString( Name.Substring(3,1),font,new SolidBrush(Color.White),0,45-y );
            g.DrawString( Name.Substring(0,1),font,new SolidBrush(Color.White),35-x,2 );
            g.DrawString( Name.Substring(1,1),font,new SolidBrush(Color.White),35-x,45-y );
            g.Dispose();
            //设置保存路径
            bm.Save( Server.MapPath("../upload/c.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg );
            bm.Dispose();
            //显示产生的图片
            Image1.ImageUrl = Server.MapPath("../upload/c.jpg") ;
            Image1.Visible = true;
        }
    }
}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用GDI+绘制异形窗口的示例代码: ```c++ #include <windows.h> #include <gdiplus.h> using namespace Gdiplus; LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 初始化GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 创建窗口 HWND hwnd; WNDCLASS wc = {}; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = L"MyWindowClass"; RegisterClass(&wc); hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, L"MyWindowClass", L"异形窗口", WS_POPUP, 100, 100, 400, 300, NULL, NULL, hInstance, NULL); // 设置窗口透明度 SetLayeredWindowAttributes(hwnd, 0, 128, LWA_ALPHA); // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // 清理GDI+ GdiplusShutdown(gdiplusToken); return (int)msg.wParam; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // 创建Graphics对象 Graphics graphics(hdc); // 绘制背景 SolidBrush brush(Color(255, 255, 0, 0)); // 红色 graphics.FillRectangle(&brush, 0, 0, 400, 300); // 绘制不规则形状 GraphicsPath path; path.AddEllipse(50, 50, 200, 100); Region region(&path); graphics.SetClip(&region, CombineModeReplace); // 绘制内部内容 SolidBrush innerBrush(Color(255, 0, 255, 0)); // 绿色 graphics.FillRectangle(&innerBrush, 0, 0, 400, 300); EndPaint(hwnd, &ps); } return 0; case WM_ERASEBKGND: return 1; // 留空,避免默认的擦除背景操作 case WM_NCHITTEST: { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; RECT rc; GetWindowRect(hwnd, &rc); if (PtInRegion(CreateEllipticRgn(50, 50, 250, 150), pt.x - rc.left, pt.y - rc.top)) return HTCLIENT; // 鼠标在不规则形状的区域,返回HTCLIENT表示在客户区 else return HTCAPTION; // 鼠标在其他区域,返回HTCAPTION表示在标题栏 } case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } ``` 上述代码示例创建了一个异形窗口,窗口形状为一个椭圆。在WM_PAINT消息处理函数中,使用Graphics对象进行绘制操作,首先绘制了一个红色的背景矩形,然后使用GraphicsPath对象创建了一个椭圆形状的区域,并将其应用到绘上下文中。最后,绘制了一个绿色的矩形作为内部内容。在WM_NCHITTEST消息处理函数中,根据鼠标坐标和窗口的形状判断鼠标在窗口的哪个区域,并返回相应的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值