用.net在画出镂空图片
最近的一个项目需要用到这个东西,冥思苦想了好几天。还是在同事的帮助下,完成此项难题,希望能够帮助以后的博友们 !
废话不多说,先看看效果图吧。

首先写一下讲一下思路,首先画一张图,当你的背景,然后在图上写字,写的字体最好是粗体,不好太多字,颜色最后用一般不常用的颜色,然后读取这些颜色所在的位置,
设置成透明的,即可。
    #region 文字生成镂空图片 
        static string BuildTextImage(string text, string bgImage)
        {
            int ImgWidth = , ImgHeight = , StartSize = ;
            #region 复制背景图特殊颜色填写文字--
 
            var bucket = OpenUtility.GetBucket(bgImage);
            var result = FileHub.GetStream(bucket, bgImage);
            if (result.Status != UFile.Data.ActionStatus.SUCCESS)
            {
                return "";
            }
            var stream = result.Data;
            Bitmap bitmap = new Bitmap(stream);
            ImgWidth = bitmap.Width;
            ImgHeight = bitmap.Height;
            Graphics g = Graphics.FromImage(bitmap);
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            g.FillRectangle(new SolidBrush(Color.White), , , bitmap.Width, bitmap.Height);
            using (Font font1 = new Font("Arial", , FontStyle.Bold, GraphicsUnit.Pixel))
            {
                Rectangle rect1 = new Rectangle(, , ImgWidth, ImgHeight);
                StringFormat stringFormat = new StringFormat();
                stringFormat.Alignment = StringAlignment.Center;
                stringFormat.LineAlignment = StringAlignment.Center;
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                Font goodFont = FindGoodFont(g, text, rect1.Size, font1, GraphicsUnit.Pixel);
                g.DrawString(text, goodFont, Brushes.Black, rect1, stringFormat);
            }
            g.Dispose();
            //bitmap.Save(text + ".jpg", ImageFormat.Jpeg);
            #endregion
            #region 画格子
            Bitmap reff = new Bitmap(ImgWidth, ImgHeight);
            Graphics gi = Graphics.FromImage(reff);
            Image img = Image.FromStream(stream);
            gi.DrawImage(img, new Rectangle(, , ImgWidth, ImgHeight));
            var rows = ImgHeight / StartSize;
            var cols = ImgWidth / StartSize;
            var coords = new List<string>();
            for (int j = ; j < rows; j++)
            {
                for (int i = ; i < cols; i++)
                {
                    var total = StartSize * StartSize;
                    var cur = ;
                    for (int ii = ; ii < StartSize; ii++)
                    {
                        for (int jj = ; jj < StartSize; jj++)
                        {
                            var posx = i * StartSize + ii;
                            var posy = j * StartSize + jj;
                            byte color = bitmap.GetPixel(posx, posy).R;
                            if (color == )
                            {
                                cur++;
                                reff.SetPixel(posx, posy, Color.Transparent);
                            }
                        }
                    }
                    if (cur > total * 0.02)
                    {
                        coords.Add("[" + i + "," + j + "]");
                    }
                }
            }
            //StreamWriter sw = new StreamWriter(text + ".txt");
            //sw.Write("[" + string.Join(",", coords.ToArray()) + "]");
            //sw.Close();
            gi.Dispose();
            string path = string.Empty;
            //reff.Save("d:\\"+Guid.NewGuid.ToString() + "_cover.png", ImageFormat.Png);
            using (var ms = new System.IO.MemoryStream())
            {
                reff.Save(ms, ImageFormat.Png);
                var mime = OpenUtility.GetMimeType(bgImage);
                path = "/Uploads/Files/" + string.Format("{0:yyyy/MM/dd}", DateTime.Now) + "/" + Guid.NewGuid().ToString() + ".png";
                FileHub.Put(bucket, path, ms, mime);
            }
            #endregion 
            return path;
        }
        private static Font FindGoodFont(Graphics Graf, string sStringToFit,
                                    Size TextRoomAvail,
                                    Font FontToUse,
                                    GraphicsUnit FontUnit)
        {
            // Find out what the current size of the string in this font is
            SizeF RealSize = Graf.MeasureString(sStringToFit, FontToUse);
            if ((RealSize.Width <= TextRoomAvail.Width) && (RealSize.Height <= TextRoomAvail.Height))
            {
                // The current font is fine...
                return FontToUse;
            }
            // Either width or height is too big...
            // Usually either the height ratio or the width ratio
            // will be less than 1. Work them out...
            float HeightScaleRatio = TextRoomAvail.Height / RealSize.Height;
            float WidthScaleRatio = TextRoomAvail.Width / RealSize.Width;
            // We'll scale the font by the one which is furthest out of range...
            float ScaleRatio = (HeightScaleRatio < WidthScaleRatio) ? ScaleRatio = HeightScaleRatio : ScaleRatio = WidthScaleRatio;
            float ScaleFontSize = FontToUse.Size * ScaleRatio;
            // Retain whatever the style was in the old font...
            FontStyle OldFontStyle = FontToUse.Style;
            // Get rid of the old non working font...
            FontToUse.Dispose();
            // Tell the caller to use this newer smaller font.
            FontToUse = new Font(FontToUse.FontFamily,
                                    ScaleFontSize,
                                    OldFontStyle,
                                    FontUnit);
            return FontToUse;
        } #endregion
用.net在画出镂空图片的更多相关文章
- 如何将matlab画出的图片保存为要求精度
		· 来源:http://emuch.net/bbs/viewthread.php?tid=2705843 杂志社对投稿图片的分辨率通常有如下要求: TIFF: Colour or greyscale ... 
- 用canvas 画出圆形图片
		/** * 把图片处理成圆形,如果不是正方形就按最小边一半为半径处理 * @param {object} imgObj 图片(img)对象 * @param {number} imgType 设置生成 ... 
- win2d 通过 CanvasActiveLayer 画出透明度和裁剪
		本文告诉大家如果在 UWP 的 win2d 通过 CanvasActiveLayer 创建一层,在这里画出的图片有透明度或者裁剪 在 win2d 如果需要对某个元素裁剪,可以使用很多方法,本文只是告诉 ... 
- 利用ggplot2画出各种漂亮图片详细教程
		1.Why use ggplot2 ggplot2是我见过最human friendly的画图软件,这得益于Leland Wilkinson在他的著作<The Grammar of Graphi ... 
- H5坦克大战之【画出坦克】
		今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双, ... 
- 纯CSS3画出小黄人并实现动画效果
		前言 前两天我刚发布了一篇CSS3实现小黄人动画的博客,但是实现的CSS3动画是基于我在站酷网找到的一张小黄人的jpg格式图片,并自己用PS抠出需要实现动画的部分,最后才完成的动画效果.但是,其实我的 ... 
- Android中利用画图类和线程画出闪烁的心形
		本文讲解主要涉及的知识点: 1.线程控制 2.画图类 3.心形函数 大家先看图片: <ig ... 
- WPF 如何画出1像素的线
		如何有人告诉你,请你画出1像素的线,是不是觉得很简单,实际上在 WPF 上还是比较难的. 本文告诉大家,如何让画出的线不模糊 画出线的第一个方法,创建一个 Canvas ,添加一个线 界面代码 < ... 
- java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法
		/** *@author blovedr * 功能: java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法 * 日期: 2018年4月28日 16:20 * 注释: ... 
随机推荐
- Linux下多线程下载利器 axel
			参考 https://teddysun.com/377.html 使用示例: axel -an https://ubuntu-mate.org/raspberry-pi/ubuntu-mate-16. ... 
- 在js中获取在css中设置的background-image值
			1. html部分 <div class="bg-color-two" id="bg_color_two" onclick="setBg(thi ... 
- Linux 添加完硬盘后,如何挂载和分区、以及其他的分区不足,如何从新的硬盘上挂载借用
			挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看到除了当前的第一块硬盘外还有一块sdb的第二块硬盘,然后用fdisk /dev/sdb 进行分区 进入fdisk命令,输入h可以看到该命令的 ... 
- android初练二
			android 之 Activity的启动方式 1.android的显示启动 显示启动一般用于在用自己的活动时进行页面跳转时常常使用到 public class MainActivity extend ... 
- tp框架的增删改查
			首先,我们来看一下tp框架里面的查询方法: 查询有很多种,代码如下: <?php namespace Admin\Controller; use Think\Controller; class ... 
- C# winform 跨线程更改窗体控件的属性
			当winform程序中新开一个线程,是无法改变主线程中窗体控件的属性的,否则运行时会报错. 若想在其他线程中控制主线程中的窗体控件,则必须利用BeginInvoke方法. 例如:添加一个名为textb ... 
- ios项目里扒出来的json文件
			p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ... 
- 基于ACE的c++线程封装
			1. 基本需求 1) 一个基类,其某个方法代表一个线程的生命运行周期.之后通过继承自这个基类来实现个性化线程类: 2) 具备类似QObject的定时器设置功能: 3) 提供在线程对象中同步和异步执行方 ... 
- Duilib源码分析(二)控件构造器—CDialogBuilder
			上一节了解了大体流程,但是界面控件元素是如何被加载.解析.构建.管理.控件消息如何处理的呢?接下来我们将结合控件构造器进行分析: CDialogBuilder:控件构造器,主要用以解析xml配置文件并 ... 
- JS 数据类型转换
			JS 数据类型转换 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ... 
