最近的一个项目需要用到这个东西,冥思苦想了好几天。还是在同事的帮助下,完成此项难题,希望能够帮助以后的博友们 !

废话不多说,先看看效果图吧。

首先写一下讲一下思路,首先画一张图,当你的背景,然后在图上写字,写的字体最好是粗体,不好太多字,颜色最后用一般不常用的颜色,然后读取这些颜色所在的位置,

设置成透明的,即可。

    #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在画出镂空图片的更多相关文章

  1. 如何将matlab画出的图片保存为要求精度

    · 来源:http://emuch.net/bbs/viewthread.php?tid=2705843 杂志社对投稿图片的分辨率通常有如下要求: TIFF: Colour or greyscale ...

  2. 用canvas 画出圆形图片

    /** * 把图片处理成圆形,如果不是正方形就按最小边一半为半径处理 * @param {object} imgObj 图片(img)对象 * @param {number} imgType 设置生成 ...

  3. win2d 通过 CanvasActiveLayer 画出透明度和裁剪

    本文告诉大家如果在 UWP 的 win2d 通过 CanvasActiveLayer 创建一层,在这里画出的图片有透明度或者裁剪 在 win2d 如果需要对某个元素裁剪,可以使用很多方法,本文只是告诉 ...

  4. 利用ggplot2画出各种漂亮图片详细教程

    1.Why use ggplot2 ggplot2是我见过最human friendly的画图软件,这得益于Leland Wilkinson在他的著作<The Grammar of Graphi ...

  5. H5坦克大战之【画出坦克】

    今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双, ...

  6. 纯CSS3画出小黄人并实现动画效果

    前言 前两天我刚发布了一篇CSS3实现小黄人动画的博客,但是实现的CSS3动画是基于我在站酷网找到的一张小黄人的jpg格式图片,并自己用PS抠出需要实现动画的部分,最后才完成的动画效果.但是,其实我的 ...

  7. Android中利用画图类和线程画出闪烁的心形

                                                        本文讲解主要涉及的知识点: 1.线程控制 2.画图类 3.心形函数 大家先看图片: <ig ...

  8. WPF 如何画出1像素的线

    如何有人告诉你,请你画出1像素的线,是不是觉得很简单,实际上在 WPF 上还是比较难的. 本文告诉大家,如何让画出的线不模糊 画出线的第一个方法,创建一个 Canvas ,添加一个线 界面代码 < ...

  9. java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法

    /** *@author blovedr * 功能: java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法 * 日期: 2018年4月28日     16:20 * 注释: ...

随机推荐

  1. xpath定位中starts-with、contains和text()的用法

    starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...

  2. jQuery最佳实践

    1:事件的委托处理(Event Delegation) javascript的事件模型,采用"冒泡"模式,也就是说,子元素的事件会逐级向上"冒泡",成为父元素的 ...

  3. Sublime 3 如何设置xftp 排除文件夹“bower_components”,“node_modules”

    “bower_components”,“node_modules”这个文件夹,作为模块得引用文件,不需要下载本地进行编码,这里得文件非常多,若是不把这个两个文件夹排除掉掉话,通过xftp下载所有文件的 ...

  4. tableview最后一行显示不全

    最后一行显示不全是因为表格的高度大于了控制view的高度,减小表格的高度小于的等于控制的view的高度即可

  5. MapReduce工作原理图文详解

    目录:1.MapReduce作业运行流程2.Map.Reduce任务中Shuffle和排序的过程 1.MapReduce作业运行流程 流程示意图: 流程分析: 1.在客户端启动一个作业. 2.向Job ...

  6. 获取url中指定的参数

    function GetRequest(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(& ...

  7. leetcode 137[转]

    没思路.网上找到的. 1. 将每一个int看成32位数,统计每一位出现的次数对3取余,所以需要开辟一个32大小的数组来统计每一位出现的次数 2. 对第一种思路进行简化,模拟3进制: three two ...

  8. Flume(2)组件概述与列表

    上一节搭建了flume的简单运行环境,并提供了一个基于netcat的演示.这一节继续对flume的整个流程进行进一步的说明. 一.flume的基本架构图: 下面这个图基本说明了flume的作用,以及f ...

  9. 修改MS SQL忽略大小写 分类: SQL Server 数据库 2015-06-19 09:18 34人阅读 评论(0) 收藏

    第一步:数据库->属性->选项->限制访问:SINGLE_USER 第二步:ALTER DATABASE [数据库名称] collate Chinese_PRC_CI_AI 第三步: ...

  10. 基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理

    http://www.cnblogs.com/wuhuacong/p/4175266.html 在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如PDF.Word.Excel ...