Czasami zachodzi potrzeba stworzenia obrazu poprzez połączenie kilku obrazów JPG. W tym artykule wyjaśniono, jak to zrobić w języku C#.

Interfejs API obrazowania C# – bezpłatne pobieranie

Aspose.Imaging for .NET zapewnia szereg elastycznych procedur do tworzenia i manipulowania obrazami w aplikacjach .NET. Umożliwia łączenie plików JPG w kilku liniach kodu. Można go zainstalować w aplikacji .NET przy użyciu biblioteki DLL interfejsu API NuGet lub pobierz.

Install-Package Aspose.Imaging

Scal obrazy JPG poziomo w języku C#

Poniżej przedstawiono kroki scalania obrazów JPEG w poziomie w języku C#.

  • Utwórz tablicę obrazów JPEG, które chcesz połączyć.
  • Oblicz szerokość powstałego obrazu, dodając szerokość wszystkich obrazów w tablicy i wysokość, znajdując maksymalną wysokość obrazu w tablicy.
  • Utwórz nowy obraz za pomocą klasy JpegImage i ustaw jego szerokość i wysokość na obliczoną w ostatnim kroku.
  • Iteruj po tablicy obrazów (które chcesz połączyć) i wykonaj następujące zadania na każdym obrazie:
    • Załaduj piksele obrazu za pomocą metody LoadArgb32Pixels i zapisz je w obrazie wynikowym za pomocą metody SaveArgb32Pixels. Ta metoda przyjmuje również obiekt Rectangle jako argument określający położenie obrazu w obrazie wynikowym.
  • Zapisz wynikowy obraz jako obraz JPEG.

Poniższy przykładowy kod pokazuje, jak łączyć obrazy JPEG w poziomie w języku C#.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Aspose.Imaging;
using Aspose.Imaging.FileFormats.Jpeg;
using Aspose.Imaging.ImageOptions;
using Aspose.Imaging.Sources;

// Tablica obrazów, które chcesz scalić.
string[] imagePaths = { "Image1.jpeg", "Image2.jpg" };

// Nazwa pliku wyjściowego/wynikowego.
string outputPath = "MergeImages_Horizontally.jpg";

// Uzyskiwanie wynikowego rozmiaru obrazu.
List<Size> imageSizes = new List<Size>();
foreach (string imagePath in imagePaths)
{
    using (RasterImage image = (RasterImage)Image.Load(imagePath))
    {
        imageSizes.Add(image.Size);
    }
}

// Szerokość i wysokość powstałego obrazu
int newWidth = imageSizes.Sum(size => size.Width);
int newHeight = imageSizes.Max(size => size.Height);

// Łączenie obrazów w jeden.
Source tempFileSource = new FileCreateSource("temp.jpg", isTemporal: true);
JpegOptions options = new JpegOptions() { Source = tempFileSource, Quality = 100 };
using (JpegImage newImage = (JpegImage)Image.Create(options, newWidth, newHeight))
{
    int stitchedWidth = 0;
    foreach (string imagePath in imagePaths)
    {
        using (RasterImage image = (RasterImage)Image.Load(imagePath))
        {
            Rectangle bounds = new Rectangle(stitchedWidth, 0, image.Width, image.Height);
            newImage.SaveArgb32Pixels(bounds, image.LoadArgb32Pixels(image.Bounds));
            stitchedWidth += image.Width;
        }
    }

    newImage.Save(outputPath);
}

Obrazy wejściowe

First Image

First Image

Second Image

Second Image

Obraz wyjściowy

Scal obrazy JPG w pionie w języku C#

Kroki scalania obrazów JPEG w pionie są takie same jak powyżej. Mała różnica polega na tym, że wysokość wynikowego obrazu obliczamy, dodając wysokość wszystkich obrazów w tablicy i szerokość, znajdując maksymalną szerokość obrazu w tablicy. Poniższy przykładowy kod pokazuje, jak łączyć obrazy JPEG w pionie w języku C#.

// Tablica obrazów, które chcesz scalić
string[] imagePaths = { "Image1.jpeg", "Image2.jpg" };

string outputPath = "MergeImages_Vertically.jpg";

// Uzyskiwanie wynikowego rozmiaru obrazu.
List<Size> imageSizes = new List<Size>();
foreach (string imagePath in imagePaths)
{
    using (RasterImage image = (RasterImage)Image.Load(imagePath))
    {
        imageSizes.Add(image.Size);
    }
}

// Szerokość i wysokość powstałego obrazu
int newWidth = imageSizes.Max(size => size.Width);
int newHeight = imageSizes.Sum(size => size.Height);

// Łączenie obrazów w jeden.
using (MemoryStream memoryStream = new MemoryStream())
{
    StreamSource outputStreamSource = new StreamSource(memoryStream);
    JpegOptions options = new JpegOptions() { Source = outputStreamSource, Quality = 100 };
    using (JpegImage newImage = (JpegImage)Image.Create(options, newWidth, newHeight))
    {
        int stitchedHeight = 0;
        foreach (string imagePath in imagePaths)
        {
            using (RasterImage image = (RasterImage)Image.Load(imagePath))
            {
                Rectangle bounds = new Rectangle(0, stitchedHeight, image.Width, image.Height);
                newImage.SaveArgb32Pixels(bounds, image.LoadArgb32Pixels(image.Bounds));
                stitchedHeight += image.Height;
            }
        }

        newImage.Save(outputPath);
    }
}

Scal obrazy JPG z plikami PDF w języku C#

Może zaistnieć potrzeba połączenia obrazów JPEG w formacie PDF. Możesz to zrobić, wprowadzając niewielką zmianę w metodzie Image.Save(użyj rozszerzenia .pdf zamiast .jpg).

// Tablica obrazów, które chcesz scalić.
string[] imagePaths = { "Image1.jpeg", "Image2.jpg" };

string outputPath = "MergeHorizontalAsPDF";
string tempFilePath = "temp.jpg";

// Uzyskiwanie wynikowego rozmiaru obrazu.
List<Size> imageSizes = new List<Size>();
foreach (string imagePath in imagePaths)
{
    using (RasterImage image = (RasterImage)Image.Load(imagePath))
    {
        imageSizes.Add(image.Size);
    }
}

// Szerokość i wysokość powstałego obrazu.
int newWidth = imageSizes.Sum(size => size.Width);
int newHeight = imageSizes.Max(size => size.Height);

// Łączenie obrazów w jeden.
Source tempFileSource = new FileCreateSource(tempFilePath, isTemporal: true);
JpegOptions options = new JpegOptions() { Source = tempFileSource, Quality = 100 };
using (JpegImage newImage = (JpegImage)Image.Create(options, newWidth, newHeight))
{
    int stitchedWidth = 0;
    foreach (string imagePath in imagePaths)
    {
        using (RasterImage image = (RasterImage)Image.Load(imagePath))
        {
            Rectangle bounds = new Rectangle(stitchedWidth, 0, image.Width, image.Height);
            newImage.SaveArgb32Pixels(bounds, image.LoadArgb32Pixels(image.Bounds));
            stitchedWidth += image.Width;
        }
    }

    newImage.Save(outputPath + ".pdf", new PdfOptions());
}

Scal obrazy JPG w PNG w C#

Podobnie możesz połączyć obrazy JPEG w PNG. Jak pokazano powyżej, wystarczy użyć rozszerzenia .png zamiast .jpg w metodzie Image.Save.

// Tablica obrazów, które chcesz scalić.
string[] imagePaths = { "Image1.jpeg", "Image2.jpg" };

string outputPath = "MergeHorizontalAsPNG";

// Uzyskiwanie wynikowego rozmiaru obrazu.
List<Size> imageSizes = new List<Size>();
foreach (string imagePath in imagePaths)
{
    using (RasterImage image = (RasterImage)Image.Load(imagePath))
    {
        imageSizes.Add(image.Size);
    }
}

// Szerokość i wysokość powstałego obrazu.
int newWidth = imageSizes.Sum(size => size.Width);
int newHeight = imageSizes.Max(size => size.Height);

// Łączenie obrazów w jeden i zapisywanie jako PNG
using (MemoryStream memoryStream = new MemoryStream())
{
    StreamSource outputStreamSource = new StreamSource(memoryStream);
    JpegOptions options = new JpegOptions() { Source = outputStreamSource, Quality = 100 };
    using (JpegImage newImage = (JpegImage)Image.Create(options, newWidth, newHeight))
    {
        int stitchedWidth = 0;
        foreach (string imagePath in imagePaths)
        {
            using (RasterImage image = (RasterImage)Image.Load(imagePath))
            {
                Rectangle bounds = new Rectangle(stitchedWidth, 0, image.Width, image.Height);
                newImage.SaveArgb32Pixels(bounds, image.LoadArgb32Pixels(image.Bounds));
                stitchedWidth += image.Width;
            }
        }

        newImage.Save(outputPath + ".png", new PngOptions());
    }
}

Wniosek

W tym artykule dowiedziałeś się, jak łączyć obrazy JPEG w języku C#. Można je łączyć poziomo lub pionowo. Dowiedziałeś się również, jak zapisać scalony obraz w formacie PDF lub PNG. Aby uzyskać więcej informacji, sprawdź dokumentację Aspose.Imaging for .NET. Jeśli masz jakieś pytania, skontaktuj się z nami na naszym forum pomocy technicznej.

Zobacz też