จัดการ Picture Frame ในงานนำเสนอด้วย Python
ภาพรวม
Picture frame คือรูปทรงบนสไลด์ที่แสดงรูปภาพ ใน Aspose.Slides, แหล่งข้อมูลรูปภาพและรูปทรงที่แสดงรูปภาพเป็นอ็อบเจ็กต์แยกกัน: Presentation เป็นเจ้าของแหล่งข้อมูลรูปภาพที่ฝังไว้ผ่าน ImageCollection, ในขณะที่ PictureFrame ควบคุมตำแหน่งของรูปภาพ, ขนาด, การจัดรูปแบบเส้น, การหมุน, การครอป, เอฟเฟกต์รูปภาพ, และการตั้งค่าระดับเฟรมอื่นๆ
การแยกนี้มีประโยชน์เมื่อรูปภาพเดียวกันถูกแสดงมากกว่าหนึ่งครั้ง เพิ่มรูปภาพลงในงานนำเสนอเพียงครั้งเดียว, เก็บ PPImage ที่คืนค่า, แล้วใช้แหล่งข้อมูลรูปภาพนั้นเมื่อสร้าง picture frame
Picture frame สามารถบรรจุรูปภาพแบบ raster เช่น PNG หรือ JPEG และรูปภาพเวกเตอร์ SVG ได้ นอกจากนี้ยังสามารถอ้างอิงรูปภาพที่เชื่อมโยง (linked) แทนการเก็บไบต์ของรูปภาพในงานนำเสนอ ตัวเลือกนี้ส่งผลต่อความพกพา, ขนาดไฟล์, การสกัดและพฤติกรรมการส่งออก ดังนั้นจึงควรตัดสินใจก่อนว่ารูปภาพจะถูกจัดเก็บอย่างไรก่อนที่จะทำการจัดรูปแบบหรือปรับแต่ง
เพิ่มและจัดรูปแบบรูปภาพฝังไว้
สำหรับรูปภาพฝังไว้ ให้เพิ่มข้อมูลรูปภาพลงในงานนำเสนอและสร้าง picture frame ด้วย ShapeCollection.addPictureFrame รูปภาพจะกลายเป็นส่วนหนึ่งของแพ็กเกจงานนำเสนอ ทำให้งานนำเสนอคงอยู่ในตัวเองเมื่อนำไปย้ายไปยังคอมพิวเตอร์เครื่องอื่น
ตัวอย่างต่อไปนี้เพิ่มรูป JPEG, สร้างเฟรมที่มีขนาดตามมิติธรรมชาติของรูปภาพ, และทำการจัดรูปแบบเส้นและการหมุน:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from java.awt import Color
from asposeslides.api import FillType, Images, Presentation, SaveFormat, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
source_image = Images.fromFile("photo.jpg")
try:
image = presentation.getImages().addImage(source_image)
finally:
source_image.dispose()
picture_frame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 100, image.getWidth(), image.getHeight(), image)
picture_frame.getLineFormat().getFillFormat().setFillType(FillType.Solid)
picture_frame.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE)
picture_frame.getLineFormat().setWidth(3)
picture_frame.setRotation(15)
presentation.save("picture-frame.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Picture frame ควบคุมรูปทรงที่แสดง; การเปลี่ยนขนาดเฟรมไม่ได้เปลี่ยนมิติพิกเซลดั้งเดิมที่เก็บในแหล่งข้อมูลรูปภาพฝังไว้ ความแตกต่างนี้สำคัญเมื่อต้องทำการครอปหรือบีบอัดรูปภาพในภายหลัง
ใช้สเกลสัมพัทธ์
PictureFrame เปิดเผยการสเกลความกว้างและความสูงแบบสัมพัทธ์ของเฟรมผ่าน setRelativeScaleWidth และ setRelativeScaleHeight ค่า 1.0 หมายถึง 100% ของขนาดรูปภาพต้นฉบับ สเกลสัมพัทธ์มีประโยชน์เมื่อกระบวนการทำงานต้องคงความสัมพันธ์กับขนาดรูปภาพต้นฉบับแทนการคำนวณขนาดสุดท้ายด้วยตนเอง
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Images, Presentation, SaveFormat, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
source_image = Images.fromFile("photo.jpg")
try:
image = presentation.getImages().addImage(source_image)
finally:
source_image.dispose()
picture_frame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, image)
picture_frame.setRelativeScaleWidth(1.35)
picture_frame.setRelativeScaleHeight(0.8)
presentation.save("relative-scale.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
การสเกลสัมพัทธ์เปลี่ยนการตั้งค่าขนาดของเฟรม; มันไม่ได้ทำการรีซามพลิงหรือบีบอัดรูปภาพฝังไว้
รูปภาพฝังไว้และรูปภาพเชื่อมโยง
รูปภาพฝังไว้เก็บข้อมูลรูปภาพภายในงานนำเสนอ ดังนั้นจึงเป็นตัวเลือกที่ปลอดภัยที่สุดสำหรับความพกพาและการแสดงผลที่คาดเดาได้ รูปภาพเชื่อมโยงจะเก็บตำแหน่งที่อยู่นอกงานนำเสนอผ่านเมธอด Picture.setLinkPathLong แทนการฝังข้อมูลรูปภาพในลักษณะเดียวกัน
รูปภาพเชื่อมโยงสามารถลดปริมาณข้อมูลรูปภาพที่เก็บใน PPTX ได้ แต่ก็สร้างการพึ่งพาภายนอก ไฟล์ที่เชื่อมโยงต้องสามารถเข้าถึงได้โดยแอปพลิเคชันที่เปิดหรือเรนเดอร์งานนำเสนอ หากเส้นทางเปลี่ยน, ไฟล์ถูกย้าย, หรือแหล่งข้อมูลไม่พร้อมใช้งาน รูปภาพเชื่อมโยงอาจไม่แสดงตามที่คาดหวัง สำหรับงานนำเสนอที่ต้องส่งอีเมล, เก็บเป็นไฟล์เก่า, หรือเรนเดอร์ในสภาพแวดล้อมแยก, รูปภาพฝังไว้มักจะเชื่อถือได้มากกว่า
เพิ่มรูปภาพเชื่อมโยง
ตัวอย่างต่อไปนี้สร้าง picture frame และชี้ไปยังไฟล์รูปภาพภายในเครื่อง มุ่งเน้นที่การเชื่อมโยงรูปภาพเท่านั้น; การเชื่อมโยงวิดีโอเป็นกระบวนการสื่ออื่นและไม่ได้รวมไว้ในตัวอย่างนี้โดยเจตนา
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from pathlib import Path
from asposeslides.api import Presentation, SaveFormat, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
picture_frame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 320, 180, None)
linked_image_file = Path("linked-image.jpg").resolve()
link_path = str(linked_image_file)
picture_frame.getPictureFormat().getPicture().setLinkPathLong(link_path)
presentation.save("linked-image.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
ใช้ลิงก์เมื่อการจัดการไฟล์ภายนอกเป็นจุดประสงค์ อย่าใช้เป็นวิธีทดแทนการบีบอัด: PPTX ขนาดเล็กที่มีการพึ่งพารูปภาพหักระงับมักจะไม่มีประโยชน์เท่ากับงานนำเสนอที่มีขนาดใหญ่และเป็นอิสระ
สกัดรูปภาพจาก Picture Frame
ก่อนจะสกัดรูปภาพจากงานนำเสนอที่มีอยู่, ตรวจสอบให้แน่ใจว่า shape นั้นเป็น PictureFrame จริงและว่ามันมีรูปภาพฝังไว้ Picture frame ที่เชื่อมโยงอาจไม่มีไบต์ของรูปภาพที่สามารถสกัดได้ในลักษณะเดียวกัน
สกัดรูปภาพ Raster
API รูปภาพสมัยใหม่ทำงานกับรูปภาพ raster โดยตรงและไม่ต้องอาศัย wrapper ของ Java รุ่นเก่า ตัวอย่างต่อไปนี้ค้นหารูปภาพ raster ฝังแรกบนสไลด์และบันทึกเป็น PNG:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ImageFormat, Presentation, PictureFrame
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for shape in slide.getShapes():
if not isinstance(shape, PictureFrame):
continue
picture_frame = shape
embedded_image = picture_frame.getPictureFormat().getPicture().getImage()
if embedded_image is None or embedded_image.getSvgImage() is not None:
continue
raster_image = embedded_image.getImage()
try:
raster_image.save("extracted-image.png", ImageFormat.Png)
finally:
raster_image.dispose()
break
finally:
presentation.dispose()
การบันทึกรูปภาพ raster จะเปลี่ยนรูปภาพที่สกัดเป็นรูปแบบเอาต์พุตที่ร้องขอ หากต้องการไบต์ที่เข้ารหัสเก็บอยู่ในงานนำเสนอแทนไฟล์ raster ที่แปลงแล้ว ให้ใช้ข้อมูลไบนารีของแหล่งรูปภาพแทน
สกัดรูปภาพ SVG
สำหรับรูปภาพ SVG, PPImage ให้บริการอ็อบเจ็กต์ SvgImage ซึ่งทำให้คุณเรียกข้อมูล SVG โดยตรงแทนการเรนเดอร์รูปภาพเป็น raster ก่อน
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from pathlib import Path
from asposeslides.api import Presentation, PictureFrame
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for shape in slide.getShapes():
if not isinstance(shape, PictureFrame):
continue
picture_frame = shape
embedded_image = picture_frame.getPictureFormat().getPicture().getImage()
svg_image = embedded_image.getSvgImage() if embedded_image is not None else None
if svg_image is None:
continue
svg_data = svg_image.getSvgData()
Path("extracted-image.svg").write_bytes(bytes(svg_data))
break
finally:
presentation.dispose()
การเก็บเนื้อหา SVG เป็น SVG จะรักษาแหล่งเวกเตอร์ไว้ในงานนำเสนอ การส่งออกเป็น raster เช่น PNG หรือ JPEG จะต้องเรนเดอร์เนื้อหาเวกเตอร์นั้นเป็นพิกเซล การส่งออกสไลด์เป็น PDF หรือ SVG ก็เป็นการเรนเดอร์เช่นกัน ดังนั้นกราฟิกที่ส่งออกไม่ควรถูกมองว่าเป็นสำเนาไบต์ต่อไบต์ของ SVG ฝังไว้; ใช้ข้อมูลจาก SvgImage.getSvgData เมื่อจำเป็นต้องใช้แหล่งเวกเตอร์ต้นฉบับจริง
ครอปรูปภาพ
การครอปเปลี่ยนส่วนที่มองเห็นของรูปภาพภายในเฟรม ค่า crop บน PictureFillFormat เป็นเปอร์เซ็นต์ของมิติรูปภาพต้นฉบับ การครอปไม่ลบพิกเซลที่ซ่อนอยู่จากรูปภาพฝังไว้ในตอนแรก; มันเพียงเปลี่ยนพื้นที่ที่มองเห็น
ตัวอย่างต่อไปนี้ค้นหา picture frame อย่างปลอดภัยและใช้ค่า crop:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, PictureFrame
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
picture_frame = None
for shape in slide.getShapes():
if isinstance(shape, PictureFrame):
picture_frame = shape
break
if picture_frame is not None:
picture_frame.getPictureFormat().setCropLeft(23.6)
picture_frame.getPictureFormat().setCropRight(21.5)
picture_frame.getPictureFormat().setCropTop(3)
picture_frame.getPictureFormat().setCropBottom(31)
presentation.save("cropped-image.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
เนื่องจากข้อมูลรูปภาพที่ซ่อนอยู่ยังคงอยู่ การครอปสามารถเปลี่ยนแปลงได้ในภายหลังโดยไม่สูญเสียพิกเซลต้นฉบับ หากขนาดไฟล์มีความสำคัญกว่าความสามารถในการย้อนกลับ พื้นที่ที่ครอปแล้วสามารถลบจริงได้ตามที่อธิบายในส่วนต่อไป
ลบข้อมูลรูปภาพที่ครอปแล้ว
PictureFillFormat.deletePictureCroppedAreas จะลบข้อมูลรูปภาพที่อยู่นอกสี่เหลี่ยมครอปปัจจุบันและคืนแหล่งรูปภาพที่ได้ ผลลัพธ์คือขนาดไฟล์ลดลง แต่เป็นการปรับแต่งทำลาย ถ้าบันทึกงานนำเสนอแล้ว พิกเซลที่ลบจะไม่มีให้ทำการยกเลิกครอปในภายหลัง
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, PictureFrame
presentation = Presentation("cropped-image.pptx")
try:
slide = presentation.getSlides().get_Item(0)
picture_frame = None
for shape in slide.getShapes():
if isinstance(shape, PictureFrame):
picture_frame = shape
break
if picture_frame is not None:
cropped_image = picture_frame.getPictureFormat().deletePictureCroppedAreas()
if cropped_image is not None:
presentation.save("cropped-data-removed.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
เมธอดนี้อาจเพิ่มแหล่งรูปภาพใหม่ลงในงานนำเสนอ หากรูปภาพต้นฉบับยังถูกใช้งานโดย picture frame อื่นๆ อยู่, เฟรมเหล่านั้นยังคงต้องการแหล่งเดิม ดังนั้นการลบพื้นที่ที่ครอปไม่ได้จำเป็นต้องลดจำนวนรูปภาพทั้งหมด การครอป WMF หรือ EMF ด้วยเมธอดนี้จะทำให้ผลลัพธ์ที่ครอปเป็น raster ไปเป็น PNG
บีบอัดรูปภาพ Raster
PictureFillFormat.compressImage ลดความละเอียดของรูปภาพ raster ตามขนาดที่รูปภาพถูกแสดง มันยังสามารถลบพื้นที่ที่ครอปในขั้นตอนเดียวได้ เมธอดจะคืนค่า True เมื่อรูปภาพถูกปรับขนาดหรือครอปและคืนค่า False เมื่อไม่มีการเปลี่ยนแปลงใดๆ จำเป็น
ใช้ค่าที่กำหนดไว้ล่วงหน้าใน PicturesCompression เมื่อความละเอียดเป้าหมายมาตรฐานเพียงพอ:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import PicturesCompression, Presentation, SaveFormat, PictureFrame
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
picture_frame = None
for shape in slide.getShapes():
if isinstance(shape, PictureFrame):
picture_frame = shape
break
if picture_frame is not None:
compressed = picture_frame.getPictureFormat().compressImage(True, PicturesCompression.Dpi150)
print("The image was compressed." if compressed else "No compression was necessary.")
presentation.save("compressed-image.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
สามารถส่งค่า DPI บวกที่กำหนดเองแทนค่าที่กำหนดไว้ล่วงหน้าเมื่อมีเป้าหมายเฉพาะต้องการ
การบีบอัดนี้ออกแบบมาสำหรับรูปภาพ raster; เนื้อหา SVG และเมตาไฟล์จะไม่ลดลงด้วยกระบวนการบีบอัด raster นี้ นอกจากนี้จำไว้ว่าความละเอียดที่ต่ำลงและพื้นที่ที่ครอปที่ถูกลบไม่สามารถกู้คืนจากงานนำเสนอที่ทำการปรับแต่งแล้ว เลือกความละเอียดเป้าหมายโดยอิงจากขนาดสูงสุดที่รูปภาพจะถูกดูหรือส่งออกจริง แทนการใช้ DPI ต่ำที่สุดทั่วทั้งไฟล์
จัดการเอฟเฟกต์การแปลงรูปภาพ
สำหรับกระบวนการทำงานที่ครอบคลุมความสว่าง, ความคอนทราสต์, การแปลงสี, การเบลอ, เอฟเฟกต์อัลฟา, เชนลำดับ, การตรวจสอบ, การลบ, และการตรวจสอบรอบกลับแบบเต็มรูปแบบ, ดูที่ Image Transform Effects
ล็อกเรขาคณิตของ Picture Frame
การตั้งค่า PictureFrameLock ควบคุมว่าการดำเนินการแก้ไขใดบ้างที่ถูกปิดใช้งานสำหรับ picture frame ตัวอย่างเช่น, setAspectRatioLocked จะคงอัตราส่วนของรูปทรงขณะปรับขนาด
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Images, Presentation, SaveFormat, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
source_image = Images.fromFile("photo.jpg")
try:
image = presentation.getImages().addImage(source_image)
finally:
source_image.dispose()
picture_frame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 100, image.getWidth(), image.getHeight(), image)
picture_frame.getPictureFrameLock().setAspectRatioLocked(True)
presentation.save("locked-picture-frame.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
การล็อกนี้ใช้กับ shape ของ picture frame เท่านั้น ไม่บังคับให้ภาพต้นฉบับต้องถูกรีซามพลิงหรือเปลี่ยนอัตราส่วนอย่างถาวร
ปรับค่า StretchOffset
เมื่อโหมดการเติมภาพเป็น stretch, ค่าที่อยู่ใน PictureFillFormat จะกำหนดสี่เหลี่ยมเติมสัมพันธ์กับกล่องขอบของ picture frame ค่าร้อยละบวกจะสร้างการเยื้องจากขอบ, ส่วนค่าร้อยละลบจะสร้างการขยายออก
นี่แตกต่างจากการครอป ค่า crop เลือกส่วนของภาพต้นฉบับที่มองเห็น; stretch offset จะเปลี่ยนสี่เหลี่ยมที่ภาพเติมที่มองเห็นถูกยืด
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Images, PictureFillMode, Presentation, SaveFormat, ShapeType
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
source_image = Images.fromFile("photo.png")
try:
image = presentation.getImages().addImage(source_image)
finally:
source_image.dispose()
picture_frame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 400, 300, image)
picture_frame.getPictureFormat().setPictureFillMode(PictureFillMode.Stretch)
picture_frame.getPictureFormat().setStretchOffsetLeft(12)
picture_frame.getPictureFormat().setStretchOffsetRight(12)
picture_frame.getPictureFormat().setStretchOffsetTop(8)
picture_frame.getPictureFormat().setStretchOffsetBottom(8)
presentation.save("stretch-offsets.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
ใช้ stretch offset สำหรับการจัดวางการเติม ใช้คุณสมบัติ crop เมื่อเป้าหมายคือซ่อนขอบของภาพต้นฉบับ
การจัดเก็บ, ขนาดไฟล์, และข้อพิจารณาการส่งออก
ข้อเท็จจริงหลักจะจัดการได้ง่ายขึ้นเมื่อการจัดเก็บรูปภาพและการจัดรูปแบบ picture frame แยกจากกัน:
- รูปภาพฝังไว้ ทำให้งานนำเสนอเป็นอิสระและเป็นทางเลือกที่เชื่อถือได้ที่สุดสำหรับการแชร์และการเรนเดอร์บนเซิร์ฟเวอร์, แต่รูปภาพ raster ขนาดใหญ่จะเพิ่มขนาด PPTX และการใช้หน่วยความจำ
- รูปภาพเชื่อมโยง สามารถทำให้แพ็คเกจมีขนาดเล็กลง, แต่งานนำเสนอขึ้นอยู่กับไฟล์ภายนอกที่ต้องยังคงเข้าถึงได้ตามเส้นทางหรือที่ตั้งที่จัดเก็บไว้
- การครอป ในขั้นต้นไม่ทำลาย; พิกเซลที่ซ่อนอยู่ยังคงฝังอยู่จนกว่าพื้นที่ที่ครอปจะถูกลบโดยเจตนาหรือระหว่างการบีบอัด
- การบีบอัด สามารถลดขนาดไฟล์ได้อย่างมากสำหรับรูปภาพ raster ขนาดใหญ่, แต่จะเสียความละเอียดของแหล่งต้นฉบับ ควรทำหลังจากที่ทราบขนาดที่จะแสดงบนสไลด์แล้ว
- รูปภาพ SVG ควรคงเป็น SVG เมื่อต้องการรักษาเวกเตอร์ไว้. สกัด SVG ฝังโดยตรงเมื่อต้องการแหล่งเวกเตอร์เอง. การส่งออกสไลด์เป็น raster เช่น PNG หรือ JPEG จะต้องแปลงเวกเตอร์เป็นพิกเซลเสมอ
- รูปภาพที่ใช้ซ้ำ ควรใช้แหล่ง PPImage ที่มีอยู่แล้วเมื่อเป็นไปได้ แทนการโหลดไฟล์เดียวกันหลายครั้งเข้าสู่กระบวนการทำงานของงานนำเสนอ
สำหรับงานนำเสนอขนาดใหญ่, การปรับแต่งรูปภาพมักจะได้ผลมากที่สุดเมื่อทำแบบเลือกสรร: เก็บโลโก้และไดอะแกรมเป็นเนื้อหาเวกเตอร์, บีบอัดภาพถ่ายตามขนาดการแสดงผลจริง, ลบพิกเซลที่ครอปเมื่อไม่ต้องการแก้ไขต่อในภายหลัง, และหลีกเลี่ยงลิงก์ภายนอก เว้นแต่การจัดการการพึ่งพาจะเป็นส่วนหนึ่งของการออกแบบการปรับใช้
คำถามที่พบบ่อย
ความแตกต่างระหว่าง picture frame และแหล่งข้อมูลรูปภาพคืออะไร?
PPImage แทนแหล่งข้อมูลรูปภาพที่เชื่อมกับงานนำเสนอ. PictureFrame คือรูปทรงบนสไลด์ที่แสดงรูปภาพและเก็บเรขาคณิตและการจัดรูปแบบระดับเฟรม เช่น ขนาด, การหมุน, ค่าครอป, เอฟเฟกต์, และการล็อก
ควรฝังหรือเชื่อมโยงรูปภาพ?
ฝังรูปภาพเมื่อจำเป็นต้องให้งานนำเสนอพกพา, เก็บเป็นไฟล์เก่า, หรือเรนเดอร์โดยไม่ต้องพึ่งพาแหล่งภายนอก. เชื่อมโยงรูปภาพเฉพาะเมื่อต้องการเก็บไฟล์รูปภาพไว้นอก PPTX อย่างตั้งใจและตำแหน่งภายนอกสามารถจัดการได้อย่างมั่นคง
การครอปลดขนาดไฟล์ PPTX หรือไม่?
ไม่ได้โดยตรง ตั้งค่าครอปปกติจะซ่อนส่วนของภาพต้นฉบับแต่ยังคงเก็บพิกเซลไว้ ใช้ PictureFillFormat.deletePictureCroppedAreas หรือการบีบอัดรูปภาพพร้อมการลบพื้นที่ที่ครอปเมื่อพิกเซลเหล่านั้นสามารถละทิ้งได้อย่างถาวร
สามารถกู้คืนคุณภาพภาพหลังการบีบอัดได้หรือไม่?
ไม่ได้ การบีบอัดอาจลดความละเอียด raster ที่เก็บไว้, และการลบพื้นที่ที่ครอปจะทิ้งข้อมูลภาพไป เก็บภาพต้นฉบับนอกงานนำเสนอไว้หากอาจต้องแก้ไขความละเอียดสูงในภายหลัง
ควรจัดการรูปภาพ SVG อย่างไร?
เก็บเนื้อหา SVG เป็น SVG เมื่อความแม่นยำของเวกเตอร์สำคัญ. สามารถสกัด SvgImage ฝังโดยตรง. การเรนเดอร์สไลด์เป็นรูปแบบ raster เช่น PNG หรือ JPEG จะทำให้ SVG ถูกแปลงเป็นพิกเซล
ทำอย่างไรจึงหลีกเลี่ยงการแคสที่ไม่ปลอดภัยเมื่ออ่านสไลด์ที่มีอยู่?
ตรวจสอบประเภทของ shape ก่อนใช้สมาชิกเฉพาะ picture-frame การตรวจสอบ isinstance กับ PictureFrame จะหลีกเลี่ยงการแคสที่ไม่ถูกต้องและช่วยให้โค้ดจัดการสไลด์ที่ไม่มี picture frame ได้อย่างเหมาะสม.