当我将图像合并到另一个图像时,如何将图像居中?

时间:2017-03-01 19:51:36

标签: c#

我在网上找到了一些合并图片的代码。我进行了设置并将其解决了。我终于开始工作,但是我合并到空白图像上的图像没有居中。

以下是它的外观: enter image description here

这是我的代码:

    public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void btnSelectImage_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.InitialDirectory = Convert.ToString(Environment.SpecialFolder.MyDocuments);
        openFileDialog.Filter = "Images (*.jpg, *.jpeg, *.png)|*.*";
        openFileDialog.FilterIndex = 1;

        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            txtFileLoc.Text = openFileDialog.FileName;
            System.Drawing.Image img = System.Drawing.Image.FromFile(txtFileLoc.Text);
            txtImgWidth.Text = img.Width.ToString();
            txtImgHeight.Text = img.Height.ToString();
        }


    }

    private void button1_Click(object sender, EventArgs e)
    {
        using (var fbd = new FolderBrowserDialog())
        {
            DialogResult result = fbd.ShowDialog();

            if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
            {
                txtOutputPath.Text = fbd.SelectedPath;
                //string[] files = System.IO.Directory.GetFiles(fbd.SelectedPath);
                //System.Windows.Forms.MessageBox.Show("Files found: " + files.Length.ToString(), "Message");
            }
        }
    }

    private void btnResize_Click(object sender, EventArgs e)
    {
        DateTime time = DateTime.Now;
        string format = "MMMddyyy";
        string imgdate = time.ToString(format);
        int Height = Convert.ToInt32(txtNewHeight.Text);
        int Width = Convert.ToInt32(txtNewWidth.Text);
        Image resultImage = new Bitmap(Height, Width, PixelFormat.Format24bppRgb);

        using (Graphics grp = Graphics.FromImage(resultImage))
        {
            grp.FillRectangle(
                Brushes.White, 0, 0, Width, Height);
            resultImage.Save(txtOutputPath.Text + @"\" + imgdate + ".jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
            Image img = Image.FromFile(txtFileLoc.Text);

        }
        Image playbutton;
        try
        {
            playbutton = Image.FromFile(txtFileLoc.Text);
        }
        catch (Exception ex)
        {
            return;
        }

        Image frame;
        try
        {
            frame = resultImage;
        }
        catch (Exception ex)
        {
            return;
        }

        using (frame)
        {
            using (var bitmap = new Bitmap(Width, Height))
            {
                using (var canvas = Graphics.FromImage(bitmap))
                {
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    canvas.DrawImage(frame,
                                     new Rectangle(0,
                                                   0,
                                               Width,
                                             Height),
                                     new Rectangle(0,
                                                   0,
                                                   frame.Width,
                                                   frame.Height),
                                     GraphicsUnit.Pixel);
                    canvas.DrawImage(playbutton,
                                     (bitmap.Width / 2) - (playbutton.Width / 2),
                                     (bitmap.Height / 2) - (playbutton.Height / 2));
                    canvas.Save();
                }
                try
                {
                    bitmap.Save(txtOutputPath.Text + @"\" + imgdate + ".png", System.Drawing.Imaging.ImageFormat.Png);
                }
                catch (Exception ex) { }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

为了在另一个图像上绘制时使图像居中,您需要计算图像的位置(X,Y),可以按如下方式进行:

int x = (bitmap.Width - image.Width) / 2;
int x = (bitmap.Height - image.Height) / 2;

然后你可以用

绘制你的图像
canvas.DrawImage(image, x, y, image.Width, image.Height);

请注意,此方法允许您将图像居中,无论图像是否小于原始位图或更大。在计算(X,Y)时,可能会出现一个像素舍入误差,因此使用Math.Round来纠正它是有益的。