بهینه‌سازی مدیریت تصویر در ارائه‌ها با استفاده از Python

معرفی

Aspose.Slides برای Python از طریق Java راه‌های متعددی برای کار با تصاویر ارائه می‌دهد و هر یک کاربرد متفاوتی دارند. می‌توانید یک تصویر را در ارائه ذخیره کنید، آن را در یک چارچوب تصویر نمایش دهید، به عنوان پس‌زمینهٔ اسلاید استفاده کنید، به تصویر خارجی لینک بدهید، منبع تصویر مشترک را جایگزین کنید یا محتوای SVG را به اشکال قابل ویرایش تبدیل کنید.

این مقاله بر منابع تصویر و نحوهٔ استفاده از آن‌ها در یک ارائه متمرکز است. برای برش، شفافیت، افکت‌ها، کشش و سایر قالب‌بندی‌هایی که بر یک چارچوب تصویر فردی اعمال می‌شود، به قاب تصویر مراجعه کنید.

درک مدل تصویر

مفاهیم API زیر به‌طور نزدیک مرتبط هستند اما قابل تعویض نیستند:

  • مجموعه تصویر ارائه (presentation image collection) تصاویر استفاده‌شده در ارائه را ذخیره می‌کند. برای افزودن داده‌های تصویر و دریافت منبع PPImage از ImageCollection.addImage استفاده کنید.
  • یک قاب تصویر شکل (shape)‌ای است که تصویری را بر روی اسلاید، طرح‌بندی یا مستر نمایش می‌دهد. برای قرار دادن منبع تصویر در یک اسلاید از ShapeCollection.addPictureFrame استفاده کنید.
  • پس‌زمینهٔ اسلاید از یک تصویر به‌عنوان بخشی از پرکردن اسلاید استفاده می‌کند نه به‌عنوان یک شکل. بنابراین رفتار مشابه قاب تصویر ندارد.
  • PPImage.replaceImage منبع یک تصویر را جایگزین می‌کند. اگر چند عنصر ارائه از آن منبع استفاده کنند، همهٔ آنها از جایگزین استفاده می‌کنند.
  • تبدیل SVG به اشکال، اشکال قابل ویرایش اسلاید ایجاد می‌کند. پس از تبدیل، محتوا دیگر به‌عنوان یک منبع تصویر واحد مدیریت نمی‌شود.

به‌این‌ترتیب یک جریان کاری معمولی عبارت است از: افزودن داده‌های تصویر به مجموعه تصویر، دریافت یک PPImage، و سپس استفاده از آن منبع در یک یا چند قاب تصویر یا پرکردن.

افزودن تصویر توکار

برای درج یک تصویر محلی، فایل را بارگذاری کنید، آن را به مجموعه تصویر اضافه کنید و چارچوب تصویری ایجاد کنید که از PPImage بازگردانده‌شده استفاده می‌کند.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Images, Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    source_image = Images.fromFile("photo.png")
    try:
        image = presentation.getImages().addImage(source_image)
    finally:
        source_image.dispose()

    slide = presentation.getSlides().get_Item(0)
    slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 320, 180, image)

    presentation.save("presentation.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

تصویری که به این شکل اضافه می‌شود درون ارائه توکار است، بنابراین فایل خروجی به موجود بودن فایل تصویر اصلی وابسته نیست.

افزودن تصویر از وب

زمانی که یک تصویر از طریق HTTP یا HTTPS در دسترس باشد، بایت‌های آن را دانلود کنید، به مجموعه تصویر ارائه اضافه کنید و از منبع تصویر بازگردانده‌شده به همان شیوهٔ تصویر محلی استفاده کنید.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from urllib.request import urlopen
from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    with urlopen("https://example.com/image.png", timeout=10) as response:
        image_data = response.read()

    image_bytes = jpype.JArray(jpype.JByte)(image_data)
    image = presentation.getImages().addImage(image_bytes)
    slide = presentation.getSlides().get_Item(0)
    slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 320, 180, image)

    presentation.save("presentation-from-web.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

در برنامه‌های طولانی‌مدت، به‌جای ایجاد مکرر زیرساخت‌های شبکه‌ای غیرضروری، از یک کلاینت HTTP یا استراتژی مدیریت اتصال مناسب برای برنامه استفاده کنید. همچنین هنگامیکه منبع قابل اعتماد نیست، URLهای خارجی، اندازهٔ پاسخ‌ها و انواع محتوا را اعتبارسنجی کنید.

بازاستفاده از تصاویر در اسلایدها

اگر یک تصویر چندین بار مورد نیاز باشد، یکبار آن را به ارائه اضافه کنید و هنگام ایجاد چارچوب‌های تصویر اضافی از PPImage بازگردانده‌شده استفاده کنید. این کار از بارگذاری مکرر داده‌های منبع جلوگیری می‌کند و رابطهٔ بین منبع تصویر مشترک و استفاده‌های آن را واضح می‌کند.

برای گرافیک‌هایی که باید به‌صورت خودکار در بسیاری از اسلایدها ظاهر شوند، مانند لوگوی شرکت، در نظر بگیرید که چارچوب تصویر را بر روی یک مستر اسلاید یا طرح‌بندی قرار دهید به‌جای افزودن یک شکل معادل به هر اسلاید.

استفاده از تصویر به‌عنوان پس‌زمینهٔ اسلاید

تصویر پس‌زمینه به پرکردن اسلاید اختصاص می‌یابد؛ به‌عنوان شکل چارچوب تصویر اضافه نمی‌شود. این زمانی مفید است که تصویر باید کل پس‌زمینهٔ اسلاید را پوشش دهد و نباید مانند یک شیء اسلاید معمولی دستکاری شود.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Images, PictureFillMode, Presentation, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    source_image = Images.fromFile("background.jpg")
    try:
        image = presentation.getImages().addImage(source_image)
    finally:
        source_image.dispose()

    slide.getBackground().setType(BackgroundType.OwnBackground)
    slide.getBackground().getFillFormat().setFillType(FillType.Picture)
    slide.getBackground().getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch)
    slide.getBackground().getFillFormat().getPictureFillFormat().getPicture().setImage(image)

    presentation.save("background-image.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

برای گزینه‌های بیشتر پس‌زمینه، شامل پس‌زمینه‌های مستر و طرح‌بندی، به پس‌زمینهٔ ارائه مراجعه کنید.

تصاویر توکار و تصاویر لینک‌شده

تصاویر توکار و لینک‌شده تعادل‌های متفاوتی در زمینهٔ قابلیت حمل و اندازهٔ فایل دارند:

  • تصویر توکار: داده‌های تصویر درون ارائه ذخیره می‌شوند. ارائه خودکفا است، اما اندازهٔ فایل شامل داده‌های تصویر می‌شود.
  • تصویر لینک‌شده: ارائه مسیری یا URL به تصویر خارجی را ذخیره می‌کند. این می‌تواند اندازهٔ ارائه را کاهش دهد، اما منبع خارجی باید هنگام باز یا رندر شدن ارائه قابل دسترسی باقی بماند.

یک تصویر لینک‌شده می‌تواند با اختصاص مسیر یا URL خارجی از طریق Picture.setLinkPathLong به‌جای توکار کردن داده‌های تصویر ایجاد شود.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    picture_frame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 320, 180, None)
    picture_frame.getPictureFormat().getPicture().setLinkPathLong("https://example.com/image.png")

    presentation.save("linked-image.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

از تصاویر لینک‌شده فقط زمانی استفاده کنید که محیط استقرار بتواند به‌صورت قابل اعتماد به منبع خارجی دسترسی داشته باشد. برای ارائه‌هایی که باید به‌صورت آفلاین کار کنند یا بین سیستم‌ها جابجا شوند، تصاویر توکار معمولاً ایمن‌تر هستند.

کار با تصاویر SVG

SVG یک فرمت برداری است، بنابراین برای آیکون‌ها، نمودارها و گرافیک‌های دیگری که باید بدون افت جزئیات همانند تصاویر رستری مقیاس‌پذیر باشند، مفید است. Aspose.Slides هر دو به‌عنوان منبع تصویر و به‌عنوان منبعی برای اشکال قابل ویرایش اسلاید از SVG پشتیبانی می‌کند.

افزودن SVG به‌عنوان تصویر

یک SvgImage ایجاد کنید، آن را به مجموعه تصویر اضافه کنید و منبع تصویر حاصل را در یک چارچوب تصویر قرار دهید.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from asposeslides.api import Presentation, SaveFormat, ShapeType, SvgImage

presentation = Presentation()
try:
    svg_content = Path("icon.svg").read_text(encoding="utf-8")
    svg_image = SvgImage(svg_content)

    image = presentation.getImages().addImage(svg_image)
    slide = presentation.getSlides().get_Item(0)
    slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 200, 200, image)

    presentation.save("svg-image.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

فایل‌های SVG با منابع خارجی

یک SVG می‌تواند به تصاویر، سبک‌نامه‌ها یا قلم‌های خارجی اشاره کند. برای این موارد، SvgImage سازنده‌هایی ارائه می‌دهد که یک ExternalResourceResolver و یک URI پایه را می‌پذیرند. این رزولور می‌تواند URI نسبی را به URI مطلق مجاز تبدیل کند و یک جریان برای منبع درخواست‌شده برگرداند.

رزولور منابع خارجی را هنگام پردازش SVG توسط Aspose.Slides در دسترس می‌گذارد، اما SVG را به سند خودکفا بازنویسی نمی‌کند. اگر SVG باید قابل حمل بماند، منابع مورد نیاز آن را در خود SVG توکار کنید، مثلا با استفاده از URIهای data: برای تصاویر لینک‌شده.

وقتی فایل‌های SVG از منابع غیرقابل اعتماد می‌آیند، طرح‌ها، مکان‌های فایل و میزبان‌هایی را که رزولور می‌تواند به آن‌ها دسترسی داشته باشد محدود کنید. رزولورهای شبکه همچنین باید محدودیت‌های زمان انتظار، اندازهٔ پاسخ و اعتبارسنجی محتوا را اعمال کنند.

تبدیل SVG به اشکال قابل ویرایش

Aspose.Slides می‌تواند یک SVG را به گروهی از اشکال قابل ویرایش اسلاید تبدیل کند، مشابه فرمان مربوطه در PowerPoint.

منوی بازشو PowerPoint

از overload ShapeCollection.addGroupShape که یک SvgImage می‌پذیرد برای انجام تبدیل استفاده کنید.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from asposeslides.api import Presentation, SaveFormat, SvgImage

presentation = Presentation()
try:
    svg_content = Path("diagram.svg").read_text(encoding="utf-8")
    svg_image = SvgImage(svg_content)

    slide_size = presentation.getSlideSize().getSize()
    slide = presentation.getSlides().get_Item(0)
    slide_width = jpype.JFloat(slide_size.getWidth())
    slide_height = jpype.JFloat(slide_size.getHeight())
    slide.getShapes().addGroupShape(svg_image, 0, 0, slide_width, slide_height)

    presentation.save("editable-svg-shapes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

از تبدیل SVG به اشکال استفاده کنید وقتی که عناصر برداری جداگانه نیاز به ویرایش به‌عنوان اشکال PowerPoint دارند. اگر SVG فقط نیاز به نمایش داشته باشد، نگه‌دارندهٔ آن به‌عنوان تصویر ساده‌تر است و از ایجاد اشکال جداگانهٔ متعدد جلوگیری می‌کند.

جایگزینی منبع تصویر موجود

زمانی که می‌خواهید منبع تصویر موجود را جایگزین کنید، از PPImage.replaceImage استفاده کنید. این به‌ویژه برای گرافیک‌های مشترک مانند لوگوها مفید است.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Images, Presentation, SaveFormat

presentation = Presentation("input.pptx")
try:
    image_to_replace = presentation.getImages().get_Item(0)

    replacement_image = Images.fromFile("new-logo.png")
    try:
        image_to_replace.replaceImage(replacement_image)
    finally:
        replacement_image.dispose()

    presentation.save("output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

اگر چندین چارچوب تصویر، پس‌زمینه، مستر یا طرح‌بندی از یک منبع تصویر استفاده کنند، جایگزینی آن منبع تمام موارد استفاده را به‌روز می‌کند. اگر فقط یک چارچوب تصویر باید تغییر کند، به‌جای جایگزینی منبع مشترک، تصویر متفاوتی به آن چارچوب اختصاص دهید.

PPImage.replaceImage همچنین overloadهایی ارائه می‌دهد که یک آرایه بایت یا یک PPImage دیگر را می‌پذیرند.

راهنمایی‌های عملی مدیریت تصویر

کنترل اندازهٔ ارائه

تصاویر رستری بزرگ می‌توانند اندازهٔ ارائه را بی‌دلیل زیاد کنند. از تصاویر منبع با ابعاد مناسب برای اندازهٔ نمایش موردنظر استفاده کنید، در صورت امکان منابع تصویر مشترک را بازاستفاده کنید و از توکار کردن نسخه‌های تکراری یک گرافیک با وضوح کامل خودداری کنید.

برای تصاویر رستری که پیش از این در چارچوب‌های تصویر قرار گرفته‌اند، PictureFillFormat.compressImage می‌تواند داده‌های تصویر را بر اساس وضوح انتخابی و تنظیمات برش کاهش دهد. این پردازش چارچوب تصویر است نه مدیریت مجموعه تصویر، بنابراین برای عملیات قالب‌بندی مرتبط به قاب تصویر مراجعه کنید.

انتخاب بین محتوای توکار و لینک‌شده

توکار کردن ارائه را قابل حمل می‌کند زیرا تمام داده‌های تصویری مورد نیاز با فایل همراه هستند. لینک کردن می‌تواند اندازهٔ فایل را کاهش دهد، اما وابستگی خارجی ایجاد می‌کند. از لینک‌ها فقط زمانی استفاده کنید که این وابستگی قابل قبول و پایدار باشد.

بازاستفاده از برند مشترک

برای لوگوها، واترمارک‌ها یا گرافیک‌های تزئینی مکرر، از یک منبع تصویر استفاده کنید و آن را بازاستفاده کنید. اگر گرافیک متعلق به طراحی ارائه باشد نه محتوای اسلاید، آن را بر روی یک مستر یا طرح‌بندی قرار دهید تا توسط اسلایدهای مربوطه به ارث برسد.

حفظ قابلیت حمل منابع SVG

یک SVG خودکفا جابجایی و رندر کردن ثابت‌تری نسبت به SVGی که به فایل‌ها یا منابع شبکه‌ای خارجی وابسته است دارد. در صورت امکان، منابع مورد نیاز را پیش از وارد کردن SVG توکار کنید. تبدیل SVG به اشکال فقط زمانی انجام شود که عناصر برداری جداگانه نیاز به ویرایش داشته باشند.

استفاده از API تصویر مدرن چندپلتفرمی

برای کدهای جدید Python از طریق Java، از اشیاء تصویر چندپلتفرمی Aspose.Slides و APIهای Images به‌جای API عمومی قدیمی مبتنی بر java.awt.image.BufferedImage استفاده کنید. برای راهنمایی مهاجرت به API مدرن مراجعه کنید.

قالب‌های WMF و EMF نیاز به توجه خاص دارند. وقتی این قالب‌ها از طریق یک شیء تصویر چندپلتفرمی عبور می‌کنند، ImageCollection.addImage متافایل را قبل از درج به یک نمایش PNG رستری تبدیل می‌کند. اگر حفظ داده‌های متافایل مهم باشد، به‌جای آن از overload مبتنی بر جریان ImageCollection.addImage استفاده کنید. تولید محتوای EMF از صفحه‌گسترده‌ها یا محصولات دیگر یک گردش کار ادغامی جداگانه است و خارج از محدودهٔ این مقاله می‌باشد.

پرسش‌های متداول

فرق بین مجموعه تصویر و قاب تصویر چیست؟

مجموعه تصویر منابع تصویری قابل بازاستفاده را ذخیره می‌کند. یک قاب تصویر شکل اسلایدی است که یکی از آن منابع را نمایش می‌دهد و قالب‌بندی‌های مختص تصویر مانند برش و افکت‌ها را فراهم می‌کند.

بهترین روش برای جایگزینی لوگوی یکسان در همه‌جا چیست؟

اگر لوگو قبلاً به‌عنوان یک منبع تصویر مشترک است، آن منبع را با PPImage.replaceImage جایگزین کنید. برای برندینگ سراسری ارائه، قرار دادن لوگو بر روی یک مستر یا طرح‌بندی نیز می‌تواند محتوای اسلایدهای تکراری را کاهش دهد.

چرا یک تصویر لینک‌شده در کامپیوتر دیگر ناپدید می‌شود؟

یک تصویر لینک‌شده به فایل یا URL خارجی خود وابسته است. اگر آن منبع از کامپیوتر دیگر قابل دسترسی نباشد، تصویر لینک‌شده ممکن است در دسترس نباشد. هنگامی که ارائه باید خودکفا باشد، تصویر را توکار کنید.

آیا می‌توان یک SVG درج‌شده را به‌عنوان اشکال PowerPoint ویرایش کرد؟

بله. SVG را با ShapeCollection.addGroupShape تبدیل کنید؛ گروه حاصل شامل اشکال قابل ویرایش اسلاید است نه یک تصویر SVG.

چگونه می‌توانم ارائه‌هایی با تعداد زیاد تصویر را کوچکتر نگه دارم؟

منابع تصویر مشترک را بازاستفاده کنید، از منابع رستری بزرگ غیرضروری خودداری کنید، در صورت لزوم تصاویر رستری مناسب را فشرده کنید، برندینگ مکرر را بر روی مسترها یا طرح‌بندی‌ها نگه دارید و فقط زمانی از تصاویر لینک‌شده استفاده کنید که وابستگی خارجی قابل قبول باشد.