PPTX DOCX XLSX PDF ODP
Aspose.Imaging  pour Python
GIF

Utilisez Python pour le changement d’arrière-plan des images GIF

Créez des applications Python pour modifier l’arrière-plan des images et des photos GIF via les API du serveur

Comment modifier l'arrière-plan des images et des photos GIF avec Python

Souvent, lors de l’édition d’une image au GIF, il est nécessaire de changer son arrière-plan. La première étape consiste à sélectionner les objets du premier plan dans la photo et à les distinguer du reste de l’image pour isoler les zones attribuées à l’arrière-plan. Lorsque l’arrière-plan constitue une zone uniforme, les contours des objets peuvent être automatiquement établis. Cependant, si la photo présente un arrière-plan irrégulier ou si des difficultés surviennent pour distinguer l’objet souhaité de l’arrière-plan, il est conseillé d’utiliser la méthode de marquage préliminaire de l’image. Cela implique de sélectionner des zones rectangulaires dans la photo où sont positionnés les objets anticipés et de spécifier leur type. De telles actions peuvent être exécutées manuellement ou facilitées via l’API Cloud pour une détection automatisée des objets. Suite à la sélection des objets et à la suppression du fond d’origine, vous avez la possibilité d’introduire un nouveau fond ou de le rendre transparent. Pour modifier le fond d’une image au format GIF, nous utiliserons Aspose.Imaging for Python via .NET API qui est une API de manipulation et de conversion d’images riche en fonctionnalités, puissante et facile à utiliser pour la plate-forme Python. Vous pouvez l’installer en utilisant la commande suivante à partir de votre commande système.

La ligne de commande système

>> pip install aspose-imaging-python-net

Étapes pour changer l'arrière-plan dans les GIF via Python

Vous avez besoin de aspose-imaging-python-net pour essayer le workflow suivant dans votre propre environnement.

  • Charger les fichiers GIF avec la méthode Image.Load
  • Changer de fond ;
  • Enregistrer l’image sur le disque au format pris en charge par Aspose.Imaging

Configuration requise

Aspose.Imaging pour Python est pris en charge sur tous les principaux systèmes d’exploitation. Assurez-vous simplement que vous disposez des prérequis suivants.

  • Microsoft Windows/Linux avec .NET Core Runtime.
  • Gestionnaire de packages Python et PyPi.
 

Changer l'arrière-plan dans les images GIF - Python

from aspose.imaging import Image, RasterImage, Point, Rectangle, Color
from aspose.imaging.fileformats.png import PngColorType
from aspose.imaging.imageoptions import PngOptions
from aspose.imaging.masking import *
from aspose.imaging.masking.options import *
from aspose.imaging.masking.result import *
from aspose.imaging.sources import FileCreateSource
from aspose.pycore import as_of
import os
if 'TEMPLATE_DIR' in os.environ:
templates_folder = os.environ['TEMPLATE_DIR']
else:
templates_folder = r"C:\Users\USER\Downloads\templates"
delete_output = 'SAVE_OUTPUT' not in os.environ
def remove_background_processing_with_manual_rectangles():
raster_formats = [
"jpg",
"png",
"bmp",
"apng",
"dicom",
"jp2",
"j2k",
"tga",
"webp",
"tif",
"gif",
"ico"
]
vector_formats = [
"svg",
"otg",
"odg",
"wmf",
"emf",
"wmz",
"emz",
"cmx",
"cdr"
]
all_formats: list = []
all_formats.extend(raster_formats)
all_formats.extend(vector_formats)
for format_ext in all_formats:
input_file = os.path.join(templates_folder, f"couple.{format_ext}")
if not os.path.exists(input_file):
continue
is_vector_format = format_ext in vector_formats
# Need to rasterize vector formats before background remove
if is_vector_format:
input_file = rasterize_vector_image(format_ext, input_file)
output_file = os.path.join(templates_folder, f"remove_background_manual_rectangles.{format_ext}.png")
print(f"Processing {format_ext}")
with as_of(Image.load(input_file), RasterImage) as image:
obj_init3 = AutoMaskingArgs()
obj_init3.objects_rectangles = [Rectangle(87, 47, 123, 308), Rectangle(180, 24, 126, 224)]
obj_init4 = PngOptions()
obj_init4.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
obj_init4.source = FileCreateSource(output_file, False)
obj_init5 = AutoMaskingGraphCutOptions()
obj_init5.feathering_radius = 2
obj_init5.method = SegmentationMethod.GRAPH_CUT
obj_init5.args = obj_init3
obj_init5.export_options = obj_init4
masking_options = obj_init5
with ImageMasking(image).create_session(masking_options) as masking_session:
# first run of segmentation
with masking_session.decompose() as _:
pass
args_with_user_markers = AutoMaskingArgs()
obj_init_list = [
# background markers
None,
# foreground markers
UserMarker()
# boy's head
.add_point(218, 48, 10)
# girl's head
.add_point(399, 66, 10)
# girs's body
.add_point(158, 141, 10)
.add_point(158, 209, 20)
.add_point(115, 225, 5)
.get_points()]
args_with_user_markers.objects_points = obj_init_list
with masking_session.improve_decomposition(args_with_user_markers) as masking_result:
with masking_result[1].get_image() as result_image:
result_image.save()
if delete_output:
os.remove(output_file)
# Remove rasterized vector image
if is_vector_format and delete_output:
os.remove(input_file)
def remove_background_auto_processing_with_assumed_objects():
raster_formats = [
"jpg",
"png",
"bmp",
"apng",
"dicom",
"jp2",
"j2k",
"tga",
"webp",
"tif",
"gif"]
vector_formats = [
"svg",
"otg",
"odg",
"eps",
"wmf",
"emf",
"wmz",
"emz",
"cmx",
"cdr"]
all_formats = []
all_formats.extend(raster_formats)
all_formats.extend(vector_formats)
for format_ext in all_formats:
input_file = os.path.join(templates_folder, f"couple.{format_ext}")
if not os.path.exists(input_file):
continue
is_vector_format = format_ext in vector_formats
# Need to rasterize vector formats before background remove
if is_vector_format:
input_file = rasterize_vector_image(format_ext, input_file)
output_file = os.path.join(templates_folder,
f"remove_background_auto_assumed_objects.{format_ext}.png")
print(f"Processing {format_ext}")
with as_of(Image.load(input_file), RasterImage) as image:
obj_init9 = list()
obj_init9.append(AssumedObjectData(DetectedObjectType.HUMAN, Rectangle(87, 47, 123, 308)))
obj_init9.append(AssumedObjectData(DetectedObjectType.HUMAN, Rectangle(180, 24, 126, 224)))
obj_init10 = PngOptions()
obj_init10.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
obj_init10.source = FileCreateSource(output_file, False)
obj_init11 = AutoMaskingGraphCutOptions()
obj_init11.assumed_objects = obj_init9
obj_init11.calculate_default_strokes = True
obj_init11.feathering_radius = 1
obj_init11.method = SegmentationMethod.GRAPH_CUT
obj_init11.export_options = obj_init10
obj_init11.background_replacement_color = Color.green
masking_options = obj_init11
with ImageMasking(image).decompose(masking_options) as masking_result:
with masking_result[1].get_image() as result_image:
result_image.save()
# Remove rasterized vector image
if is_vector_format and delete_output:
os.remove(input_file)
if delete_output:
os.remove(output_file)
def remove_background_auto_processing():
raster_formats = [
"jpg",
"png",
"bmp",
"apng",
"dicom",
"jp2",
"j2k",
"tga",
"webp",
"tif",
"gif"]
vector_formats = [
"svg",
"otg",
"odg",
"eps",
"wmf",
"emf",
"wmz",
"emz",
"cmx",
"cdr"]
all_formats: list = []
all_formats.extend(raster_formats)
all_formats.extend(vector_formats)
for format_ext in all_formats:
input_file = os.path.join(templates_folder, f"couple.{format_ext}")
if not os.path.exists(input_file):
continue
is_vector_format = format_ext in vector_formats
# Need to rasterize vector formats before background remove
if is_vector_format:
input_file = rasterize_vector_image(format_ext, input_file)
output_file = os.path.join(templates_folder, f"remove_background_auto.{format_ext}.png")
print(f"Processing {format_ext}")
with as_of(Image.load(input_file), RasterImage) as image:
obj_init14 = PngOptions()
obj_init14.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
obj_init14.source = FileCreateSource(output_file, False)
obj_init15 = AutoMaskingGraphCutOptions()
obj_init15.feathering_radius = 1
obj_init15.method = SegmentationMethod.GRAPH_CUT
obj_init15.export_options = obj_init14
obj_init15.background_replacement_color = Color.green
masking_options = obj_init15
with ImageMasking(image).decompose(masking_options) as masking_result:
with masking_result[1].get_image() as result_image:
result_image.save()
# Remove rasterized vector image
if is_vector_format and delete_output:
os.remove(input_file)
if delete_output:
os.remove(output_file)
def remove_background_generic_example():
raster_formats = [
"jpg",
"png",
"bmp",
"apng",
"dicom",
"jp2",
"j2k",
"tga",
"webp",
"tif",
"gif"]
vector_formats = [
"svg",
"otg",
"odg",
"wmf",
"emf",
"wmz",
"emz",
"cmx",
"cdr"]
all_formats: list = []
all_formats.extend(raster_formats)
all_formats.extend(vector_formats)
for format_ext in all_formats:
input_file = os.path.join(templates_folder, f"couple.{format_ext}")
if not os.path.exists(input_file):
continue
is_vector_format: bool = format_ext in vector_formats
# Need to rasterize vector formats before background remove
if is_vector_format:
input_file = rasterize_vector_image(format_ext, input_file)
output_file = os.path.join(templates_folder, f"remove_background.{format_ext}.png")
print(f"Processing {format_ext}")
with as_of(Image.load(input_file), RasterImage) as image:
obj_init18 = PngOptions()
obj_init18.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
obj_init18.source = FileCreateSource(output_file, False)
obj_init19 = AutoMaskingGraphCutOptions()
obj_init19.calculate_default_strokes = True
obj_init19.feathering_radius = 1
obj_init19.method = SegmentationMethod.GRAPH_CUT
obj_init19.export_options = obj_init18
obj_init19.background_replacement_color = Color.green
masking_options = obj_init19
with ImageMasking(image).decompose(masking_options) as masking_result:
with masking_result[1].get_image() as result_image:
result_image.save()
# Remove rasterized vector image
if is_vector_format and delete_output:
os.remove(input_file)
if delete_output:
os.remove(output_file)
def rasterize_vector_image(format_ext, input_file):
output_file: str = os.path.join(templates_folder, f"rasterized.{format_ext}.png")
with Image.load(input_file) as image:
image.save(output_file, PngOptions())
return output_file
class UserMarker:
def __init__(self):
self._list: list = []
def add_point(self, left, top, radius):
for y in range(top - radius, top + radius + 1):
for x in range(left - radius, left + radius + 1):
self._list.append(Point(x, y))
return self
def get_points(self):
return self._list
# Run examples
remove_background_auto_processing_with_assumed_objects()
remove_background_processing_with_manual_rectangles()
remove_background_auto_processing()
remove_background_generic_example()
 
  • À propos de l'API Aspose.Imaging pour Python

    Aspose.Imaging API est une solution de traitement d’images pour créer, modifier, dessiner ou convertir des images (photos) au sein d’applications. Il offre : le traitement d’image multiplateforme, y compris, mais sans s’y limiter, les conversions entre différents formats d’image (y compris le traitement d’image multipage ou multicadre uniforme), les modifications telles que le dessin, l’utilisation de primitives graphiques, les transformations (redimensionner, recadrer, retourner et faire pivoter , binarisation, niveaux de gris, ajustement), fonctionnalités avancées de manipulation d’images (filtrage, tramage, masquage, redressement) et stratégies d’optimisation de la mémoire. C’est une bibliothèque autonome et ne dépend d’aucun logiciel pour les opérations d’image. On peut facilement ajouter des fonctionnalités de conversion d’image hautes performances avec des API natives dans les projets. Ce sont des API sur site 100 % privées et les images sont traitées sur vos serveurs.

    Modifier l’arrière-plan dans les GIF via l’application en ligne

    Modifiez l’arrière-plan des documents GIF en visitant notre site Web de démonstrations en direct . La démo en direct présente les avantages suivants

      Pas besoin de télécharger ou de configurer quoi que ce soit
      Pas besoin d'écrire de code
      Téléchargez simplement vos fichiers GIF et cliquez sur le bouton "Modifier l'arrière-plan maintenant"
      Obtenez instantanément le lien de téléchargement du fichier résultant

    GIF Qu'est-ce que GIF Format de fichier

    Un format GIF ou Graphical Interchange est un type d'image hautement compressée. Propriété d'Unisys, GIF utilise l'algorithme de compression LZW qui ne dégrade pas la qualité de l'image. Pour chaque image, le GIF autorise généralement jusqu'à 8 bits par pixel et jusqu'à 256 couleurs sont autorisées sur l'image. Contrairement à une image JPEG, qui peut afficher jusqu'à 16 millions de couleurs et touche assez les limites de l'œil humain. À l'époque de l'émergence d'Internet, les GIF restaient le meilleur choix car ils nécessitaient une faible bande passante et étaient compatibles avec les graphiques qui consommaient des zones de couleur unies. Un GIF animé combine de nombreuses images ou cadres dans un seul fichier et les affiche dans une séquence pour générer un clip animé ou une courte vidéo. Les limitations de couleur vont jusqu'à 256 pour chaque image et sont probablement les moins appropriées pour reproduire d'autres images et photographies avec un dégradé de couleurs.

    Lire la suite

    Autres formats d'arrière-plan de modification pris en charge

    En utilisant Python, on peut facilement changer l'arrière-plan dans différents formats, y compris.

    APNG (Graphiques de réseau portables animés)
    BMP (Image bitmap)
    ICO (Icône Windows)
    JPG (Groupe mixte d'experts photographiques)
    DIB (Bitmap indépendant du périphérique)
    DICOM (Imagerie numérique et communications)
    DJVU (Format graphique)
    DNG (Image d'appareil photo numérique)
    EMF (Format de métafichier amélioré)
    EMZ (Métafichier amélioré compressé Windows)
    JP2 (JPEG 2000)
    J2K (Image compressée en ondelettes)
    PNG (Portable Network Graphics)
    TIFF (Format d'image balisé)
    WEBP (Image Web raster)
    WMF (Métafichier Microsoft Windows)
    WMZ (Skin du lecteur Windows Media compressé)
    TGA (Graphique Targa)
    SVG (Image Vectorielle)
    EPS (Langage PostScript encapsulé)
    CDR (Image de dessin vectoriel)
    CMX (Image d'échange Corel)
    OTG (Norme OpenDocument)
    ODG (Format de dessin Apache OpenOffice)