Ketika bekerja dengan pemrosesan gambar di .NET, satu kebutuhan umum adalah untuk menggabungkan beberapa gambar – sering dari ukuran yang berbeda – ke dalam satu output. kasus penggunaan tipikal termasuk kolagen, sprite sheets, kontak sheet, atau pemasaran banner. tutorial ini menunjukkan bagaimana untuk mengumpulkan gambar menggunakan Aspose.Imaging untuk .Net dengan kontrol yang tepat atas tata letak: axis (horizontal/vertical), alignment (top/center/bottom dan left/centers/right), padding eksternal, dan spacing antara gambar. Graphics
dan api.
Apa yang akan dibangun
*Layout: * horizontal atau vertikal
• Pengaturan : *
Layout horizontal untuk penyelarasan vertikal:
Top
,Middle
,Bottom
Layout vertikal dan horizontal:
Left
,Center
,Right
Padding: outer padding dan inter-item spacing
*Background: * Penuh warna yang kuat
Format: format campuran beban (JPG, PNG, dll.), Kecuali untuk Png/JPEG
Contoh lengkap
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"
);
}
}
}
Panduan Langkah-Langkah
Langkah 1: Mengisi gambar
Mengisi semua input gambar dengan Image.Load(path)
Tetaplah mereka hidup sampai setelah menggambar, kemudian lepaskan.
Langkah 2: Tentukan ukuran output
- Layout horizontal: lebar = jumlah widths + spacings + padding eksternal; ketinggian = max tinggi + Padding luar.
- Layout vertikal: tinggi = jumlah ketinggian + ruang + padding eksternal; lebar = luas maksimum + Padding luar.
Langkah 3: Buat output canvas
Mencipta menggunakan Image.Create(new PngOptions(), width, height)
(atau JpegOptions
Jika Anda lebih suka output lossy). jelas dengan warna latar belakang.
Langkah 4: Mengatur Alignment & Padding
- horizontal merger → menghitung Y oleh
Top / Middle / Bottom
. - Vertikal merger → menghitung X oleh
Left / Center / Right
. - Apply
outerPadding
danspacing
secara konsisten.
Langkah 5: Menggambar setiap gambar
Penggunaan Graphics.DrawImage(image, new Rectangle(x, y, image.Width, image.Height))
.
Langkah 6: Menyelamatkan hasil
Pilih koder berdasarkan ekspansi nama file output (misalnya, .png
→ PngOptions
, .jpg
→ JpegOptions { Quality = … }
).
Praktik Terbaik
- Format Normalisasi: Jika Anda membutuhkan latar belakang yang transparan, simpan sebagai PNG. Untuk file yang lebih kecil tanpa transparansi, gunakan JPEG dan tune
Quality
. - Guardrails: Validate input list, mengendalikan file yang hilang, dan mempertimbangkan dimensi kanvas maksimum untuk menghindari OOM.
- Disediakan untuk :
Image
,Graphics
dapat digunakan - digunakanusing
atautry/finally
.
- Disediakan untuk :
- Konsistensi warna: Jika input memiliki jenis warna campuran, bergantung pada default Aspose, atau secara eksplisit konversi ketika diperlukan.
- Batching: Untuk set besar, output streaming saat Anda pergi atau membuat beberapa tiang/halaman.
More in this category
- Mengoptimalkan GIF Animasi di .NET menggunakan Aspose.Imaging
- Mengoptimalkan Multi-Page TIFF untuk Archival dalam .NET dengan Aspose
- Animasi yang didorong data dalam .NET dengan Aspose.Imaging
- Gambar produk untuk platform e-commerce menggunakan Aspose.Imaging untuk .NET
- Kompresi gambar tanpa kerugian dan kualitas dalam .NET dengan Aspose.Imaging