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

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

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

设置成透明的,即可。

    #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. [转]python 常用类库!

    Python学习 On this page... (hide) 1. 基本安装 2. Python文档 2.1 推荐资源站点 2.2 其他参考资料 2.3 代码示例 3. 常用工具 3.1 Pytho ...

  2. The difference between QA, QC, and Test Engineering

    Tuesday, March 06, 2007 Posted by Allen Hutchison, Engineering Manager and Jay Han, Software Enginee ...

  3. repo 修改邮箱地址

    需要重新运行 repo init 被带上参数: --config-name xx@a.com

  4. Windows 网络编程

    网络编程 API ,失败返回 -,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPRO ...

  5. 开发维护大型 Java 项目的建议

    假设你是正在开发和维护一个包含2000个类并使用了很多框架的Java开发者.你要如何理解这些代码?在一个典型的Java企业项目小组中,大部 分能够帮你的高级工程师看起来都很忙.文档也很少.你需要尽快交 ...

  6. DataGridView里CheckBox实现全选控制

    1. checkbox点击事件 private void myStyleDataGridView1_CellClick(object sender, DataGridViewCellEventArgs ...

  7. json_decode返回NULL

    最近在调用某公司的API时,将对方返回的数据,使用PHP的json_decode函数解析,但是返回NULL,最终排查为对方传送来的json格式有误 打印$_REQUEST,数据结构大致如下: arra ...

  8. js获取网页中宽高度集合

    document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...

  9. [Python数据分析]新股破板买入,赚钱几率如何?

    这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...

  10. C#重启IIS指定网站和指定应用程序池

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...