文档章节

将文本写在图片上,自定义字体,自动换行,自定义行间距

HJCui
 HJCui
发布于 2016/12/13 10:38
字数 1219
阅读 28
收藏 0
点赞 0
评论 0

java版:https://my.oschina.net/HJCui/blog/804955

将文本写在图片上,自定义字体,自动换行,自定义行间距。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace StringToImg_costomerFont
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = @"张家口市地处京晋冀蒙交界处,距北京约180公里,这里地势险要,有“塞外山城”之称。冬季白雪皑皑,一片北国风光,山上积雪数尺,整冬不化,是滑雪旅游的天然胜地。全市地势西北高、东南低,阴山山脉横贯中部,将全市划分为坝上、坝下两个自然地理区域。坝上地区地势......";

            //string text = @"永和九年,岁在癸丑,暮春之初,会于会稽山阴之兰亭,修禊事也。群贤毕至,少长咸集。此地有崇山峻岭,茂林修竹;又有清流激湍,映带左右,引以为流觞曲水,列坐其次。虽无丝竹管弦之盛,一觞一咏,亦足以畅叙幽情。是日也,天朗气清,惠风和畅,仰观宇宙之大,俯察品类之盛,所以游目骋怀,足以极视听之娱,信可乐也。
            //夫人之相与,俯仰一世,或取诸怀抱,悟言一室之内;或因寄所托,放浪形骸之外。虽趣舍万殊,静躁不同,当其欣于所遇,暂得于己,快然自足,曾不知老之将至。及其所之既倦,情随事迁,感慨系之矣。向之所欣,俯仰之间,已为陈迹,犹不能不以之兴怀。况修短随化,终期于尽。古人云:“死生亦大矣。”岂不痛哉!
            //每览昔人兴感之由,若合一契,未尝不临文嗟悼,不能喻之于怀。固知一死生为虚诞,齐彭殇为妄作。后之视今,亦犹今之视昔。悲夫!故列叙时人,录其所述,虽世殊事异,所以兴怀,其致一也。后之览者,亦将有感于斯文。--Edit by hjcui on 2016-12-8";

            string strSavePath = "C:/test/chn.jpeg";
            addStringToImg(strSavePath, text);
            text = "Why I Love Beijing";
            strSavePath = "C:/test/Eng.jpeg";
            AddTextToImg(strSavePath, text);

        }

        private static void AddTextToImg(string SavePath, string text)
        {
            int phWidth = 642;
            int phHeight = 177;

            #region 绘制图片
            System.IO.Directory.CreateDirectory(Path.GetDirectoryName(SavePath));
            System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Jpeg;
            //Image initImage = (Image)Img.Clone();
            //生成新图
            //新建一个bmp图片
            System.Drawing.Image newImage = new System.Drawing.Bitmap(phWidth, phHeight);
            //新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(newImage);
            //设置质量
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //置背景色
            g.Clear(Color.White);

            //画图
            //g.DrawImage(newImage, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);
            g.DrawImage(newImage, 0, 0);
            //路径       
            //string path = @"C:\德彪钢笔行书字库.TTF";
            string path = @"G:\项目需求\13品牌主页\PingFang Bold.ttf";

            //读取字体文件             
            PrivateFontCollection pfc = new PrivateFontCollection();
            pfc.AddFontFile(path);
            //实例化字体
            float fontSize = 28;
            //关于自定义行间距,stackoverflow 中的解释 
            //Line spacing is a result of the Font you are using.
            //You may need to break your DrawString commands up into multiple calls if you need custom line spacing.
            int a = pfc.Families[0].GetLineSpacing(FontStyle.Regular);

            Font font = new Font(pfc.Families[0], fontSize);
            //设置字体  
            //下面定义一个矩形区域,以后在这个矩形里画上白底黑字  
            float rectX = -1;
            float rectY = -1;
            float rectWidth = phWidth;
            float rectHeight = phHeight;

            //声明矩形域  
            RectangleF textArea = new RectangleF(rectX, rectY, rectWidth, rectHeight);

            //g.FillRectangle(whiteBrush, rectX, rectY, rectWidth, rectHeight);

            StringFormat drawFormat = new StringFormat();
            //drawFormat.FormatFlags = StringFormatFlags.FitBlackBox;
            drawFormat.Alignment = StringAlignment.Center;
            //drawFormat.FormatFlags = StringFormatFlags.DisplayFormatControl;
            drawFormat.LineAlignment = StringAlignment.Center;
            Brush brush = new SolidBrush(Color.FromArgb(135, 135, 135));
            g.DrawString(text, font, brush, textArea, drawFormat);
            int level = 100; //图像质量 1-100的范围
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
            ImageCodecInfo ici = null;
            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.MimeType == "image/jpeg")
                    ici = codec;
            }
            EncoderParameters ep = new EncoderParameters();
            ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)level);
            //保存图
            newImage.Save(SavePath, ici, ep);
            #endregion

            //释放资源
            g.Dispose();
            newImage.Dispose();

            //MemoryStream ms = new MemoryStream();
            ////保存为Jpg类型  
            //bitmap.Save(ms, ImageFormat.Jpeg);
            //Response.Clear();
            //Response.ContentType = "image/jpeg";
            //Response.BinaryWrite(ms.ToArray());
        }

        private static void addStringToImg(string SavePath, string text, string strFontPath = null)
        {
            int phWidth = 642;
            int phHeight = 377;

            //System.IO.Directory.CreateDirectory(Path.GetDirectoryName(SavePath));
            System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Jpeg;
            //新建一个bmp图片
            Image newImage = new Bitmap(phWidth, phHeight);
            //新建一个画板
            Graphics g = Graphics.FromImage(newImage);
            //设置质量
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //置背景色
            g.Clear(Color.White);

            //画图
            //g.DrawImage(newImage, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);
            g.DrawImage(newImage, 0, 0);

            #region 自定义字体
            //路径       
            //string path = @"C:\德彪钢笔行书字库.TTF";
            strFontPath = strFontPath ?? @"C:\华康瘦金体W3.TTF";
            //读取字体文件             
            PrivateFontCollection pfc = new PrivateFontCollection();
            pfc.AddFontFile(strFontPath);
            //实例化字体
            float fontSize = 28;
            Font font = new Font(pfc.Families[0], fontSize);
            #endregion

            // 自定义行间距
            SizeF fit = new SizeF(phWidth, font.Height);
            StringFormat fmt = StringFormat.GenericTypographic;
            //fmt.FormatFlags = StringFormatFlags.LineLimit;
            //int spacing = (int)(1.5 * font.Height);
            int spacing = (int)(10 + font.Height);
            //自定义字体颜色
            Brush brush = new SolidBrush(Color.FromArgb(65, 65, 65));
            int line = 0;
            for (int ix = 0; ix < text.Length; )
            {
                int chars, lines;
                g.MeasureString(text.Substring(ix), font, fit, fmt, out chars, out lines);
                g.DrawString(text.Substring(ix, chars), font, brush, 0, spacing * line);
                ++line;
                ix += chars;
            }
            //保存图
            newImage.Save(SavePath, ImageFormat.Jpeg);
            //释放资源
            g.Dispose();
            newImage.Dispose();
        }
    }

}

关于设置行间距有一点要吐槽,vs提示说StringFormat可以设置行间距,但是翻遍了MSDN愣是没找到相关设置。被微软忽悠了一把。

 

微软支持自动换行,但是不能设置行间距,效果图

自定义行距效果图

© 著作权归作者所有

HJCui
粉丝 6
博文 109
码字总数 80137
作品 0
朝阳
程序员
HTML与CSS基础

Html 标签 斜体 粗体 单独的样式 引用文本 长文本引用 换行 空格 分割线 地址信息 单行代码 多行代码 无序列表 有序列表 表格 表格摘要 表格标题 链接 在新建浏览器窗口中打开链接 使用mailt...

iceuncle ⋅ 2017/11/28 ⋅ 0

css杂类收集2

过滤器实现 div{ filter:alpha(opacity=50); // ie8- -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; / IE 8 / opacity:0.5; // ie9+ and other browser} ps:对于 op......

bosscheng ⋅ 2015/12/11 ⋅ 0

UILabel 使用 标签,圆角,富文本

继承关系:UIView : UIResponder : NSObject ///UILabel 显示的文本只读,无法编辑,可以根据文字个数自动换行; ///UITextField 可编辑本文,但是无法换行,只能一行显示;当点击键盘上的r...

程序猿-樱木花道 ⋅ 2014/02/16 ⋅ 0

css杂类收集

单行不换行显示 需要设置宽度/或者最大宽度 width:xxxpx;overflow:hidden;white-space:nowrap;text-overflow:ellipsis; 如果想要设计input 输入框的边框格式 需要手动添加边框 border:1px s...

bosscheng ⋅ 2015/10/21 ⋅ 0

Android EditText

EditText继承关系:View-->TextView-->EditText   EditText的属性很多,这里介绍几个: android:hint="请输入数字!"//设置显示在空间上的提示信息 android:numeric="integer"//设置只能输...

amigos_wu ⋅ 2012/06/20 ⋅ 0

EditText属性大全

都是网友的结晶,我只是搬运工而已。 android:layoutgravity="centervertical"//设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint="请输入数字!"//设置显示在空间上的提...

simonkjer ⋅ 2012/12/27 ⋅ 0

EditText的各种属性

android:layoutgravity="centervertical"//设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint="请输入数字!"//设置显示在空间上的提示信息 android:numeric="integer"/...

Cory ⋅ 2013/04/25 ⋅ 0

专为微信设计的 UI 库-WeUI

WeUI 是由微信官方设计团队专为微信移动 Web 应用设计的 UI 库。 WeUI 是一套同微信原生视觉体验一致的基础样式库,为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含、、、、、...

ecguo ⋅ 2015/10/13 ⋅ 66

android输入限制

限制输入框中只能输入自己定义的这些字符串 如果输入其它将不予以显示 android:phoneNumber="true" 限制输入框中只能输入手机号码 android:password="true" 限制输入框中输入的任何内容将以"...

buleberry ⋅ 2014/04/07 ⋅ 0

第四章-通过CSS控制字体样式

一.通过CSS控制文本样式: ①设置字体 ②定义行高 {line-height:数值}(例如:{line-height:50px;} ③定义下划线,顶划线,删除线 {text-dec...

湖心亭看雪 ⋅ 2014/10/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 26分钟前 ⋅ 0

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明。 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个...

honeymose ⋅ 30分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 42分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 47分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 49分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 55分钟前 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 57分钟前 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 58分钟前 ⋅ 0

only_full_group_by

我的mysql是在CentOS7.1下面的5.7.17 在 /etc/my.cnf 文件里加上如下: sql_mode='NO_ENGINE_SUBSTITUTION' 然后,重启Mysql服务 systemctl restart mysqld...

SunHacker ⋅ 今天 ⋅ 0

实际项目(SpringBoot项目)中集成Druid

参考网页 https://blog.csdn.net/liuchuanhong1/article/details/55050131 https://blog.csdn.net/CoffeeAndIce/article/details/78707819 https://www.pocketdigi.com/20170530/1577.html 为......

karma123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部