C#将矢量图像绘制到位图时的模糊结果

时间:2014-06-02 14:29:25

标签: c# image svg rendering

我目前正在尝试从多个渲染图像中编译一个小图像。 其中一个图像是生成的QR码,它可以很好地显示最终结果。 其他图像是从矢量图像渲染的,C#要求我将它们渲染成Bitmap对象。这个过程本身就很好,如果我导出这些图像,它们就是应该的。

问题是,如果我想将这些位图添加到另一个位图(我需要旋转它们),它们会变得模糊。它们确实需要调整大小以适应所以这也可能是一个问题。

这是QR码的渲染

QrEncoder encoder = new QrEncoder();
        QrCode qrCode;

        GraphicsRenderer gRenderer = new GraphicsRenderer(
            new FixedCodeSize(330, QuietZoneModules.Two),
            Brushes.Black, Brushes.White);


ms = new MemoryStream();
            encoder.ErrorCorrectionLevel = ErrorCorrectionLevel.H;
            encoder.TryEncode(id + ":" + i, out qrCode);

            gRenderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, ms);
            Image bmp = Image.FromStream(ms);


            Bitmap newBmp = new Bitmap(bmp.Width + 160, bmp.Height + 160);

这是矢量图像的渲染:

SvgDocument svgDoc2 = SvgDocument.Open(Application.StartupPath + @"\resources\logo2.svg");
        svgDoc2.Width = new SvgUnit(svgDoc2.Width.Type, svgDoc2.Width * 2);
        svgDoc2.Height = new SvgUnit(svgDoc2.Height.Type, svgDoc2.Height * 2);
        //svgDoc2.Transforms = new SvgTransformCollection();
        //svgDoc2.Transforms.Add(new SvgScale(2, 2));

        Bitmap logo2 = new Bitmap((int)svgDoc2.Width.Value, (int)svgDoc2.Height.Value);

        svgDoc2.Draw(logo2);

这是徽标的图纸

using (Graphics g = Graphics.FromImage(newBmp))
            {
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
                g.Clear(Color.White);
                g.DrawImage(bmp, 80, 80);

                g.TranslateTransform(newBmp.Width / 2, newBmp.Height / 2);

                g.DrawImage(logo, -(logo.Width / 2) + 64, newBmp.Height / 2 - 80, 284, 78);
                g.RotateTransform(90);
                g.DrawImage(logo2, -(logo2.Width / 2) + 64, newBmp.Width / 2 - 80, 284, 76);
                g.RotateTransform(90);
                g.DrawImage(logo, -(logo.Width / 2) + 64, newBmp.Height / 2 - 80, 284, 78);
                g.RotateTransform(90);
                g.DrawImage(logo2, -(logo2.Width / 2) + 64, newBmp.Width / 2 - 80, 284, 76);
                g.RotateTransform(90);

请注意,我曾尝试使用像素偏移,插值和平滑模式,但无论这些组合如何,我都无法获得完美的结果。

有没有人知道渲染它的正确方法,并因此得到像素完美的图像。

0 个答案:

没有答案