- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个简单的程序,可以根据一系列数字(1到10)创建一系列PNG图像。我遍历每个数字并创建该数字的不同大小的png图像。下面是我用来创建图像的空白。
private void CreatePNG(int number, string location, int width, int height)
{
string filename = number.ToString() + "-" + width.ToString() + "x" + height.ToString() + ".png";
Bitmap b = new Bitmap(width, height);
Graphics g = Graphics.FromImage((System.Drawing.Image)b);
g.FillRectangle(Brushes.White, 0f, 0f, width, height);
StringFormat f = new StringFormat();
f.Alignment = StringAlignment.Center;
f.LineAlignment = StringAlignment.Center;
g.DrawString(number.ToString(), new Font("Helvetica", 55), Brushes.Black, new RectangleF(0, 0, width, height), f);
b.Save(location + "\\" + filename, ImageFormat.Png);
}
最佳答案
绘图是winforms而不是wpf的一部分
首先我想澄清一个误会。
基于win32的gdi+的system.drawing实际上是winforms的一个组件。wpf不是基于它构建的,silverlight和wpf到其他平台的其他端口可能永远不会包含它,并且system.drawing(winforms)使用的约定与system.windows.media(wpf)使用的约定之间存在许多不兼容。例如,它们使用不同的测量单位(像素与固定96dpi)、不同的坐标类型(int与double)、不同的线绘制规则、不同的旋转、不同的笔刷、立即模式与保留模式等。
wpf的System.Windows.Media
库比winforms的System.Drawing
(gdi+)库强大得多。wpf包含更多的变换、更好的不透明度支持、3d和其他功能,这些功能允许使用System.Drawing
(gdi+)时非常困难的效果。
但问题中提出的代码无论如何都能与wpf一起工作吗?
会的。只要您在wpf上运行而不是像silverlight这样的克隆,您仍然可以访问旧的winforms库。所以您可以继续使用System.Drawing
调用来绘制您的图形。但是,不能将生成的位图简单地放到wpf应用程序中:位图不兼容,通常wpf位图更强大。有多种方法可以将位图转换为wpf位图,也可以将其保存为标准文件格式(如.png)并重新加载。
由于问题中提出的代码实际上将位图保存到了一个.png文件中,因此实际上可以不加修改地使用它。但是,如果在创建位图时需要任何新的wpf特性,或者如果希望在不保存到文件的情况下使用位图,则需要特殊的技术。
那你为什么不按原样使用这些代码呢?
也许你会这样做:如果你正在做一个快速的应用程序,并且已经编写了代码,而且你确实想将文件存储到磁盘上,那么就没有理由将代码转换为wpf。但是,如果您想使用新的wpf特性,或者使用数据绑定或其他动态技术将图像直接合并到wpf用户界面中,则可能需要将程序转换为使用wpf的库,而不是使用winforms。这是一个基于你需要的判断电话。
您的问题是,要使此代码“与wpf一起工作”需要什么。答案是:没什么。您的代码编写普通的.png文件,wpf读取普通的.png文件。所以它会起作用的。
如果你的代码是90年代的cobol、java或其他任何调用基于unix的绘图库的原始语言,也可以这么说,只要代码最终编写了一个标准的.png文件(或.gif或.jpg或…),它的输出就可以使用wpf。正如有令人信服的理由不将代码留在COBOL或Java中一样,也有理由不将代码留在使用System.Drawing:
依赖于系统。随着时间的推移,wpf可能出现,也可能不出现。
你能画的东西的限制
与其他wpf代码不同的绘图模型
那么我该如何使用wpf而不是winforms来完成这项工作呢?
您可以使用以下三个简单步骤,使用wpf中显示的任何内容制作位图:
使用xaml或代码构造wpf可视化。
在代码中,构造所需大小的renderTargetBitmap,然后调用.render(可视化)
在应用程序的其他位置使用生成的位图,或者使用pngbitmapecoder或类似工具保存它。
对于您的特定示例,我可能会使用这样的数据模板:
<DataTempate x:Key="NumberTemplate">
<TextBlock
Background="White"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontFamily="Helvetica" FontSize="55"
Text="{Binding}"
/>
</DataTemplate>
void CreatePng(int number, string location, int width, int height)
{
WritePng(location + "/" + number + "-" + width + "x" + height + ".png",
new ContentPresenter // Invokes a DataTemplate on its content
{
Content = number.ToString(),
Template = NumberTemplate,
Width = width, Height = height
});
}
void WritePng(string path, UIElement element)
{
// Create the bitmep specifying the size, pixel format and DPI
var bitmap = new RenderTargetBitmap((int)element.Width, (int)element.Height,
96, 96, PixelFormats.Pbgra32);
bitmap.Render(element); // At this point the bitmap is usable within WPF
// Write to a file: WPF can write multiple frames but we need only one
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using(Stream stream = File.Create(path))
encoder.Save(stream); // Could be any stream, not just a file
}
关于c# - 我该如何将这种方法从Winforms转换为WPF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256411/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!