Görüntü işleme ile çalışırken, yaygın bir ihtiyaç birden fazla görüntü - çoğu zaman farklı boyutlarda - tek bir çıkışta birleştirmektir. tipik kullanım durumları kolajlar, sprite yaprakları, iletişimi sayfaları veya pazarlama panoları içerir. bu öğretici görüntüleri Aspose.Imaging for .NET ile düzeltme üzerinde doğru kontrol ile nasıl birleştiğini gösterir: eksen (horizontal/vertikal), uyumluluk (top/center/bottom ve sol/centre/sağ), dış katlama ve resimler arasındaki uzay. Graphics Ateş

Ne yapacaksın

    • Yönlendirme: * Horizontal veya vertikal
    • Çerçeve : *
  • Horizontal layout vertikal düzleştirme: Top, Middle, Bottom

  • Vertikal düzleştirme ve horizontal düzleşme: Left, Center, Right

  • Padding: Dış pading ve inter-item spacing

  • Background: sağlam renk doldurma

  • Formatlar: yükleme karışık formatlar (JPG, PNG, vb.), hariç png/JPEG

Tam örnek

using System;
using System.Collections.Generic;
using System.IO;
using Aspose.Imaging;
using Aspose.Imaging.ImageOptions;

namespace ImagingMergeDemo
{
    public enum MergeAxis { Horizontal, Vertical }
    public enum VAlign { Top, Middle, Bottom }
    public enum HAlign { Left, Center, Right }

    public static class ImageMerger
    {
        /// <summary>
        /// Merges input images into a single image with alignment and padding.
        /// </summary>
        /// <param name="inputPaths">List of source image file paths.</param>
        /// <param name="axis">Horizontal or Vertical stacking.</param>
        /// <param name="outerPadding">Padding around the whole collage (in pixels).</param>
        /// <param name="spacing">Spacing between images (in pixels).</param>
        /// <param name="bgColor">Background color for the canvas.</param>
        /// <param name="verticalAlign">Only used when axis == Horizontal (Top/Middle/Bottom inside the row).</param>
        /// <param name="horizontalAlign">Only used when axis == Vertical (Left/Center/Right inside the column).</param>
        /// <param name="outputPath">Destination file path. Extension determines encoder (e.g., .png, .jpg).</param>
        public static void Merge(
            IReadOnlyList<string> inputPaths,
            MergeAxis axis,
            int outerPadding,
            int spacing,
            Color bgColor,
            VAlign verticalAlign,
            HAlign horizontalAlign,
            string outputPath)
        {
            if (inputPaths is null || inputPaths.Count == 0)
                throw new ArgumentException("No input images provided.");

            // Load all images first so we can compute canvas size.
            var loaded = new List<Image>(inputPaths.Count);
            try
            {
                foreach (var p in inputPaths)
                {
                    var img = Image.Load(p);
                    loaded.Add(img);
                }

                // Compute canvas size.
                // For horizontal axis: width = sum(widths) + spacings + 2*outerPadding
                // height = max(heights) + 2*outerPadding
                // For vertical axis:   height = sum(heights) + spacings + 2*outerPadding
                // width  = max(widths) + 2*outerPadding
                int totalWidth, totalHeight;

                if (axis == MergeAxis.Horizontal)
                {
                    int sumWidths = 0, maxH = 0;
                    for (int i = 0; i < loaded.Count; i++)
                    {
                        sumWidths += loaded[i].Width;
                        maxH = Math.Max(maxH, loaded[i].Height);
                    }
                    totalWidth = sumWidths + ((loaded.Count - 1) * spacing) + 2 * outerPadding;
                    totalHeight = maxH + 2 * outerPadding;
                }
                else
                {
                    int sumHeights = 0, maxW = 0;
                    for (int i = 0; i < loaded.Count; i++)
                    {
                        sumHeights += loaded[i].Height;
                        maxW = Math.Max(maxW, loaded[i].Width);
                    }
                    totalHeight = sumHeights + ((loaded.Count - 1) * spacing) + 2 * outerPadding;
                    totalWidth = maxW + 2 * outerPadding;
                }

                // Create canvas (use PNG by default for lossless output; you can switch to JPEGOptions)
                using var canvas = Image.Create(new PngOptions(), totalWidth, totalHeight);

                // Draw on canvas
                using var g = new Graphics(canvas);
                g.Clear(bgColor);

                int cursorX = outerPadding;
                int cursorY = outerPadding;

                for (int i = 0; i < loaded.Count; i++)
                {
                    var img = loaded[i];

                    int drawX, drawY;

                    if (axis == MergeAxis.Horizontal)
                    {
                        // X flows left -> right
                        drawX = cursorX;

                        // Y depends on vertical alignment vs tallest height
                        drawY = verticalAlign switch
                        {
                            VAlign.Top    => outerPadding,
                            VAlign.Middle => outerPadding + (totalHeight - 2 * outerPadding - img.Height) / 2,
                            VAlign.Bottom => outerPadding + (totalHeight - 2 * outerPadding - img.Height),
                            _ => outerPadding
                        };

                        // Draw and move X cursor
                        g.DrawImage(img, new Rectangle(drawX, drawY, img.Width, img.Height));
                        cursorX += img.Width + spacing;
                    }
                    else
                    {
                        // Y flows top -> bottom
                        drawY = cursorY;

                        // X depends on horizontal alignment vs widest width
                        drawX = horizontalAlign switch
                        {
                            HAlign.Left   => outerPadding,
                            HAlign.Center => outerPadding + (totalWidth - 2 * outerPadding - img.Width) / 2,
                            HAlign.Right  => outerPadding + (totalWidth - 2 * outerPadding - img.Width),
                            _ => outerPadding
                        };

                        // Draw and move Y cursor
                        g.DrawImage(img, new Rectangle(drawX, drawY, img.Width, img.Height));
                        cursorY += img.Height + spacing;
                    }
                }

                // Save with encoder that matches extension
                SaveByExtension(canvas, outputPath);
            }
            finally
            {
                // Dispose loaded images
                foreach (var img in loaded)
                    img.Dispose();
            }
        }

        private static void SaveByExtension(Image image, string outputPath)
        {
            var ext = Path.GetExtension(outputPath).ToLowerInvariant();
            ImageOptionsBase opts = ext switch
            {
                ".jpg" or ".jpeg" => new JpegOptions { Quality = 90 },
                ".png"            => new PngOptions(),
                _                 => new PngOptions() // default to PNG
            };
            image.Save(outputPath, opts);
        }
    }

    // Example usage
    public class Program
    {
        public static void Main()
        {
            var inputs = new List<string>
            {
                "image1.jpg",
                "image2.png",
                "image3.jpg"
            };

            // Horizontal strip, vertically centered, with padding/spacing
            ImageMerger.Merge(
                inputPaths: inputs,
                axis: MergeAxis.Horizontal,
                outerPadding: 20,
                spacing: 10,
                bgColor: Color.White,
                verticalAlign: VAlign.Middle,
                horizontalAlign: HAlign.Center, // ignored for horizontal axis
                outputPath: "merged_horizontal.png"
            );

            // Vertical stack, horizontally right-aligned
            ImageMerger.Merge(
                inputPaths: inputs,
                axis: MergeAxis.Vertical,
                outerPadding: 20,
                spacing: 12,
                bgColor: Color.FromArgb(255, 245, 245, 245),
                verticalAlign: VAlign.Middle,    // ignored for vertical axis
                horizontalAlign: HAlign.Right,
                outputPath: "merged_vertical.jpg"
            );
        }
    }
}

adım adım rehber

Adım 1: Görüntüleri yükleme

Tüm giriş görüntüleri ile yükleme Image.Load(path)Onları çizdikten sonra hayatta tutun, sonra dağıtın.

Adım 2: Çıkış boyutunu belirleyin

  • Horizontal düzen: Genişlik = genişlik sayısı + uzaylar + dış katlama; yüksekliği = maksimum yükseklik + iç katma.
  • Vertikal düzen: yükseklik = yüksekliğin toplamı + uzaylar + dış katlama; genişliği = maksimum genişlik + iç katma.

Adım 3: Çıkış kanvası oluşturun

Kullanımı oluşturmak Image.Create(new PngOptions(), width, height) (ya da JpegOptions Eğer kaybeden çıkış tercih ederseniz). arka plan rengi ile açık.

Adım 4: Alignment & Padding ayarlayın

  • Horizontal merge → hesaplayın Y by Top / Middle / Bottom.
  • Vertikal birleşme, X ile hesaplanır Left / Center / Right.
  • Apply outerPadding ve spacing tutarlı olarak .

Adım 5: Her resim çizin

Kullanımı Graphics.DrawImage(image, new Rectangle(x, y, image.Width, image.Height)).

Adım 6: Sonuçları Kurtarın

Çıkış fil adı uzantısı temelinde kodlayıcı seçin (örneğin, .pngPngOptions, .jpgJpegOptions { Quality = … }).

En İyi Uygulamalar

  • Normalize formats: Şeffaf arka planlara ihtiyacınız varsa, PNG olarak kaydedin. Quality.
  • Guardrails: Giriş listesini doğrulayın, eksik dosyaları ele alın ve OOM’dan kaçınmak için maksimum kanvas boyutlarını göz önünde bulundurun.
    • Kullanılabilir * : Image, Graphics Kullanılabilir - kullanılabilir using veya try/finally.
  • Renk tutarlılığı: Eğer girişler karışık renk türleri varsa, Aspose varsayımlarına güvenin veya gerektiğinde açıkça dönüştürün.
  • Batching: Büyük setler için, gittiğinizde akış çıkışları veya çok sayıda çubuk/sayfa oluşturun.

More in this category