C#WPF将多个位图组合为一个

时间:2018-12-29 06:13:41

标签: c# wpf bitmap

您好,我正在使用WPF程序来自动化制作卡片的过程(我从数据库中获取信息,它会吐出正确尺寸的图像文件)。

这些卡由3个有效的“层”组成,彼此叠放,并且应产生类似的输出结果

enter image description here

(如果我需要将其删除,因为我只是用正确的长宽比抓取了一个图像)。

现在我可以用类似的东西将单独的“图层”作为自己的位图

//Get the filepath and store it in a variable named 'FilePath' before this
BitmapImage image =  new BitmapImage();
image.UriSource = (Uri)FilePath;

(我知道代码不正确,但您明白了)。

问题是,如何将这三个位图添加到单个位图中,然后可以将其保存为.png等。

我知道WinForms内置了许多用于图像和位图操作的选项,但是我在WPF中这样做。

我一直在考虑使用字节数组来实现这一点,并使用循环将值从一个复制到另一个,但是任何更好的建议都将受到高度赞赏。

1 个答案:

答案 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);
        }
    }
}