|
有需要的带走
[code=csharp]
/// <summary>
/// 把文字转化为一副bitmap型的图像
/// </summary>
/// <param name="text">文字</param>
/// <param name="font">字体,大小</param>
/// <param name="color">颜色</param>
/// <returns>最终生成的图像</returns>
public static Bitmap Text2Bitmap(string text, Font font, Color color)
{
//测量文字大小
Size TextSize = TextRenderer.MeasureText(text, font);
//创建此大小的图片
Bitmap bmp = new Bitmap(TextSize.Width, TextSize.Height);
//使用GDI+绘制
Graphics g = Graphics.FromImage(bmp);
g.DrawString(text, font, new SolidBrush(color), new PointF(0f, 0f));
g.Save();
g.Dispose();
//返回图像
return bmp;
}
private unsafe static GraphicsPath getImageOutline(Image img)
{
if (img == null) return null;
// 建立GraphicsPath, 给我们的位图路径计算使用
GraphicsPath g = new GraphicsPath(FillMode.Alternate);
Bitmap bitmap = new Bitmap(img);
int width = bitmap.Width;
int height = bitmap.Height;
BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte* p = (byte*)bmData.Scan0;
int offset = bmData.Stride - width * 3;
int p0, p1, p2; // 记录左上角0,0座标的颜色值
p0 = p[0];
p1 = p[1];
p2 = p[2];
int start = -1;
// 行座标 ( Y col )
for (int Y = 0; Y < height; Y++)
{
// 列座标 ( X row )
for (int X = 0; X < width; X++)
{
if (start == -1 && (p[0] != p0 || p[1] != p1 || p[2] != p2)) //如果 之前的点没有不透明 且 不透明
{
start = X; //记录这个点
}
else if (start > -1 && (p[0] == p0 && p[1] == p1 && p[2] == p2)) //如果 之前的点是不透明 且 透明
{
g.AddRectangle(new Rectangle(start, Y, X - start, 1)); //添加之前的矩形到
start = -1;
}
if (X == width - 1 && start > -1) //如果 之前的点是不透明 且 是最后一个点
{
g.AddRectangle(new Rectangle(start, Y, X - start + 1, 1)); //添加之前的矩形到
start = -1;
}
//if (p[0] != p0 || p[1] != p1 || p[2] != p2)
// g.AddRectangle(new Rectangle(X, Y, 1, 1));
p += 3; //下一个内存地址
}
p += offset;
}
bitmap.UnlockBits(bmData);
bitmap.Dispose();
// 返回计算出来的不透明图片路径
return g;
}
/// <summary>
/// 得到图像的Region轮廓
/// </summary>
/// <param name="img"></param>
/// <returns>最终生成的轮廓</returns>
public static Region Image2Region(Image img)
{
GraphicsPath g = getImageOutline(img);
if (g == null)
return null;
return new Region(g);
}
/// <summary>
/// 得到文字的轮廓
/// </summary>
/// <param name="text">文字</param>
/// <param name="font">字体,大小</param>
/// <returns>最终生成的轮廓</returns>
public static Region Text2Region(string text, Font font)
{
Bitmap bmp = Text2Bitmap(text, font, Color.Black);
return Image2Region(bmp);
}
[/code]
|
|