用.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 * 注释: ...
随机推荐
- Angular2 组件通信
1. 组件通信 我们知道Angular2应用程序实际上是有很多父子组价组成的组件树,因此,了解组件之间如何通信,特别是父子组件之间,对编写Angular2应用程序具有十分重要的意义,通常来讲,组件之间 ...
- 实现放大转场动画 from cocoachina
原文1:http://www.cocoachina.com/ios/20160318/15714.html 原文2:http://ningandjiao.iteye.com/blog/2049105 ...
- java基础高级2 MySQL 高级
1.数据库简介 DDL(数据定义语言) DML(数据操作语言) 2. 准备工作 解压缩文件目录下找到my.ini文件,文件中写入[mysql] default-character set= utf-8 ...
- 在Eclipse中集成Ant配置
提要:本文将向你展示如何使用Eclipse设置为Ant所用的属性值和环境变量,并简要分析如何配置Ant编辑器以便从Eclipse内部操作Ant文件. 一. 修改Ant Classpath 在使用一个可 ...
- log4j 文档
log4j中文文档 中文详细教程 log4j中文文档 这篇文章描述了Log4j的API.独一无二的特色和设计原理.Log4j是一个聚集了许多作者劳动成果的开源软件项目.它允许开发人眼以任意的粒度 ...
- zsh 命令提示符 PROMPT
使用上zsh后,发现命令提示符显示不了当前的路径,和一般的Linux系统默认提示不一致.配置自己的提示符: 更改配置文件.zshrc,添加配置PROMPT='%m:%. $',重新打开一个窗口生效. ...
- Objective-C歌词解析
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { FILE* fp1;//定义文件指针 ...
- PHP 二维数组根据某个字段排序
二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数 一. 手写arraysort PHP的一维数组排序函数: sort 对数组的值按 ...
- [译]:Xamarin.Android平台功能——位置服务
返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...
- [转]js实现各种进制的转换
关键点: parseInt(string, radix).toString(target_radix); 参考:http://www.cnblogs.com/guowei1027/archive/20 ...