合并多个图像后,最终图像的图像较小

时间:2019-09-17 13:57:45

标签: c#

我正在尝试从4个不同的jpg图像创建一个较大的最终jpg图像。在将图像添加到最终图像后,我注意到图像的大小发生了变化。

图片的尺寸在最终图片上也应保持不变。

enter image description here enter image description here

例如,与实际图像相比,最终图像上的星系图像(暗天空)看起来很小。

任何帮助将不胜感激。

     private void CombineImages()
    {
        string path1 = @"C:\temp\";
        DirectoryInfo directory = new DirectoryInfo(path1);

        //change the location to store the final image.
        FileInfo[] files = directory.GetFiles();
        string finalImage = @"C:\\images\\FinalImage3.jpg";
        List<int> imageHeights = new List<int>();
        List<int> imagewidths = new List<int>();
        int nIndex = 0;
        int width = 0;
        int maxHeight = 0;
        int totalHeight = 0;
        bool odd = true;
        bool firstRow = true;

        //to get height and width to create final image
        foreach (FileInfo file in files)
        {

            if (odd)
            {
                if (firstRow)
                {
                    Image img = Image.FromFile(file.FullName);
                    firstRow = false;
                    imageHeights.Add(img.Height);
                    width += img.Width;
                    img.Dispose();
                    odd = false;
                }
                else
                {
                    Image img = Image.FromFile(file.FullName);
                    maxHeight = imageHeights.Max();
                    imagewidths.Add(width+100);
                    width = 0;
                    totalHeight = totalHeight + maxHeight+img.Height+100;
                    imageHeights.Clear();
                    imageHeights.Add(img.Height);
                    width += img.Width;
                    img.Dispose();
                    odd = false;
                }


            }
            else
            {
                Image img = Image.FromFile(file.FullName);
                imageHeights.Add(img.Height);
                width += img.Width;
                img.Dispose();
                odd = true;
            }


        }
        imageHeights.Sort();

        Bitmap img3 = new Bitmap(imagewidths.Max(), totalHeight);

        Graphics g = Graphics.FromImage(img3);
        g.Clear(Color.Gainsboro);


         imageHeights = new List<int>();
         imagewidths = new List<int>();
         nIndex = 0;
         width = 0;
         maxHeight = 0;
         totalHeight = 0;
         odd = true;
         firstRow = true;

        int imagewidth = 0;

        //actual merging of images
        foreach (FileInfo file in files)
        {
            Image img = Image.FromFile(file.FullName);

            if (odd)
            {
                if (firstRow)
                {
                    g.DrawImage(img, 25, 25);
                    firstRow = false;
                    imageHeights.Add(img.Height);
                    width += img.Width;
                    img.Dispose();
                    odd = false;
                }
                else
                {
                    maxHeight = imageHeights.Max();
                    g.DrawImage(img, 25, maxHeight+50);
                    imagewidths.Add(width);
                    width = 0;
                    totalHeight = totalHeight + maxHeight + img.Height;
                    imageHeights.Clear();
                    imageHeights.Add(img.Height);
                    width += img.Width;
                    imagewidth = img.Width;
                    img.Dispose();
                    odd = false;
                }


            }
            else
            {

                imageHeights.Add(img.Height);
                g.DrawImage(img, width+50, maxHeight+50);

                img.Dispose();

                odd = true;
            }

            img.Dispose();
        }
        g.Dispose();
        System.Drawing.Imaging.Encoder myEncoder =
            System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters myEncoderParameters = new EncoderParameters(1);
        EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
        img3.Save(finalImage, jpgEncoder, myEncoderParameters);
        img3.Dispose();

    }

    private ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }

0 个答案:

没有答案