Przycinanie obrazu i eksportowanie go do wielu formatów jest powszechnym wymaganiem przy tworzeniu miniatur, podglądów lub niestandardowych zasobów. Ten przewodnik pokazuje, jak wykonać tę operację przy użyciu Aspose.Imaging for Python oraz klasy RasterImageExporter, koncentrując się na frazie przycinanie i eksportowanie obrazów w Pythonie.

Najważniejsze wnioski

  • RasterImageExporter może przyciąć prostokąt i zapisać wynik w dowolnym obsługiwanym formacie obrazu.
  • Ten sam prostokąt przycięcia może być używany w dziesiątkach formatów bez ponownego ładowania obrazu źródłowego.
  • Sprawdzenie rozmiaru zapisanego obrazu zapewnia, że operacja przycięcia zakończyła się sukcesem.
  • Klony obiektów opcji zapisu zapobiegają efektom ubocznym między formatami.
  • Tymczasowa licencja umożliwia pełną funkcjonalność podczas oceny API.

Dlaczego przycinać i eksportować obrazy

Programiści często potrzebują jednego przyciętego regionu z obrazu, ale muszą dostarczyć ten region w kilku typach plików dla różnych platform. Przed tą funkcją trzeba było ładować, przycinać i zapisywać obraz osobno dla każdego formatu, zwiększając obciążenie I/O i CPU. RasterImageExporter usprawnia przepływ pracy, stosując ten sam prostokąt przycięcia do każdego formatu wyjściowego w jednej pętli, oszczędzając czas i redukując złożoność kodu.

Rozpoczęcie pracy z Aspose.Imaging dla Pythona

Najpierw zainstaluj pakiet Aspose.Imaging przy użyciu pip:

pip install aspose-imaging-python-net

Aby uzyskać szczegółową dokumentację, odwiedź stronę produktu. Biblioteka działa w każdym środowisku Python, które obsługuje integrację .NET za pośrednictwem Python.NET.

Jak przycinać i eksportować obrazy w wielu formatach

Poniżej znajduje się kompletny, samodzielny przykład, który ładuje zestaw obrazów testowych, definiuje prostokąt przycięcia i zapisuje przycięty obszar w jedenastu różnych formatach.

Poniższy przykład pokazuje, jak przyciąć prostokąt i wyeksportować wynik do wielu formatów przy użyciu Pythona.

import os
from aspose.imaging import Image, Rectangle
from aspose.imaging.imageoptions import *
from aspose.imaging.fileformats.tiff.enums import TiffExpectedFormat

base_dir = "testdata"
out_dir = os.path.join(base_dir, "output")

if not os.path.exists(out_dir):
    os.mkdir(out_dir)

files = [
    "decHex_16Bpp555.bmp",
    "2086.gif",
    "3.jpg",
    "1.png",
    "bi_CCITT3_2d.tif",
    "light.ico",
    "Input.jp2",
    "ExifChunk.webp",
    "0008.DCM",
    "src-base-indexed.tga",
    "BigTiff.tiff.tiff"
]

save_exts = ["bmp", "gif", "jpeg", "png", "tiff", "ico", "jp2", "webp", "dicom", "tga", "bigtiff"]
save_options = [
    BmpOptions(),
    GifOptions(),
    JpegOptions(),
    PngOptions(),
    TiffOptions(TiffExpectedFormat.TIFF_DEFLATE_RGB),
    IcoOptions(),
    Jpeg2000Options(),
    WebPOptions(),
    DicomOptions(),
    TgaOptions(),
    BigTiffOptions(TiffExpectedFormat.TIFF_DEFLATE_RGB)
]

assert len(files) == len(save_exts)
assert len(files) == len(save_options)

# Define the Clipping Rectangle: (X, Y, Width, Height)
out_rect = Rectangle(10, 15, 100, 100)
error_list = []
for file in files:
    file_path = os.path.join(base_dir, file)
    # Load the source image once
    with Image.load(file_path) as image:
        for i in range(len(save_exts)):
            out_file = os.path.join(out_dir, file + "_clipped." + save_exts[i])
            # Clone the format‑specific options and apply the clipping rectangle
            image.save(out_file, save_options[i].clone(), out_rect)
            # Verify that the saved image has the expected size
            can_remove = True
            with Image.load(out_file) as test_image:
                if out_rect.size != test_image.size:
                    can_remove = False
                    error_list.append(
                        "Sizes (exp = {0}, real = {1}) are not equal! Input file: {2}, Output file: {3}".format(
                            out_rect.size, test_image.size, file, out_file))
            if can_remove:
                os.remove(out_file)

if error_list:
    error_text = "\n".join(error_list)
    print(error_text)
    raise AssertionError(error_text)

# Clean up the Temporary Directory
os.rmdir(out_dir)

Wyjaśnienie kluczowych kroków

  1. Utworzenie katalogów – Skrypt tworzy folder output, aby przechowywać tymczasowe przycięte pliki.
  2. Przygotowanie list plików – files zawiera nazwy źródłowych obrazów, natomiast save_exts i save_options mapują każdy plik na docelowy format oraz odpowiadający mu obiekt opcji.
  3. Zdefiniowanie prostokąta przycinania – Rectangle(10, 15, 100, 100) określa region do wyodrębnienia (x=10, y=15, szerokość=100, wysokość=100).
  4. Załadowanie obrazu źródłowego – Image.load(file_path) otwiera źródło raz, zmniejszając operacje I/O.
  5. Zapis z przycięciem – image.save(out_file, save_options[i].clone(), out_rect) zapisuje przycięty region w odpowiednim formacie. Wywołanie clone() zapewnia, że każdy format otrzymuje niezależną instancję opcji.
  6. Walidacja rozmiaru wyjścia – Po każdym zapisie skrypt ponownie ładuje plik wyjściowy i sprawdza, czy test_image.size odpowiada rozmiarowi prostokąta, co gwarantuje pomyślne przycięcie.
  7. Czyszczenie – Pomyślnie zweryfikowane pliki są usuwane, a na koniec katalog tymczasowy zostaje usunięty.

Wnioski

Korzystając z Aspose.Imaging’s RasterImageExporter, możesz przyciąć prostokątny obszar jednorazowo i wyeksportować go do dowolnego z obsługiwanych formatów obrazu w jednym przebiegu. To podejście redukuje zbędne ładowanie, upraszcza kod i zapewnia spójny wynik we wszystkich formatach.

FAQ

  1. Czy RasterImageExporter może przycinać obrazy w dowolnym formacie? Tak, obsługuje przycinanie wszystkich formatów wymienionych w tablicy opcji zapisu, takich jak BMP, GIF, JPEG, PNG, TIFF, ICO, JP2, WebP, DICOM, TGA oraz BigTIFF.

  2. Czy muszę określić format wyjściowy przy wywoływaniu save?
    Format jest wywnioskowany z rozszerzenia pliku, które podajesz; odpowiadający obiekt save‑options definiuje wszelkie ustawienia specyficzne dla formatu.

  3. Co się stanie, jeśli prostokąt przycinania przekracza rozmiar obrazu źródłowego? Zostaje rzucony ArgumentOutOfRangeException, więc należy zwalidować prostokąt względem image.size przed zapisem.

  4. Czy klonowanie opcji zapisu jest wymagane przy każdej iteracji?
    Klonowanie tworzy nową instancję opcji dla każdego formatu, zapobiegając skutkom ubocznym, gdy ten sam obiekt jest ponownie używany.

  5. Jak mogę zweryfikować, że przycięty obraz ma oczekiwane wymiary? Ponownie załaduj zapisany plik przy użyciu Image.load i porównaj jego właściwość .size z oryginalnym Rectangle.size.

  6. Czy potrzebuję komercyjnej licencji na przycinanie? Przycinanie działa z tymczasową licencją; uzyskaj pełną licencję do użytku produkcyjnego poprzez stronę tymczasowej licencji.

Uzyskaj darmową licencję i odkryj więcej

Rozpocznij eksperymentowanie z pełną funkcjonalnością, prosząc o tymczasową licencję: https://purchase.aspose.com/temporary-license/

Zobacz także