您好,我正在使用WPF程序来自动化制作卡片的过程(我从数据库中获取信息,它会吐出正确尺寸的图像文件)。
这些卡由3个有效的“层”组成,彼此叠放,并且应产生类似的输出结果
(如果我需要将其删除,因为我只是用正确的长宽比抓取了一个图像)。
现在我可以用类似的东西将单独的“图层”作为自己的位图
//Get the filepath and store it in a variable named 'FilePath' before this
BitmapImage image = new BitmapImage();
image.UriSource = (Uri)FilePath;
(我知道代码不正确,但您明白了)。
问题是,如何将这三个位图添加到单个位图中,然后可以将其保存为.png
等。
我知道WinForms内置了许多用于图像和位图操作的选项,但是我在WPF中这样做。
我一直在考虑使用字节数组来实现这一点,并使用循环将值从一个复制到另一个,但是任何更好的建议都将受到高度赞赏。
答案 0 :(得分:0)
我认为重要的是要在这里了解WinForms和WPF到底是什么。
WPF并未“替换” WinForms中的所有内容。 WinForms本质上是基础Windows GDI API的包装,而Windows GDI API本身仍然是当前的一种新技术,并且在可预见的将来很可能会保持这种状态。
WPF用基于DirectX的引擎替换了GUI元素的呈现。为此,它必须提供自己的图像类,但这仅是为了在硬件加速的DirectX环境中显示。
这是一个重要的区别:WPF本身并不是Windows操作系统的一部分。它使用DirectX进行渲染,但是DirectX本身是设计用于与图形硬件接口的,而不是用于直接图像处理的(GPU处理等极少数例外)。但是,GDI仍然是Windows的一部分,并且是专门为这种事情而设计的,一直可以追溯到软件渲染的时代。
因此,换句话说,除非您有涉及硬件加速显示的非常具体的要求,否则您也可以使用GDI。 WPF和WinForms可以很好地共存,因为它们做的事情完全不同。仅仅因为WinForms要做的一件事就是暴露了您不想使用的较旧的渲染技术,并不意味着WinForms整体上就已经过时了。
更新:要使用GDI功能,您需要添加对System.Drawing的引用;通常,这是在创建Windows项目时为您完成的,但是如果您创建了控制台应用程序等,则需要手动进行。 Graphics class提供了许多渲染功能,但是根据您的描述,这可能涵盖了您尝试执行的大部分操作:
using System.Drawing;
using System.Drawing.Imaging;
namespace yournamespace
{
class Program
{
private static void Main(string[] args)
{
// load an image
var source = new Bitmap("source.png");
// create a target image to draw into
var target = new Bitmap(1000, 1000, PixelFormat.Format32bppRgb);
// get a context
using (var graphics = Graphics.FromImage(target))
{
// draw an image into it, scaled to a different size
graphics.DrawImage(source, new Rectangle(250, 250, 500, 500));
// draw primitives
using (var pen = new Pen(Brushes.Blue, 10))
graphics.DrawEllipse(pen, 100, 100, 800, 800);
}
// save the target to a file
target.Save("target.png", ImageFormat.Png);
}
}
}