当父图像被放大一组孩子图像背景(Set child Image Background when Pa

2019-10-18 18:19发布

我具有其中所选择的图像可被放大和OUT的图像控制。

用户可以将一些控件在运行时的图像。 放置控件后,如果用户放大的图像,然后将控件未缩放时,相反,他们相对于它们的图像中的位置移动。 所以控件的位置保持图像上相同,只是图像将被放大。

说一切后,要求是完整的图像由用户添加的控件一起导出。

我已经实现了用下面的代码此功能:

Bitmap bmpCopy = new Bitmap(picEditIsdDiagram.Image);

Graphics canvas = Graphics.FromImage(bmpCopy);
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
try
{
    foreach (Control MeasurementSymbol in picEditIsdDiagram.Controls)
    {
        if (MeasurementSymbol is DevExpress.XtraEditors.HScrollBar || MeasurementSymbol is DevExpress.XtraEditors.VScrollBar)
        {
            continue;
        }

        Bitmap bmpControl = new Bitmap(MeasurementSymbol.Width, MeasurementSymbol.Height);
        MeasurementSymbol.DrawToBitmap(bmpControl, new Rectangle(Point.Empty, bmpControl.Size));
        bmpControl.MakeTransparent(Color.Transparent);

        canvas.DrawImage(
                            bmpCopy,
                            new Rectangle(0, 0, bmpCopy.Width, bmpCopy.Height),
                            new Rectangle(0, 0, bmpCopy.Width, bmpCopy.Height),
                            GraphicsUnit.Pixel
                        );

        canvas.DrawImage(bmpControl, ((UcMeasurementSymbol)MeasurementSymbol).PointInImage);
        canvas.Save();
    }

    FolderBrowserDialog save = new FolderBrowserDialog();

    save.RootFolder = Environment.SpecialFolder.Desktop;

    if (save.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        int count = 1;

        string destinationPath = save.SelectedPath + "\\" + IsdDiagram.Isd.Name + " - " + IsdDiagram.Name + ".Jpeg";

        while (File.Exists(destinationPath))
        {
            destinationPath = save.SelectedPath + "\\" + IsdDiagram.Isd.Name + " - " + IsdDiagram.Name + " [" + count++.ToString() + "].Jpeg";
        }

        bmpCopy.Save(destinationPath, ImageFormat.Jpeg);
        SERVICE.NMessageBox.Show("Complete Diagram saved successfully in Jpeg format", "Image Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}
catch (Exception ex)
{
    SERVICE.NMessageBox.Show("Error exporting complete Diagram. Error :" + ex.Message.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

现在问题出现了,当我缩放图像,然后单击导出图按钮。 仅放大图像的特定区域之后被显示。 因此,控制的背景(即控制的可见区以外的)图像被改变,而不是按形象。

我附上了进一步澄清图片:

放大前图像:

放大后的图片:

所以在上面的图片,你可以看到控制图像的背景并不如预期。

任何人可以帮助我施加ZOOM后得到正确的背景什?

Answer 1:

    MeasurementSymbol.DrawToBitmap(bmpControl, new Rectangle(Point.Empty, bmpControl.Size));
    bmpControl.MakeTransparent(Color.Transparent);

在难以回答的问题就是为什么这个代码产生的透明,在所有的图像。 换句话说,顶部图像是奇怪之一,底部有一个是正常的。 控制,像bmpControl,不Color.Transparent绘制自身。 话又说回来,我们不能看到什么样的控制,可能是。

你需要停止使用控件来存储这些图像。 在一个位图保存它们来代替。 只有这样,才能确保你不依赖于控制的好意本身吸引你希望的方式。 并确保你传递给MakeTransparent颜色确实匹配位图的背景色。 如果它已经是透明的,使用的是支持像透明PNG图像格式,然后完全不叫MakeTransparent()。



文章来源: Set child Image Background when Parent Image is Zoomed