问题标签 [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.
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 g
有SmoothingMode.AntiAlias
并TextRenderingHint.AntiAlias
设置context
是 a (这是 an方法的System.Web.HttpContext
摘录)ProcessRequest
IHttpHandler
其他方法是:
现在我有两个问题。
首先,文本有时会坚持通过在单词中插入换行符来换行,而此时它不适合并导致 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 中测量它,这在视觉上很合适),但它比它应该做的要远得多因为,坦率地说,它返回了错误的结果。
c# - 如何从 System.Drawing.Bitmap 对象中提取原始图像流?
我正在使用.resx
文件将图像嵌入到我的程序集中。在运行时,我需要将图像保存到独立文件中,恢复原始内容。如何从System.Drawing.Bitmap
实例中提取原始文件流?我知道我可以使用创建流Bitmap.Save()
,但这会转码(实际上是膨胀)图像,即使将 PNG 保存为 PNG。
或者也许我的错误是从一开始就阅读Resource
它们Bitmap
?
c# - 使用 Visual Studio 2010 Express 创建可以绘制的表面
我来自 Java 背景,并尝试将我编写的 Conway 生命游戏的简单版本移植到 C# 以学习该语言。
在Java 中,我通过从JComponent 继承并覆盖paint() 来绘制我的输出。然后我的新画布类有一个模拟后端的实例,它可以读取/操作。然后,我可以使用 WYSIWYG GUI 编辑器(Matisse,来自 NetBeans)来直观地放置画布。
在 C# 中,我收集到我需要重写 OnPaint() 来绘制东西,这(据我所知)需要我从某些东西继承(我选择了 Panel)。我不知道如何让 Windows 窗体编辑器让我放置自定义类。我也不确定我需要在生成的代码中放置我的类的位置。
我该怎么做,并且将我所有的绘图代码放入一个子类中,我应该怎么做呢?谷歌上缺乏简单的答案表明我在这里遗漏了一些重要的东西。如果有人也想建议一种在 WPF 中执行此操作的方法,我很想听到它。
谢谢
text - 如何使用 .Net 2.0 绘制混合格式的文本
有没有办法在 .Net 2.0 中绘制混合格式的文本?我正在寻找类似的东西
我对这种方法的问题是它只允许整个文本使用一种格式样式。但我需要绘制具有不同格式样式的文本(例如,部分文本应加下划线,另一部分加粗等)。
非常感谢!
奥利弗
c# - 将 GDI 绘图导出到 bmp 时如何获得“真实”颜色
我正在开发一个 ASP.Net Web 处理程序,该处理程序返回在内存中制作的图像System.Windows.Forms.Control
,然后使用方法将呈现的控件导出为压缩为 PNG 的位图DrawToBitmap()
。除了颜色分配的问题外,这些课程现在已经完全正常工作了。例如,这是由 Web 处理程序生成的 Gauge。
分配给仪表内部的颜色是红色 ( #FF0000
)、黄色 ( #FFFF00
) 和绿色 ( #00FF00
),但我只得到每种颜色的单调版本(#CB100F
红色、#CCB70D
黄色和#04D50D
绿色)。
背景是包含颜色渐变的 bmp 文件。无论背景是作为样本的渐变、黑色画布、白色画布、透明画布,即使没有设置背景,也会发生颜色丢失。
- 黑色背景
- 有透明背景
- 有白色背景
- 没有背景设置
- Format32bppArgb 中的像素格式
我尝试了多种位图颜色深度、输出格式、压缩级别等,但它们似乎都不起作用。有任何想法吗?
这是源代码的摘录:
c# - 无法在 ASP.Net 中以编程方式使用某些字体
我正在尝试以编程方式在 ASP.Net 中创建具有指定字体的位图。这个想法是文本、字体名称、大小颜色等将从变量中传递,并返回使用字体等的文本位图。但是,我发现我只能使用以下代码和某些字体来做到这一点。
如果我将注释指示的区域中的字体名称更改为 Arial 或 Verdana,则图像和标签都会以正确的字体显示。但是,如果我将两个位置的字体名称更改为“Segoe Script”,标签将显示在 Segoe Script 中,但图像看起来像 Arial。
更新:
基于这里的这个问题,我能够通过使用 PrivateFontCollection() 并像这样加载字体文件来使其工作。
c# - 如何调整以编程方式创建的位图的大小以匹配在其上绘制的文本?
我有以下 .ashx 页面,它接受一些查询字符串参数并返回一个位图,上面写有指定的文本。我遇到的问题是,我目前只是手动将位图的初始大小设置为 100 X 100,而我真正想要的是让位图足够大以包含写入其中的所有文本。我怎样才能做到这一点?
更新: 我最终创建了比我需要的更大的位图,从该位图中获取图形并使用 MeasureString 方法来获取我要编写的文本的大小,然后将位图的那部分裁剪成一个新的位图,例如所以。
c# - 实例化字体时如何设置多个FontStyles?
在查看 System.Drawing.Font 类的构造函数时,有一个参数可以传入 System.Drawing.FontStyle 枚举中定义的 FontStyles 之一。
IE。粗斜体常规下划线
并且在实例化的对象中有粗体、斜体、下划线等布尔属性,但它们是只读的。
如果我想将我的字体定义为具有多种样式(如粗体和下划线)怎么办?
我怎样才能做到这一点?
c# - 使用 DrawString 绘制没有边框的文本
我有这个代码;
但是,当文本被绘制到我的图像上时,它是带有黑色边框或阴影的红色。
如何在没有任何边框或阴影的情况下将文本写入图像?
编辑
我通过添加解决了这个问题;
如果有人可以解释为什么我需要这个,那就太好了。
c# - System.Drawing 的撤消按钮?
我正在制作一个图像编辑器,有点为了自己的乐趣,我想知道如何制作一个撤消按钮来撤消我所做的最后一次绘画?我想知道我会怎么做,教程或示例代码会很好,或者至少可以为我指明正确的方向。
谢谢!