【问题标题】:C# Drawstring fit to image with wordwrapC# Drawstring 适合带有 wordwrap 的图像
【发布时间】:2015-10-20 00:49:50
【问题描述】:

如果我的程序未激活,我需要向图像添加文本。此文本应填满整个图像。它还应该根据需要包装和缩放以适合图像。

我找到了很多可行的解决方案来添加这个缩放到图像大小的文本。但在任何情况下,它都只是一行文本,因此也不会像我想要的那样换行。

如何根据图片大小设置字体大小并使用自动换行?

编辑: 这是一个 winform 应用程序。

编辑 2:我尝试做的事情:

FileStream fs = new FileStream(this.MasterPath + @"\***\***\***\" + file.Name, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
Bitmap b = new Bitmap(img);
Graphics graphics = Graphics.FromImage(b);

string text = "Some Text";
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
Font font = new Font("Arial", 120, FontStyle.Regular, GraphicsUnit.Pixel);
SolidBrush brush = new SolidBrush(Color.FromArgb(128, Color.Red));

Rectangle rec = new Rectangle(0, 0, b.Width, b.Height);
float sy = (float)b.Height / (float)1240; //I used 1240 and 1844 because on an image with
float sx = (float)b.Width / (float)1844; //this size the text had the right size
graphics.ScaleTransform(sx, sy);
graphics.DrawString(text, font, brush, rec, stringFormat);

b.Save(this.MasterPath + @"\***\***\***\" + file.Name, img.RawFormat);
img.Dispose();
b.Dispose();

【问题讨论】:

  • 您没有提及您正在制作的应用程序是什么?赢取表格、Web 应用程序、移动应用程序,...?为什么不直接创建一个可以缩放到您需要的任何大小的默认图像?
  • 抱歉,这是一个 winforms 应用程序。
  • 我不使用默认图像,因为目标图像的宽高关系不同,所以默认图像上的文字会被拉伸或者如果我将默认图像居中,不会覆盖整个图像
  • 还有一件事需要澄清,你说你想让文本填满整个图像。您是否希望字体大小缩放以适应空间,或者如果超出宽度,您是否希望文本中断?还是您想根据可用空间生成开始“*”并以这种方式填充?您可以像现在一样将单行文本居中并用单一颜色填充背景或添加边框以模仿图像的大小。
  • 是的,我想要缩放字体大小。找到了解决方案,没问题我也想让文字停下来。找到了解决方案,没问题

标签: c# watermark


【解决方案1】:

这是一个非常粗略的概念。

我认为最简单的解决方案是将表单上的图形替换为 RichTextBox 控件,然后编辑布局使其看起来透明。

然后你可以使用here(@blak3r)解释的解决方案来获得想要的结果。


编辑:
如果您想要从中获取图像,可以使用以下代码:

Bitmap bmp = new Bitmap(richTextBox1.Width, richTextBox1.Height);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(this.PointToScreen(richTextBox1.Location), new Point(0, 0), bmp.Size);
bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
bmp.Dispose();

【讨论】:

  • 这将是一个解决方案,如果我想显示图像,但我需要保存带有文本的图像并做很多其他的事情,比如生成缩略图并显示它在 asp.net 页面上...
  • 我已经在我的回答中添加了如何做到这一点。
  • 但是因此我必须显示图像。但我正在处理数百张图像,用户应该看不到任何图像。
  • 我认为重点是在创建 winform 应用程序时显示它。您是否仔细阅读了this 的完整说明?使用图形渲染技术不考虑自动换行,因此如果您希望正确执行此操作,则必须编写自己的换行实现。这就是 RichTextBox 如此有用的原因。
  • 您也许可以使用此方法,直到获得完美的字体大小,然后自己进行换行,而无需显示图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多