จัดการกรอบรูปภาพในงานนำเสนอด้วย Java
ภาพรวม
กรอบรูปภาพเป็นรูปทรงบนสไลด์ที่ใช้แสดงภาพ ใน Aspose.Slides แหล่งภาพและรูปทรงที่แสดงภาพเป็นอ็อบเจกต์ที่แยกจากกัน: Presentation ถือแหล่งภาพที่ฝังอยู่ผ่าน IImageCollection ในขณะที่ IPictureFrame ควบคุมตำแหน่ง ขนาด การจัดรูปแบบเส้น การหมุน การครอป เอฟเฟกต์ภาพ และการตั้งค่าระดับกรอบอื่น ๆ
การแยกนี้มีประโยชน์เมื่อภาพเดียวกันต้องแสดงหลายครั้ง เพิ่มภาพลงในงานนำเสนอเพียงครั้งเดียว เก็บ IPPImage ที่ได้รับคืนไว้ และใช้แหล่งภาพนั้นเมื่อสร้างกรอบรูปภาพ
กรอบรูปภาพสามารถบรรจุภาพราสเตอร์เช่น PNG หรือ JPEG และภาพเวกเตอร์ SVG ได้ อีกทั้งยังสามารถอ้างอิงถึงภาพที่เชื่อมโยงแทนการเก็บข้อมูลไบต์ของภาพในงานนำเสนอ ตัวเลือกนี้ส่งผลต่อความพกพา ขนาดไฟล์ การสกัดข้อมูล และพฤติกรรมการส่งออก ดังนั้นจึงควรตัดสินใจว่าต้องการเก็บภาพอย่างไรก่อนทำการจัดรูปแบบหรือการปรับแต่ง
เพิ่มและจัดรูปแบบภาพฝังไว้
สำหรับภาพฝังไว้ ให้เพิ่มข้อมูลภาพลงในงานนำเสนอและสร้างกรอบรูปภาพด้วย IShapeCollection.addPictureFrame ภาพจะกลายเป็นส่วนหนึ่งของแพ็คเกจงานนำเสนอ ดังนั้นงานนำเสนอจะยังคงเป็นอิสระเมื่อย้ายไปยังคอมพิวเตอร์เครื่องอื่น
ตัวอย่างต่อไปนี้เพิ่มภาพ JPEG สร้างกรอบที่มีขนาดตามมิติดั้งเดิมของภาพ และใช้การจัดรูปแบบเส้นพร้อมการหมุน:
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.jpg");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 100, image.getWidth(), image.getHeight(), image);
pictureFrame.getLineFormat().getFillFormat().setFillType(FillType.Solid);
pictureFrame.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
pictureFrame.getLineFormat().setWidth(3);
pictureFrame.setRotation(15);
presentation.save("picture-frame.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
กรอบรูปภาพควบคุมรูปร่างที่แสดง; การเปลี่ยนขนาดกรอบไม่ได้เปลี่ยนมิติพิกเซลดั้งเดิมที่เก็บในแหล่งภาพฝังไว้ ความแตกต่างนี้สำคัญเมื่อต้องทำการครอปหรือบีบอัดภาพในภายหลัง
ใช้สเกลสัมพัทธ์
IPictureFrame เปิดให้กำหนดสเกลความกว้างและสูงสัมพัทธ์ของกรอบผ่าน setRelativeScaleWidth และ setRelativeScaleHeight ค่า 1.0 หมายถึง 100 % ของขนาดภาพต้นฉบับ สเกลสัมพัทธ์เป็นประโยชน์เมื่อเวิร์กโฟลว์ต้องคงอัตราส่วนต่อขนาดภาพต้นฉบับแทนการคำนวณขนาดสุดท้ายด้วยตนเอง
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.jpg");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, image);
pictureFrame.setRelativeScaleWidth(1.35f);
pictureFrame.setRelativeScaleHeight(0.8f);
presentation.save("relative-scale.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
การเปลี่ยนสเกลสัมพัทธ์จะปรับตั้งค่าการสเกลของกรอบ; มันไม่ได้ทำการรีแซมปล์หรือบีบอัดภาพฝังไว้
ภาพฝังและภาพเชื่อมโยง
ภาพฝังไว้เก็บข้อมูลภาพภายในงานนำเสนอและจึงเป็นตัวเลือกที่ปลอดภัยที่สุดสำหรับความพกพาและการแสดงผลที่คาดการณ์ได้ ภาพเชื่อมโยงจะเก็บตำแหน่งภายนอกผ่านเมธอด ISlidesPicture.setLinkPathLong แทนการฝังข้อมูลภาพแบบเดียวกัน
ภาพเชื่อมโยงอาจลดปริมาณข้อมูลภาพที่เก็บใน PPTX ได้ แต่ต้องพึ่งพาความพร้อมใช้งานของไฟล์ภายนอก หากเส้นทางเปลี่ยน ไฟล์ถูกย้าย หรือแหล่งข้อมูลไม่พร้อมใช้งาน ภาพเชื่อมโยงอาจไม่แสดงตามคาด สำหรับงานนำเสนอที่ต้องส่งอีเมล ถูกรักษาเป็นไฟล์เก่า หรือแสดงผลในสภาพแวดล้อมที่แยกออกจากกัน ภาพฝังไว้มักจะเชื่อถือได้มากกว่า
เพิ่มภาพเชื่อมโยง
ตัวอย่างต่อไปนี้สร้างกรอบรูปภาพและชี้ไปที่ไฟล์ภาพในเครื่องเท่านั้น โดยมุ่งเน้นที่การเชื่อมโยงภาพเท่านั้น; การเชื่อมโยงวิดีโอเป็นเวิร์กโฟลว์สื่อแยกต่างหากและไม่ได้รวมไว้ในตัวอย่างนี้
import com.aspose.slides.*;
import java.io.File;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 320, 180, null);
File linkedImageFile = new File("linked-image.jpg");
String linkPath = linkedImageFile.getAbsolutePath();
pictureFrame.getPictureFormat().getPicture().setLinkPathLong(linkPath);
presentation.save("linked-image.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
ใช้ลิงก์เมื่อการจัดการไฟล์ภายนอกเป็นเจตนา ไม่ควรใช้เพื่อแทนที่การบีบอัด: PPTX ที่มีลิงก์เสียหายมักจะใช้งานได้น้อยกว่าไฟล์ที่มีขนาดใหญ่แต่เป็นอิสระ
สกัดภาพจากกรอบรูปภาพ
ก่อนสกัดภาพจากงานนำเสนอที่มีอยู่ ควรตรวจสอบว่ารูปร่างเป็น IPictureFrame จริง ๆ และว่ามีภาพฝังอยู่หรือไม่ กรอบรูปภาพที่เชื่อมโยงอาจไม่มีไบต์ของภาพที่สามารถสกัดได้ในลักษณะเดียวกัน
สกัดภาพราสเตอร์
API ภาพสมัยใหม่ใช้ IImage โดยตรงและไม่ต้องอาศัยตัวห่อภาพ Java เวอร์ชันเก่า ตัวอย่างต่อไปนี้ค้นหาภาพราสเตอร์ฝังแรกบนสไลด์และบันทึกเป็น PNG:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IPictureFrame)) {
continue;
}
IPictureFrame pictureFrame = (IPictureFrame) shape;
IPPImage embeddedImage = pictureFrame.getPictureFormat().getPicture().getImage();
if (embeddedImage == null || embeddedImage.getSvgImage() != null) {
continue;
}
IImage rasterImage = embeddedImage.getImage();
try {
rasterImage.save("extracted-image.png", ImageFormat.Png);
} finally {
rasterImage.dispose();
}
break;
}
} finally {
presentation.dispose();
}
การบันทึกผ่าน IImage.save จะเปลี่ยนภาพที่สกัดเป็นรูปแบบผลลัพธ์ที่ร้องขอ หากต้องการไบต์ที่เข้ารหัสเก็บในงานนำเสนอแทนไฟล์ราสเตอร์ที่แปลงแล้ว ให้ใช้ข้อมูลไบต์ของแหล่งภาพโดยตรง
สกัดภาพ SVG
สำหรับภาพ SVG, IPPImage เปิดให้เข้าถึงอ็อบเจกต์ ISvgImage ซึ่งทำให้สามารถดึงข้อมูล SVG ได้โดยตรงโดยไม่ต้องเรสเตอร์ไอภาพก่อน
import com.aspose.slides.*;
import java.io.FileOutputStream;
import java.io.IOException;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IPictureFrame)) {
continue;
}
IPictureFrame pictureFrame = (IPictureFrame) shape;
IPPImage embeddedImage = pictureFrame.getPictureFormat().getPicture().getImage();
ISvgImage svgImage = embeddedImage != null ? embeddedImage.getSvgImage() : null;
if (svgImage == null) {
continue;
}
byte[] svgData = svgImage.getSvgData();
FileOutputStream outputStream = new FileOutputStream("extracted-image.svg");
try {
outputStream.write(svgData);
} finally {
outputStream.close();
}
break;
}
} finally {
presentation.dispose();
}
การเก็บเนื้อหา SVG เป็น SVG คงความเป็นเวกเตอร์ภายในงานนำเสนอ การส่งออกเป็นราสเตอร์ เช่น PNG หรือ JPEG จะต้องเรสเตอร์เนื้อหาเวกเตอร์นั้น PDF หรือการส่งออกสไลด์เป็น SVG ก็เป็นการเรสเตอร์เช่นกัน ดังนั้นกราฟิกที่ส่งออกไม่ควรถือว่าเป็นสำเนาไบต์ต่อไบต์ของ SVG ดั้งเดิม; ใช้ข้อมูลจาก ISvgImage.getSvgData เมื่อจำเป็นต้องใช้แหล่งเวกเตอร์ต้นฉบับ
ครอปภาพ
การครอปเปลี่ยนส่วนที่มองเห็นของภาพภายในกรอบ ค่าเดิมบน IPictureFillFormat เป็นเปอร์เซ็นต์ของมิติภาพต้นฉบับ การครอปไม่ได้ลบพิกเซลที่ซ่อนอยู่จากภาพฝังไว้; มันเพียงเปลี่ยนบริเวณที่แสดงเท่านั้น
ตัวอย่างต่อไปนี้ค้นหากรอบรูปภาพอย่างปลอดภัยและใช้ค่าครอป:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = null;
for (IShape shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
pictureFrame.getPictureFormat().setCropLeft(23.6f);
pictureFrame.getPictureFormat().setCropRight(21.5f);
pictureFrame.getPictureFormat().setCropTop(3f);
pictureFrame.getPictureFormat().setCropBottom(31f);
presentation.save("cropped-image.pptx", SaveFormat.Pptx);
}
} finally {
presentation.dispose();
}
เนื่องจากข้อมูลภาพที่ซ่อนยังคงอยู่ การครอปสามารถเปลี่ยนแปลงได้ภายหลังโดยไม่สูญเสียพิกเซลต้นฉบับ หากขนาดไฟล์สำคัญกว่าการกู้คืน ภาพที่ครอปแล้วสามารถลบออกได้ตามที่อธิบายในส่วนต่อไป
ลบข้อมูลภาพที่ครอปไว้
IPictureFillFormat.deletePictureCroppedAreas จะลบข้อมูลภาพที่อยู่นอกสี่เหลี่ยมครอปปัจจุบันและคืนแหล่งภาพที่เหลือ ซึ่งสามารถลดขนาดไฟล์ได้ แต่เป็นการปรับแต่งที่ทำลายข้อมูล: หลังจากบันทึกงานนำเสนอ พิกเซลที่ถูกลบจะไม่มีให้ทำการยกเลิกครอปในภายหลัง
import com.aspose.slides.*;
Presentation presentation = new Presentation("cropped-image.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = null;
for (IShape shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
IPPImage croppedImage = pictureFrame.getPictureFormat().deletePictureCroppedAreas();
if (croppedImage != null) {
presentation.save("cropped-data-removed.pptx", SaveFormat.Pptx);
}
}
} finally {
presentation.dispose();
}
เมธอดนี้อาจเพิ่มแหล่งภาพใหม่ลงในงานนำเสนอ หากภาพต้นฉบับยังถูกใช้โดยกรอบรูปภาพอื่น ๆ กรอบเหล่านั้นยังต้องใช้แหล่งเดิม ดังนั้นการลบพื้นที่ครอปไม่จำเป็นต้องลดจำนวนภาพทั้งหมด การครอป WMF หรือ EMF ด้วยเมธอดนี้จะทำให้ผลลัพธ์ที่ครอปเป็น PNG
บีบอัดภาพราสเตอร์
IPictureFillFormat.compressImage ลดความละเอียดของภาพราสเตอร์เทียบกับขนาดที่ภาพปรากฎบนสไลด์ สามารถลบส่วนที่ครอปได้ในขั้นตอนเดียว เมธอดจะคืนค่า true เมื่อภาพถูกปรับขนาดหรือครอป และ false เมื่อไม่ต้องเปลี่ยนแปลงใด ๆ
ใช้ค่า PicturesCompression ที่กำหนดไว้ล่วงหน้าหากความละเอียดเป้าหมายมาตรฐานเพียงพอ:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = null;
for (IShape shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
boolean compressed = pictureFrame.getPictureFormat().compressImage(true, PicturesCompression.Dpi150);
System.out.println(compressed ? "The image was compressed." : "No compression was necessary.");
presentation.save("compressed-image.pptx", SaveFormat.Pptx);
}
} finally {
presentation.dispose();
}
สามารถส่งค่า DPI บวกที่กำหนดเองแทนค่าที่กำหนดไว้ล่วงหน้าเมื่อจำเป็นต้องมีเป้าหมายเฉพาะ
การบีบอัดมุ่งเน้นที่ภาพราสเตอร์; เนื้อหา SVG และเมต้าไฟล์จะไม่ได้รับผลจากการบีบอัดราสเตอร์นี้ อีกทั้งจำไว้ว่า ความละเอียดที่ต่ำลงและการลบส่วนที่ครอปไม่สามารถกู้คืนจากงานนำเสนอที่ปรับแต่งแล้ว ควรเลือกความละเอียดเป้าหมายตามขนาดการดูหรือส่งออกที่ใหญ่ที่สุดที่ภาพจะถูกแสดงจริง ๆ แทนการใช้ DPI ต่ำสุดทั่วทั้งไฟล์
จัดการเอฟเฟกต์การแปลงภาพ
สำหรับเวิร์กโฟลว์เต็มรูปแบบที่ครอบคลุมความสว่าง คอนทราสต์ การแปลงสี เบลอ เอฟเฟกต์อัลฟา สายงานที่จัดลำดับ การตรวจสอบ การลบ และการตรวจสอบรอบต่อรอบ ดูที่ Image Transform Effects
ล็อกรูปทรงกรอบรูปภาพ
การตั้งค่าใน IPictureFrameLock ควบคุมว่าการแก้ไขใดบ้างจะถูกปิดใช้งานสำหรับกรอบรูปภาพ ตัวอย่างเช่น setAspectRatioLocked จะรักษาอัตราส่วนของรูปทรงขณะเปลี่ยนขนาด
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.jpg");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 100, image.getWidth(), image.getHeight(), image);
pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
presentation.save("locked-picture-frame.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
การล็อกนี้ใช้กับรูปทรงกรอบรูปภาพ ไม่ได้บังคับให้ภาพต้นฉบับต้องรีแซมปล์หรือเปลี่ยนอัตราส่วนอย่างถาวร
ปรับค่าการขยาย StretchOffset
เมื่อโหมดเติมรูปเป็นการขยาย ค่าการขยาย‑offset บน IPictureFillFormat จะกำหนดสี่เหลี่ยมเติมสัมพันธ์กับกล่องขอบของกรอบรูปภาพ เปอร์เซ็นต์บวกจะสร้างการเว้นระยะจากขอบ ส่วนเปอร์เซ็นต์ลบจะสร้างการขยายออก
สิ่งนี้ต่างจากการครอป ค่า crop จะเลือกส่วนของภาพต้นฉบับที่ต้องการให้มองเห็น ส่วน stretch offset จะเปลี่ยนสี่เหลี่ยมที่ภาพเติมถูกขยายเข้าไป
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.png");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 10, 10, 400, 300, image);
pictureFrame.getPictureFormat().setPictureFillMode(PictureFillMode.Stretch);
pictureFrame.getPictureFormat().setStretchOffsetLeft(12f);
pictureFrame.getPictureFormat().setStretchOffsetRight(12f);
pictureFrame.getPictureFormat().setStretchOffsetTop(8f);
pictureFrame.getPictureFormat().setStretchOffsetBottom(8f);
presentation.save("stretch-offsets.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
ใช้ stretch offset เพื่อจัดตำแหน่งการเติม ใช้คุณสมบัติ crop เมื่อต้องการซ่อนขอบของภาพต้นฉบับ
การจัดเก็บ ขนาดไฟล์ และการพิจารณาการส่งออก
การพิจารณาตัวเลือกหลักจะง่ายขึ้นเมื่อการจัดเก็บภาพและการจัดรูปแบบกรอบรูปภาพแยกกัน:
- ภาพฝังไว้ ทำให้งานนำเสนอเป็นอิสระและเป็นทางเลือกที่เชื่อถือได้ที่สุดสำหรับการแชร์และการเรนเดอร์บนเซิร์ฟเวอร์ แต่ภาพราสเตอร์ขนาดใหญ่จะเพิ่มขนาด PPTX และการใช้หน่วยความจำ
- ภาพเชื่อมโยง สามารถทำให้แพ็คเกจมีขนาดเล็กลงได้ แต่งานนำเสนอจะพึ่งพาไฟล์ภายนอกที่ต้องยังคงเข้าถึงได้ตามที่บันทึกไว้
- การครอป ในขั้นต้นไม่ทำลายข้อมูล พิกเซลที่ซ่อนอยู่จะยังคงฝังอยู่จนกว่าจะลบพื้นที่ที่ครอปโดยตรงหรือระหว่างการบีบอัด
- การบีบอัด สามารถลดขนาดไฟล์ได้อย่างมีนัยสำคัญสำหรับภาพราสเตอร์ที่ใหญ่เกินไป แต่จะเสียความละเอียดของต้นฉบับ ควรทำหลังจากทราบขนาดภาพบนสไลด์ที่ต้องการแล้ว
- ภาพ SVG ควรคงเป็น SVG เมื่อการคงไว้ซึ่งเวกเตอร์สำคัญ สกัด SVG ฝังโดยตรงเมื่อจำเป็นต้องใช้แหล่งเวกเตอร์เอง การส่งออกสไลด์เป็นราสเตอร์จะเปลี่ยน SVG เป็นพิกเซลเสมอ
- ภาพที่ใช้ซ้ำ ควรใช้แหล่ง IPPImage เดิมเมื่อทำได้ แทนการโหลดไฟล์เดียวกันหลายครั้งในกระบวนการทำงานของงานนำเสนอ
สำหรับงานนำเสนอขนาดใหญ่ การปรับแต่งภาพมักจะได้ผลดีที่สุดเมื่อทำอย่างคัดเลือก: เก็บโลโก้และแผนภาพเป็นเนื้อหาเวกเตอร์ บีบอัดภาพถ่ายตามขนาดการแสดงจริง ลบพิกเซลที่ครอปเฉพาะเมื่อไม่ต้องการแก้ไขในภายหลัง และหลีกเลี่ยงลิงก์ภายนอกเว้นแต่การจัดการการพึ่งพาจะเป็นส่วนหนึ่งของการออกแบบการปรับใช้
คำถามที่พบบ่อย
ความแตกต่างระหว่างกรอบรูปภาพและแหล่งภาพคืออะไร?
IPPImage แทนแหล่งภาพที่เชื่อมโยงกับงานนำเสนอ ส่วน IPictureFrame คือรูปทรงบนสไลด์ที่แสดงภาพและเก็บข้อมูลเรขาคณิตและการจัดรูปแบบระดับกรอบ เช่น ขนาด การหมุน ค่า crop เอฟเฟกต์และการล็อก
ควรฝังหรือเชื่อมโยงภาพ?
ควรฝังภาพเมื่อจำเป็นต้องให้งานนำเสนอพกพาได้ จัดเก็บหรือเรนเดอร์โดยไม่ต้องอาศัยทรัพยากรภายนอก เชื่อมโยงภาพเฉพาะเมื่อต้องการเก็บไฟล์ภาพแยกจาก PPTX อย่างตั้งใจและสามารถรักษาตำแหน่งภายนอกได้อย่างน่าเชื่อถือ
การครอปลดขนาดไฟล์ PPTX หรือไม่?
ไม่โดยตรง การตั้งค่าครอปปกติจะซ่อนส่วนของภาพต้นฉบับแต่ยังคงเก็บพิกเซลไว้ ใช้ IPictureFillFormat.deletePictureCroppedAreas หรือบีบอัดภาพพร้อมการลบส่วนที่ครอปเมื่อพิกเซลเหล่านั้นสามารถละทิ้งได้อย่างถาวร
สามารถกู้คืนคุณภาพภาพหลังบีบอัดได้หรือไม่?
ไม่ได้ การบีบอัดอาจลดความละเอียดราสเตอร์ที่เก็บไว้และการลบส่วนที่ครอปจะทำให้ข้อมูลภาพหายไป ควรเก็บไฟล์ภาพต้นฉบับแยกไว้หากต้องการแก้ไขคุณภาพสูงในภายหลัง
ควรจัดการภาพ SVG อย่างไร?
ควรเก็บเนื้อหา SVG เป็น SVG เมื่อต้องการคงความคมชัดของเวกเตอร์ ISvgImage สามารถสกัดได้โดยตรง การเรนเดอร์สไลด์เป็นรูปแบบราสเตอร์เช่น PNG หรือ JPEG จะทำให้ SVG ถูกแปลงเป็นพิกเซล
จะหลีกเลี่ยงการแคสต์ที่ไม่ปลอดภัยเมื่ออ่านสไลด์ที่มีอยู่ได้อย่างไร?
ตรวจสอบประเภทรูปทรงก่อนใช้สมาชิกที่เฉพาะกับกรอบรูปภาพ การตรวจสอบ instanceof ต่อ IPictureFrame จะป้องกันการแคสต์ที่ไม่ถูกต้องและทำให้โค้ดจัดการสไลด์ที่ไม่มีกรอบรูปภาพได้อย่างเหมาะสม