问题标签 [system.drawing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
4449 浏览

gdi+ - Graphics.MeasureCharacterRanges 给出错误的尺寸计算

我正在尝试将一些文本呈现到 Web 窗体应用程序中图像的特定部分。文本将由用户输入,所以我想改变字体大小以确保它适合边界框。

我的代码在我的概念验证实现中做得很好,但我现在正在尝试对设计器的资产进行测试,这些资产更大,我得到了一些奇怪的结果。

我正在运行大小计算,如下所示:

然后,我使用以下行将文本渲染到我从文件系统中提取的图像上:

在哪里:

  • __fonts是一个PrivateFontCollection
  • PrivateFontCollection.GetFontBySize是一个扩展方法,它返回一个FontFamily
  • RectangleF __textBoundingBox = new RectangleF(150, 110, 212, 64);
  • int __minimumSize = 8;
  • int __startingSize = 48;
  • Brush __brush = Brushes.White;
  • int size从 48 开始并在该循环内递减
  • Graphics gSmoothingMode.AntiAliasTextRenderingHint.AntiAlias设置
  • context是 a (这是 an方法的System.Web.HttpContext摘录)ProcessRequestIHttpHandler

其他方法是:

现在我有两个问题。

首先,文本有时会坚持通过在单词中插入换行符来换行,而此时它不适合并导致 while 循环再次递减。我不明白为什么Graphics.MeasureCharacterRanges当它不应该在一个单词中自动换行时,它会认为它适合盒子。无论使用何种字符集(我用拉丁字母单词以及 Unicode 范围的其他部分,如西里尔文、希腊文、格鲁吉亚文和亚美尼亚文),都会表现出这种行为。我应该使用一些设置来强制Graphics.MeasureCharacterRanges只在空白字符(或连字符)处换行吗?第一个问题与2499067 后相同

其次,在放大到新的图像和字体大小时,Graphics.MeasureCharacterRanges给了我很大的高度。我在其中RectangleF绘制对应于图像的视觉明显区域,因此我可以很容易地看到文本何时减少超过必要。然而,当我给它传递一些文本时,这个GetBounds电话给我的高度几乎是它实际占用的两倍。

使用反复试验设置__minimumSize强制退出 while 循环,我可以看到 24pt 文本适合边界框,但Graphics.MeasureCharacterRanges报告该文本的高度,一旦渲染到图像,是 122px(当边界盒子高 64 像素,适合该盒子)。事实上,在不强制的情况下,while 循环迭代到 18pt,此时Graphics.MeasureCharacterRanges返回一个合适的值。

跟踪日志摘录如下:

将字体大小减小到 24,因为大小为 193×122,限制为 212 ×
64
是 212×64
将字体大小递减为 21,大小为 192×71,限制为 212×64
字体大小递减为 20,大小为 198×68,限制为 212×64
字体大小递减为 19,大小为 185 ×65,限制为 212×64
将 HESSELINK 的 VENNEGOOR 写入 DIN-Black 中 18pt,尺寸为 178×61,限制为 212×64

那么为什么Graphics.MeasureCharacterRanges给我一个错误的结果呢?我可以理解它是,例如,如果循环在 21pt 附近停止时字体的行高(如果我截取结果并在 Paint.Net 中测量它,这在视觉上很合适),但它比它应该做的要远得多因为,坦率地说,它返回了错误的结果。

0 投票
5 回答
3128 浏览

c# - 如何从 System.Drawing.Bitmap 对象中提取原始图像流?

我正在使用.resx文件将图像嵌入到我的程序集中。在运行时,我需要将图像保存到独立文件中,恢复原始内容。如何从System.Drawing.Bitmap实例中提取原始文件流?我知道我可以使用创建流Bitmap.Save(),但这会转码(实际上是膨胀)图像,即使将 PNG 保存为 PNG。

或者也许我的错误是从一开始就阅读Resource它们Bitmap

0 投票
1 回答
1435 浏览

c# - 使用 Visual Studio 2010 Express 创建可以绘制的表面

我来自 Java 背景,并尝试将我编写的 Conway 生命游戏的简单版本移植到 C# 以学习该语言。

在Java 中,我通过从JComponent 继承并覆盖paint() 来绘制我的输出。然后我的新画布类有一个模拟后端的实例,它可以读取/操作。然后,我可以使用 WYSIWYG GUI 编辑器(Matisse,来自 NetBeans)来直观地放置画布。

在 C# 中,我收集到我需要重写 OnPaint() 来绘制东西,这(据我所知)需要我从某些东西继承(我选择了 Panel)。我不知道如何让 Windows 窗体编辑器让我放置自定义类。我也不确定我需要在生成的代码中放置我的类的位置。

我该怎么做,并且将我所有的绘图代码放入一个子类中,我应该怎么做呢?谷歌上缺乏简单的答案表明我在这里遗漏了一些重要的东西。如果有人也想建议一种在 WPF 中执行此操作的方法,我很想听到它。

谢谢

0 投票
2 回答
1086 浏览

text - 如何使用 .Net 2.0 绘制混合格式的文本

有没有办法在 .Net 2.0 中绘制混合格式的文本?我正在寻找类似的东西

我对这种方法的问题是它只允许整个文本使用一种格式样式。但我需要绘制具有不同格式样式的文本(例如,部分文本应加下划线,另一部分加粗等)。

非常感谢!
奥利弗

0 投票
4 回答
590 浏览

c# - 将 GDI 绘图导出到 bmp 时如何获得“真实”颜色

我正在开发一个 ASP.Net Web 处理程序,该处理程序返回在内存中制作的图像System.Windows.Forms.Control,然后使用方法将呈现的控件导出为压缩为 PNG 的位图DrawToBitmap()。除了颜色分配的问题外,这些课程现在已经完全正常工作了。例如,这是由 Web 处理程序生成的 Gauge。

量规

分配给仪表内部的颜色是红色 ( #FF0000)、黄色 ( #FFFF00) 和绿色 ( #00FF00),但我只得到每种颜色的单调版本(#CB100F红色、#CCB70D黄色和#04D50D绿色)。

背景是包含颜色渐变的 bmp 文件。无论背景是作为样本的渐变、黑色画布、白色画布、透明画布,即使没有设置背景,也会发生颜色丢失。

  • 黑色背景

黑色背景

  • 有透明背景

具有透明背景

  • 有白色背景

有白色背景

  • 没有背景设置

没有背景设置

  • Format32bppArgb 中的像素格式

使用像素格式 Format32bppArgb

我尝试了多种位图颜色深度、输出格式、压缩级别等,但它们似乎都不起作用。有任何想法吗?

这是源代码的摘录:

0 投票
2 回答
1737 浏览

c# - 无法在 ASP.Net 中以编程方式使用某些字体

我正在尝试以编程方式在 ASP.Net 中创建具有指定字体的位图。这个想法是文本、字体名称、大小颜色等将从变量中传递,并返回使用字体等的文本位图。但是,我发现我只能使用以下代码和某些字体来做到这一点。

如果我将注释指示的区域中的字体名称更改为 Arial 或 Verdana,则图像和标签都会以正确的字体显示。但是,如果我将两个位置的字体名称更改为“Segoe Script”,标签将显示在 Segoe Script 中,但图像看起来像 Arial。

更新:

基于这里的这个问题,我能够通过使用 PrivateFontCollection() 并像这样加载字体文件来使其工作。

0 投票
1 回答
1918 浏览

c# - 如何调整以编程方式创建的位图的大小以匹配在其上绘制的文本?

我有以下 .ashx 页面,它接受一些查询字符串参数并返回一个位图,上面写有指定的文本。我遇到的问题是,我目前只是手动将位图的初始大小设置为 100 X 100,而我真正想要的是让位图足够大以包含写入其中的所有文本。我怎样才能做到这一点?

更新: 我最终创建了比我需要的更大的位图,从该位图中获取图形并使用 MeasureString 方法来获取我要编写的文本的大小,然后将位图的那部分裁剪成一个新的位图,例如所以。

0 投票
3 回答
25330 浏览

c# - 实例化字体时如何设置多个FontStyles?

在查看 System.Drawing.Font 类的构造函数时,有一个参数可以传入 System.Drawing.FontStyle 枚举中定义的 FontStyles 之一。

IE。粗斜体常规下划线

并且在实例化的对象中有粗体、斜体、下划线等布尔属性,但它们是只读的。

如果我想将我的字体定义为具有多种样式(如粗体和下划线)怎么办?

我怎样才能做到这一点?

0 投票
3 回答
8050 浏览

c# - 使用 DrawString 绘制没有边框的文本

我有这个代码;

但是,当文本被绘制到我的图像上时,它是带有黑色边框或阴影的红色。

如何在没有任何边框或阴影的情况下将文本写入图像?

编辑

我通过添加解决了这个问题;

如果有人可以解释为什么我需要这个,那就太好了。

0 投票
3 回答
3393 浏览

c# - System.Drawing 的撤消按钮?

我正在制作一个图像编辑器,有点为了自己的乐趣,我想知道如何制作一个撤消按钮来撤消我所做的最后一次绘画?我想知道我会怎么做,教程或示例代码会很好,或者至少可以为我指明正确的方向。

谢谢!