จัดการ Picture Frame ในพรีเซนเทชันโดยใช้ PHP

ภาพรวม

Picture frame คือรูปทรงสไลด์ที่แสดงรูปภาพ ใน Aspose.Slides, แหล่งข้อมูลรูปภาพและรูปทรงที่แสดงรูปนั้นเป็นอ็อบเจกต์แยกกัน: Presentation ถือครองรูปภาพที่ฝังอยู่ผ่าน ImageCollection, ส่วน PictureFrame ควบคุมตำแหน่ง, ขนาด, การจัดรูปแบบเส้น, การหมุน, การครอป, เอฟเฟ็กต์รูปภาพ, และการตั้งค่าระดับเฟรมอื่น ๆ

การแยกนี้มีประโยชน์เมื่อรูปเดียวกันต้องแสดงหลายครั้ง ให้เพิ่มรูปไปยังพรีเซนเทชันเพียงครั้งเดียว, เก็บ PPImage ที่ส่งกลับ, แล้วใช้แหล่งข้อมูลรูปนั้นเมื่สร้าง picture frame

Picture frame สามารถบรรจุรูปเรสเตอร์เช่น PNG หรือ JPEG และรูปเวกเตอร์ SVG ได้เช่นกัน อีกทั้งยังสามารถอ้างอิงรูปที่ลิงก์แทนการเก็บไบต์รูปในพรีเซนเทชัน ตัวเลือกนี้ส่งผลต่อการพกพา, ขนาดไฟล์, การสกัด และพฤติกรรมการส่งออก ดังนั้นควรตัดสินใจวิธีเก็บรูปก่อนทำการจัดรูปแบบหรือการเพิ่มประสิทธิภาพ

เพิ่มและจัดรูปแบบรูปภาพที่ฝังไว้

สำหรับรูปภาพที่ฝังไว้ ให้เพิ่มข้อมูลรูปลงในพรีเซนเทชันและสร้าง picture frame ด้วย ShapeCollection::addPictureFrame รูปจะกลายเป็นส่วนหนึ่งของแพคเกจพรีเซนเทชัน ดังนั้นพรีเซนเทชันจะยังคงเป็นอิสระเมื่อนำไปย้ายไปยังคอมพิวเตอร์เครื่องอื่น

ตัวอย่างต่อไปนี้เพิ่มรูป JPEG, สร้างเฟรมที่มีขนาดตามมิติเดิมของรูป, และใช้การจัดรูปแบบเส้นและการหมุน:

use aspose\slides\FillType;
use aspose\slides\Images;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $sourceImage = Images::fromFile("photo.jpg");
    try {
        $image = $presentation->getImages()->addImage($sourceImage);
    } finally {
        if (!java_is_null($sourceImage)) {
            $sourceImage->dispose();
        }
    }

    $pictureFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 100, $image->getWidth(), $image->getHeight(), $image);
    $pictureFrame->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
    $pictureFrame->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
    $pictureFrame->getLineFormat()->setWidth(3);
    $pictureFrame->setRotation(15);

    $presentation->save("picture-frame.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

picture frame ควบคุมเรขาคณิตที่แสดง; การเปลี่ยนขนาดเฟรมไม่ทำให้มิติพิกเซลเดิมของแหล่งรูปที่ฝังไว้เปลี่ยนแปลง ความแตกต่างนี้สำคัญเมื่อทำการครอปหรือบีบอัดรูปภายหลัง

ใช้การสเกลเชิงสัมพัทธ์

PictureFrame เปิดเผยการสเกลความกว้างและความสูงเชิงสัมพัทธ์ของเฟรมผ่าน setRelativeScaleWidth และ setRelativeScaleHeight ค่า 1.0 แสดงถึง 100% ของขนาดรูปต้นฉบับ การสเกลเชิงสัมพัทธ์มีประโยชน์เมื่อเวิร์กโฟลว์ต้องคงอัตราส่วนกับขนาดรูปต้นฉบับแทนการคำนวณขนาดสุดท้ายด้วยตนเอง

use aspose\slides\Images;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $sourceImage = Images::fromFile("photo.jpg");
    try {
        $image = $presentation->getImages()->addImage($sourceImage);
    } finally {
        if (!java_is_null($sourceImage)) {
            $sourceImage->dispose();
        }
    }

    $pictureFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, $image);
    $pictureFrame->setRelativeScaleWidth(1.35);
    $pictureFrame->setRelativeScaleHeight(0.8);

    $presentation->save("relative-scale.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

การสเกลเชิงสัมพัทธ์เปลี่ยนการตั้งค่าขนาดของเฟรม; ไม่ทำการรีแซมพลิงหรือบีบอัดรูปที่ฝังไว้

รูปภาพที่ฝังและรูปภาพที่ลิงก์

รูปภาพที่ฝังเก็บข้อมูลรูปภายในพรีเซนเทชัน จึงเป็นตัวเลือกที่ปลอดภัยที่สุดสำหรับการพกพาและการเรนเดอร์ที่คาดเดาได้ รูปภาพที่ลิงก์เก็บตำแหน่งภายนอกผ่านเมธอด Picture::setLinkPathLong แทนการฝังข้อมูลรูปแบบเดียวกัน

รูปภาพที่ลิงก์สามารถลดปริมาณข้อมูลรูปที่เก็บใน PPTX ได้ แต่จะเพิ่มการพึ่งพาไฟล์ภายนอก ไฟล์ที่ลิงก์ต้องสามารถเข้าถึงได้โดยแอปพลิเคชันที่เปิดหรือเรนเดอร์พรีเซนเทชัน หากเส้นทางเปลี่ยน, ย้ายไฟล์, หรือไม่สามารถเข้าถึงทรัพยากรได้, รูปที่ลิงก์อาจไม่แสดงตามคาด สำหรับพรีเซนเทชันที่ต้องส่งอีเมล, เก็บถาวร, หรือเรนเดอร์ในสภาพแวดล้อมแยก, รูปที่ฝังมักเชื่อถือได้มากกว่า

เพิ่มรูปภาพที่ลิงก์

ตัวอย่างต่อไปนี้สร้าง picture frame แล้วชี้ไปยังไฟล์รูปภาพในเครื่องโลคัล มุ่งเน้นการลิงก์รูปภาพเท่านั้น; การลิงก์วิดีโอเป็นเวิร์กโฟลว์สื่อแยกต่างหากและไม่ได้ผสมเข้ากับตัวอย่างนี้โดยเจตนา

use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $pictureFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 50, 320, 180, null);
    $linkedImageFile = new Java("java.io.File", "linked-image.jpg");
    $pictureFrame->getPictureFormat()->getPicture()->setLinkPathLong($linkedImageFile->getAbsolutePath());

    $presentation->save("linked-image.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

ใช้ลิงก์เมื่อการจัดการไฟล์ภายนอกเป็นเจตนาที่ชัดเจน อย่าใช้เป็นทางลัดแทนการบีบอัด: PPTX ขนาดเล็กที่มีการพึ่งพารูปภาพเสียหายมักไม่มีประโยชน์เท่าพรีเซนเทชันที่มีขนาดใหญ่และเป็นอิสระ

สกัดรูปภาพจาก Picture Frame

ก่อนสกัดรูปจากพรีเซนเทชันที่มีอยู่, ตรวจสอบให้แน่ใจว่า Shape นั้นเป็น PictureFrame และมีรูปที่ฝังอยู่ รูปที่ลิงก์อาจไม่มีไบต์รูปที่สามารถสกัดได้ในแบบเดียวกัน

สกัดรูปเรสเตอร์

API รูปภาพสมัยใหม่ใช้ IImage โดยตรง ตัวอย่างต่อไปนี้ค้นหารูปเรสเตอร์ที่ฝังอยู่เป็นรูปแรกบนสไลด์และบันทึกเป็น PNG:

use aspose\slides\ImageFormat;
use aspose\slides\Presentation;

$presentation = new Presentation("sample.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shapeCount = java_values($slide->getShapes()->size());

    for ($index = 0; $index < $shapeCount; $index++) {
        $shape = $slide->getShapes()->get_Item($index);
        if (!java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
            continue;
        }

        $embeddedImage = $shape->getPictureFormat()->getPicture()->getImage();
        if (java_is_null($embeddedImage) || !java_is_null($embeddedImage->getSvgImage())) {
            continue;
        }

        $rasterImage = $embeddedImage->getImage();
        try {
            $rasterImage->save("extracted-image.png", ImageFormat::Png);
        } finally {
            if (!java_is_null($rasterImage)) {
                $rasterImage->dispose();
            }
        }
        break;
    }
} finally {
    $presentation->dispose();
}

การบันทึกผ่าน IImage::save จะเปลี่ยนรูปที่สกัดเป็นรูปแบบผลลัพธ์ที่ร้องขอ หากต้องการไบต์ที่เข้ารหัสที่เก็บอยู่ในพรีเซนเทชันแทนไฟล์เรสเตอร์ที่แปลงแล้ว, ให้ใช้ข้อมูลไบนารีของแหล่งรูปแทน

สกัดรูป SVG

สำหรับรูป SVG, PPImage เปิดเผยอ็อบเจกต์ SvgImage ซึ่งทำให้คุณดึงข้อมูล SVG โดยตรงแทนการแปลงเป็นเรสเตอร์ก่อน

use aspose\slides\Presentation;

$presentation = new Presentation("sample.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shapeCount = java_values($slide->getShapes()->size());

    for ($index = 0; $index < $shapeCount; $index++) {
        $shape = $slide->getShapes()->get_Item($index);
        if (!java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
            continue;
        }

        $embeddedImage = $shape->getPictureFormat()->getPicture()->getImage();
        $svgImage = java_is_null($embeddedImage) ? null : $embeddedImage->getSvgImage();
        if ($svgImage === null || java_is_null($svgImage)) {
            continue;
        }

        $outputStream = new Java("java.io.FileOutputStream", "extracted-image.svg");
        try {
            $outputStream->write($svgImage->getSvgData());
        } finally {
            $outputStream->close();
        }
        break;
    }
} finally {
    $presentation->dispose();
}

การเก็บเนื้อหา SVG เป็น SVG จะคงความเป็นเวกเตอร์ไว้ในพรีเซนเทชัน การส่งออกเป็นเรสเตอร์เช่น PNG หรือ JPEG จะต้องเรนเดอร์เวกเตอร์นั้นเป็นพิกเซล การส่งออกสไลด์เป็น PDF หรือ SVG ก็เป็นกระบวนการเรนเดอร์เช่นกัน ดังนั้นกราฟิกที่ส่งออกไม่ควรถือเป็นสำเนาแบบไบต์ต่อไบต์ของ SVG ที่ฝังไว้; ให้ใช้ข้อมูลจาก SvgImage::getSvgData เมื่อจำเป็นต้องใช้แหล่งเวกเตอร์ดั้งเดิม

การครอปภาพ

การครอปเปลี่ยนส่วนของรูปภาพที่มองเห็นได้ภายในเฟรม ค่า cropping บน PictureFillFormat เป็นเปอร์เซ็นต์ของมิติรูปต้นฉบับ การครอปไม่ได้ลบพิกเซลที่ซ่อนอยู่จากรูปที่ฝังไว้ในตอนแรก; เพียงเปลี่ยนพื้นที่ที่มองเห็น

ตัวอย่างต่อไปนี้ค้นหา picture frame อย่างปลอดภัยและใช้ค่า cropping:

use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$presentation = new Presentation("sample.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $pictureFrame = null;
    $shapeCount = java_values($slide->getShapes()->size());

    for ($index = 0; $index < $shapeCount; $index++) {
        $shape = $slide->getShapes()->get_Item($index);
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
            $pictureFrame = $shape;
            break;
        }
    }

    if ($pictureFrame !== null) {
        $pictureFrame->getPictureFormat()->setCropLeft(23.6);
        $pictureFrame->getPictureFormat()->setCropRight(21.5);
        $pictureFrame->getPictureFormat()->setCropTop(3);
        $pictureFrame->getPictureFormat()->setCropBottom(31);
        $presentation->save("cropped-image.pptx", SaveFormat::Pptx);
    }
} finally {
    $presentation->dispose();
}

เนื่องจากข้อมูลรูปที่ซ่อนยังคงอยู่, สามารถเปลี่ยนค่าครอปภายหลังโดยไม่สูญเสียพิกเซลเดิม หากขนาดไฟล์สำคัญกว่าการย้อนคืน, สามารถลบพื้นที่ที่ครอปอย่างเป็นทางการตามที่อธิบายในส่วนต่อไป

ลบข้อมูลรูปที่ถูกครอป

PictureFillFormat::deletePictureCroppedAreas จะลบข้อมูลรูปที่อยู่นอกสี่เหลี่ยมครอปปัจจุบันและคืนแหล่งรูปที่ได้ ผลลัพธ์นี้ช่วยลดขนาดไฟล์ได้ แต่เป็นการเพิ่มประสิทธิภาพแบบทำลาย: หลังจากพรีเซนเทชันถูกบันทึก, พิกเซลที่ลบจะไม่มีให้ใช้ในการทำ uncrop อีกต่อไป

use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$presentation = new Presentation("cropped-image.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $pictureFrame = null;
    $shapeCount = java_values($slide->getShapes()->size());

    for ($index = 0; $index < $shapeCount; $index++) {
        $shape = $slide->getShapes()->get_Item($index);
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
            $pictureFrame = $shape;
            break;
        }
    }

    if ($pictureFrame !== null) {
        $croppedImage = $pictureFrame->getPictureFormat()->deletePictureCroppedAreas();
        if (!java_is_null($croppedImage)) {
            $presentation->save("cropped-data-removed.pptx", SaveFormat::Pptx);
        }
    }
} finally {
    $presentation->dispose();
}

เมธอดนี้อาจเพิ่มแหล่งรูปใหม่ในพรีเซนเทชัน หากรูปต้นฉบับยังถูกใช้โดย picture frame อื่น, เฟรมเหล่านั้นยังคงต้องการแหล่งรูปเดิม, ดังนั้นการลบพื้นที่ที่ครอปไม่จำเป็นต้องทำให้จำนวนรูปทั้งหมดลดลง การครอป WMF หรือ EMF ด้วยเมธอดนี้จะทำให้ผลลัพธ์ที่ครอปถูกแปลงเป็น PNG

บีบอัดรูปเรสเตอร์

PictureFillFormat::compressImage ลดความละเอียดของรูปเรสเตอร์สัมพันธ์กับขนาดที่รูปแสดง สามารถลบพื้นที่ที่ครอปในขั้นตอนเดียวได้ เมธอดจะคืนค่า true เมื่อรูปถูกปรับขนาดหรือครอป และ false เมื่อไม่มีการเปลี่ยนแปลงใด ๆ

ใช้ค่า PicturesCompression ที่กำหนดไว้ล่วงหน้าเมื่อความละเอียดเป้าหมายมาตรฐานเพียงพอ:

use aspose\slides\PicturesCompression;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$presentation = new Presentation("sample.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $pictureFrame = null;
    $shapeCount = java_values($slide->getShapes()->size());

    for ($index = 0; $index < $shapeCount; $index++) {
        $shape = $slide->getShapes()->get_Item($index);
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
            $pictureFrame = $shape;
            break;
        }
    }

    if ($pictureFrame !== null) {
        $compressed = $pictureFrame->getPictureFormat()->compressImage(true, PicturesCompression::Dpi150);
        echo $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

ล็อคเรขาคณิตของ Picture Frame

การตั้งค่า PictureFrameLock ควบคุมการดำเนินการแก้ไขที่ถูกปิดใช้งานสำหรับ picture frame ตัวอย่างเช่น, setAspectRatioLocked จะคงอัตราส่วนของรูปทรงขณะปรับขนาด

use aspose\slides\Images;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $sourceImage = Images::fromFile("photo.jpg");
    try {
        $image = $presentation->getImages()->addImage($sourceImage);
    } finally {
        if (!java_is_null($sourceImage)) {
            $sourceImage->dispose();
        }
    }

    $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();
}

การล็อคนี้ใช้กับ shape ของ picture frame เท่านั้น ไม่บังคับให้รูปต้นฉบับต้องถูกรีแซมพล์หรือเปลี่ยนอัตราส่วนถาวร

ปรับค่า StretchOffset

เมื่อโหมดการเติมรูปเป็น stretch, ค่า stretch‑offset บน PictureFillFormat จะกำหนดสี่เหลี่ยมเติมสัมพันธ์กับกล่องขอบของ picture frame ค่าเปอร์เซ็นต์บวกจะทำให้เกิดการฝังจากขอบ, ค่าเปอร์เซ็นต์ลบจะทำให้เกิดการขยายออก

นี่ต่างจากการครอป ค่าครอปเลือกส่วนของรูปต้นฉบับที่จะแสดง; stretch offset จะเปลี่ยนสี่เหลี่ยมที่รูปเติมจะถูกขยายไป

use aspose\slides\Images;
use aspose\slides\PictureFillMode;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $sourceImage = Images::fromFile("photo.png");
    try {
        $image = $presentation->getImages()->addImage($sourceImage);
    } finally {
        if (!java_is_null($sourceImage)) {
            $sourceImage->dispose();
        }
    }

    $pictureFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 10, 10, 400, 300, $image);
    $pictureFrame->getPictureFormat()->setPictureFillMode(PictureFillMode::Stretch);
    $pictureFrame->getPictureFormat()->setStretchOffsetLeft(12);
    $pictureFrame->getPictureFormat()->setStretchOffsetRight(12);
    $pictureFrame->getPictureFormat()->setStretchOffsetTop(8);
    $pictureFrame->getPictureFormat()->setStretchOffsetBottom(8);

    $presentation->save("stretch-offsets.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

ใช้ stretch offset สำหรับการวางตำแหน่งการเติม ใช้คุณสมบัติคอร์อปเมื่อเป้าหมายคือการซ่อนขอบของรูปต้นฉบับ

การจัดเก็บ, ขนาดไฟล์, และข้อควรพิจารณาการส่งออก

การพิจารณา trade‑off หลักจะง่ายขึ้นเมื่อการจัดเก็บรูปภาพและการจัดรูปแบบ picture frame แยกกัน:

  • Embedded images ทำให้พรีเซนเทชันเป็นอิสระและเป็นตัวเลือกที่เชื่อถือได้ที่สุดสำหรับการแชร์และการเรนเดอร์ฝั่งเซิร์ฟเวอร์, แต่รูปเรสเตอร์ขนาดใหญ่ทำให้ PPTX ใหญ่และใช้หน่วยความจำมาก
  • Linked images สามารถทำให้แพคเกจเล็กลง, แต่พรีเซนเทชันจะพึ่งพาไฟล์ภายนอกที่ต้องคงอยู่ที่เส้นทางหรือสถานที่ที่เก็บไว้
  • Cropping ในขั้นแรกไม่ทำลาย; พิกเซลที่ซ่อนยังคงฝังอยู่จนกว่าจะลบพื้นที่ที่ครอปโดยชัดเจนหรือระหว่างการบีบอัด
  • Compression สามารถลดขนาดไฟล์ได้อย่างมหาศาลสำหรับรูปเรสเตอร์ที่ใหญ่เกินขนาด, แต่จะเสียความละเอียดต้นฉบับ ควรทำหลังจากทราบขนาดบนสไลด์ที่ต้องการแล้ว
  • SVG images ควรคงเป็น SVG เมื่อความคงสภาพของเวกเตอร์สำคัญ; สกัด SVG ที่ฝังไว้โดยตรงเมื่อคุณต้องการทรัพยากรเวกเตอร์เอง การส่งออกสไลด์เป็นเรสเตอร์จะเปลี่ยนสไลด์ที่เรนเดอร์เป็นพิกเซลเสมอ
  • Repeated images ควรใช้แหล่ง PPImage เดิมเมื่อทำได้แทนการโหลดไฟล์เดียวกันหลายครั้งในเวิร์กโฟลว์พรีเซนเทชัน

สำหรับพรีเซนเทชันขนาดใหญ่, การเพิ่มประสิทธิภาพรูปภาพมักได้ผลดีที่สุดเมื่อทำแบบเลือกสรร: เก็บโลโก้และไดอะแกรมเป็นเนื้อหาเวกเตอร์, บีบอัดภาพถ่ายตามขนาดการแสดงจริง, ลบพิกเซลที่ครอปเฉพาะเมื่อไม่ต้องการการแก้ไขต่อ, และหลีกเลี่ยงลิงก์ภายนอกถ้าการจัดการการพึ่งพาไม่เป็นส่วนหนึ่งของการออกแบบการปรับใช้

คำถามที่พบบ่อย

ความแตกต่างระหว่าง picture frame กับ image resource คืออะไร?

PPImage แทนแหล่งรูปภาพที่เชื่อมโยงกับพรีเซนเทชัน ส่วน PictureFrame เป็นรูปทรงบนสไลด์ที่แสดงรูปภาพและเก็บข้อมูลเรขาคณิตและการจัดรูปแบบระดับเฟรม เช่น ขนาด, การหมุน, ค่าครอป, เอฟเฟ็กต์, และการล็อค

ควรฝังรูปหรือทำลิงก์รูปดี?

ฝังรูปเมื่อพรีเซนเทชันต้องการความพกพา, การเก็บถาวร, หรือการเรนเดอร์โดยไม่ต้องอาศัยทรัพยากรภายนอก; ทำลิงก์รูปเฉพาะเมื่อต้องการแยกรูปออกจาก PPTX อย่างตั้งใจและสามารถรักษาตำแหน่งไฟล์ภายนอกได้อย่างเชื่อถือได้

การครอปลดขนาดไฟล์ PPTX หรือไม่?

ไม่โดยตรง การตั้งค่าครอปปกติจะซ่อนส่วนของรูปต้นฉบับแต่ยังคงเก็บพิกเซลไว้ ใช้ PictureFillFormat::deletePictureCroppedAreas หรือบีบอัดรูปพร้อมการลบพื้นที่ที่ครอปเมื่อสามารถทิ้งพิกเซลเหล่านั้นได้อย่างถาวร

สามารถกู้คืนคุณภาพรูปหลังบีบอัดได้หรือไม่?

ไม่ได้ การบีบอัดอาจลดความละเอียดเรสเตอร์ที่เก็บไว้, การลบพื้นที่ที่ครอปจะทำให้ข้อมูลรูปหายไป ควรเก็บรูปต้นฉบับนอกพรีเซนเทชันหากอาจต้องแก้ไขด้วยความละเอียดสูงในภายหลัง

ควรจัดการรูป SVG อย่างไร?

เก็บเนื้อหา SVG เป็น SVG เมื่อความคมชัดของเวกเตอร์สำคัญ; สามารถสกัด SvgImage ที่ฝังไว้โดยตรงได้ การเรนเดอร์สไลด์เป็นรูปเรสเตอร์เช่น PNG หรือ JPEG จะทำให้ SVG ถูกแปลงเป็นพิกเซล

จะหลีกเลี่ยงการ cast ที่ไม่ปลอดภัยเมื่ออ่านสไลด์ที่มีอยู่ได้อย่างไร?

ตรวจสอบประเภทของ shape ก่อนใช้สมาชิกเฉพาะ picture‑frame การตรวจสอบ java_instanceof กับ PictureFrame จะช่วยป้องกันการ cast ไม่ถูกต้องและให้โค้ดจัดการสไลด์ที่ไม่มี picture frame ได้อย่างเหมาะสม