创建画布

Bitmap image = new Bitmap(640, 1136, PixelFormat.Format32bppArgb);
//获得画布,设置高质量抗锯齿相关参数
Graphics g = Graphics.FromImage(image);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

画字体

//获得字体
string path = @"c:\HUAKANGZUOJINHEIW8.TTF";
//读取字体文件
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile(path);
//实例化字体
System.Drawing.Font printFont = new System.Drawing.Font(pfc.Families[0], 50, FontStyle.Regular);
System.Drawing.Font printFont2 = new System.Drawing.Font(pfc.Families[0], 30, FontStyle.Regular);
System.Drawing.Font printFont3 = new System.Drawing.Font("微软雅黑", 20, FontStyle.Regular);
g.DrawString("永恒钻石", font, Brushes.Black, 546, 186);

文字区域内居中换行

//字体在区域居中
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
Rectangle stringRect = new Rectangle(0, 50, 640, 276);
g.DrawString(name, printFont, Brushes.Black, stringRect, sf);

文字在整个画布中居中

计算居中坐标即可

//画名字
SizeF str_size = g.MeasureString(name, printFont);
g.DrawString(name, printFont, Brushes.White, (int)(320 - (str_size.Width / 2)), 285);
Pen p = new Pen(Color.White, 5);

画直线

Pen p = new Pen(Color.White, 5);
g.DrawLine(p, (int)(320 - (str_size.Width / 2)), 285 + str_size.Height, (int)(320 + (str_size.Width / 2)), 285 + str_size.Height);

画圆形头像

//画头像
//获得线笔
Pen pen = new Pen(Color.White, 5);
//新建个圆形路径
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(0, 0, 300, 300);
//先获得头像
Bitmap avator = new Bitmap(GetHttpBitmap(txurl), 300, 300);
//再新建个头像画布,把头像画上去
Bitmap avator_bp = new Bitmap(avator.Width, avator.Height);
using (Graphics gg = Graphics.FromImage(avator_bp))
{
//圆形剪辑路径区域,类似于遮罩
gg.SetClip(gp);
gg.DrawImage(avator, 0, 0);
gg.Dispose();
}
//画头像的圈圈
g.DrawEllipse(pen, 210, 30, 220, 220);
g.DrawImage(avator_bp, 220, 40, 200, 200);
bpp.Dispose();
bppp.Dispose();

压缩保存图片

        public static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
//唯一名称
string guid = Guid.NewGuid().ToString("N"); //设置JPG压缩级别
ImageCodecInfo jgpEncoder = Utils.GetEncoder(ImageFormat.Jpeg);
//见https://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder(v=vs.110).aspx
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 95L);
myEncoderParameters.Param[0] = myEncoderParameter; //可以上传阿里云
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, jgpEncoder, myEncoderParameters);
}
return guid;

缩放旋转

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;
using System.Web; namespace ImageUtils
{
public static class EditImage
{
public static Bitmap ScaleImage(Bitmap img, float scalefactor)
{
Size size = new Size((int)(img.Width * scalefactor), (int)(img.Height * scalefactor));
Bitmap bp = new Bitmap(img, size);
return bp;
} public static Bitmap RotateImage(Bitmap bmp, float angle, Color bkColor)
{
int w = bmp.Width + 2;
int h = bmp.Height + 2; PixelFormat pf; if (bkColor == Color.Transparent)
{
pf = PixelFormat.Format32bppArgb;
}
else
{
pf = bmp.PixelFormat;
} Bitmap tmp = new Bitmap(w, h, pf);
Graphics g = Graphics.FromImage(tmp);
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.Clear(bkColor);
g.DrawImageUnscaled(bmp, 1, 1);
g.Dispose(); GraphicsPath path = new GraphicsPath();
path.AddRectangle(new RectangleF(0f, 0f, w, h));
Matrix mtrx = new Matrix();
mtrx.Rotate(angle);//矩阵变换
RectangleF rct = path.GetBounds(mtrx);//获取边界 Bitmap dst = new Bitmap((int)rct.Width, (int)rct.Height, pf);
g = Graphics.FromImage(dst);
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.Clear(bkColor);
g.TranslateTransform(-rct.X, -rct.Y);//因为rct的值为负
g.RotateTransform(angle);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;//.HighQualityBilinear;
g.DrawImageUnscaled(tmp, 0, 0);
g.Dispose(); tmp.Dispose(); return dst;
}
}
}

单位换算

/// <summary>
/// 毫米转为像素(注:dpi分水平和垂直,获取方法为得到 Graphics 的实例化对象 g,调用g.DpiX、g.DpiY)
/// </summary>
/// <param name="mm">毫米</param>
/// <param name="fDPI">分辨率(水平/垂直)</param>
/// <returns></returns>
public static float MillimetersToPixel(float mm, float fDPI)
{
//毫米转像素:mm * dpi / 25.4
return (float)Math.Round((mm * fDPI / 25.4f), 2);
}
/// <summary>
/// 像素转为毫米(注:dpi分水平和垂直,获取方法为得到 Graphics 的实例化对象 g,调用g.DpiX、g.DpiY)
/// </summary>
/// <param name="px">像素</param>
/// <param name="fDPI">分辨率(水平/垂直)</param>
/// <returns></returns>
public static float PixelToMillimeters(float px, float fDPI)
{
//像素转毫米:px * 25.4 / dpi
return (float)Math.Round(((px * 25.4f) / fDPI), 2); ;
}
/// <summary>
/// 英寸到像素
/// </summary>
/// <param name="inches"></param>
/// <returns></returns>
public static float InchesToPixels(float inches, float fDPI)
{
return (float)Math.Round(inches * fDPI, 2);
}
/// <summary>
/// 像素到英寸
/// </summary>
/// <param name="px"></param>
/// <returns></returns>
public static float PixelsToInches(float px, float fDPI)
{
return (float)Math.Round(px / fDPI, 2);
}
/// <summary>
/// 毫米到英寸
/// </summary>
/// <param name="mm"></param>
/// <returns></returns>
public static float MillimetersToInches(float mm)
{
return (float)Math.Round(mm / 25.4f, 2);
}
/// <summary>
/// 英寸到毫米
/// </summary>
/// <param name="mm"></param>
/// <returns></returns>
public static float InchesToMillimeters(float Inches)
{
return (float)Math.Round(Inches * 25.4f, 2);
}

C# GDI+开发手记的更多相关文章

  1. [分享]源代码&开发手记:SAE应用“车百科” (Python + SAE + Bottle + Bootstrap) - Bottle - Python4cn(news, jobs)

    [分享]源代码&开发手记:SAE应用"车百科" (Python + SAE + Bottle + Bootstrap) - Bottle - Python4cn(news, ...

  2. HoloLens开发手记 - HoloLens真机上手简评

    千呼万唤始出来,终于今天拿到了HoloLens真机. 使用体验 使用自带的应用录制了一段使用视频,如下 设备概览 包装盒 本体 试戴 实际效果 GalaxyExplorer试玩 全息图像贴到现实场景表 ...

  3. [转]Unity3D新手引导开发手记

    直接跳转吧  Unity3D新手引导开发手记 看到还不错就直接转过来了,我是有多懒啊

  4. [转]Nodejs开发框架Express4.x开发手记

    Express: ?web application framework for?Node.js? Express 是一个简洁.灵活的 node.js Web 应用开发框架, 它提供一系列强大的特性,帮 ...

  5. Doris开发手记4:倍速性能提升,向量化导入的性能调优实践

    最近居家中,对自己之前做的一些工作进行总结.正好有Doris社区的小伙伴吐槽向量化的导入性能表现并不是很理想,就借这个机会对之前开发的向量化导入的工作进行了性能调优,取得了不错的优化效果.借用本篇手记 ...

  6. 大型B2B网站开发手记 1

    本手记记录所有该B2B网站开发中遇到的问题和解决方法,一方面给大家一些思路,一方面提升自己,记录整个过程 1. 测试环境部署问题 部署环境是server2012 R2,部署上去发现WCF报错如下 sv ...

  7. GDI 开发的准备工作

    1 需要的链接库和头文件 大部分函数在 Gdi.dll 和 Gdi32.dll 提供.相关的函数接口和结构都在 Wingdi.h 文件中(如果工程中已包含 Windows.h 就不需要再包含了,因为 ...

  8. APP开发手记01(app与web的困惑)

    文章链接:http://quke.org/post/app-dev-fragment.html (转载时请注明本文出处及文章链接) 最近在用博客园的wcf服务做博客园的android和ios的app, ...

  9. Doris开发手记2:用SIMD指令优化存储层的热点代码

    最近一直在进行Doris的向量化计算引擎的开发工作,在进行CPU热点排查时,发现了存储层上出现的CPU热点问题.于是尝试通过SIMD的指令优化了这部分的CPU热点代码,取得了较好的性能优化效果.借用本 ...

随机推荐

  1. (3)-JSONObject的过滤设置

    我们通常对一个json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值.例如下面的类:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  2. Reverting back to the R12.1.1 and R12.1.3 Homepage Layout

    Reverting back to the 12.1.1 Homepage Layout Set the following profiles: FND: Applications Navigator ...

  3. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  4. Spring AOP 自定义注解获取http接口及WebService接口入参和出参

    注解方法实现过程中可以采用如下获取方式:—以下为例  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHo ...

  5. 【分分钟内搭建一个带用户系统的博客程序(一)用户系统】asp.net core的Identity真香,EF真香!

    不用不知道,一用香到爆. 老哥是个屌丝前端,但也想写点web应用耍一耍.之前弄过了NodeJs,也弄过JAVA,最近由于写游戏的原因用C#,索性上手一波asp.net core. 这篇博客记录的是,如 ...

  6. api接口响应类型定义

    public class Response<T> { public ResponseStatus Status { get; set; } public string Message { ...

  7. 重新打造的我的Pugo

    Pugo博客已经搭建了好几个月了吧,给我感受到非常方便的就是,我换了好多VPS,迁移显得非常的方便,但是也有不足的地方,比如发布一篇新的博客,我每次都需要重新进入后台进行新的Post,还需要重新bui ...

  8. epoll好文章

    https://www.cnblogs.com/apprentice89/p/3234677.html https://www.jianshu.com/p/aa486512e989 https://c ...

  9. K - 欧拉回路(并查集)

    点击打开链接 K - 欧拉回路 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第 ...

  10. SQL注入不简单?那是你没有懂它的原理~

    我们真的了解SQL注入吗? 不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏 ...