Manage Picture Frames in Presentations Using PHP

Áttekintés

A képkeret egy dián megjelenő forma, amely képet mutat. Az Aspose.Slides-ben a kép erőforrás és a megjelenítő forma külön objektumok: egy Presentation tartalmaz beágyazott kép erőforrásokat az ImageCollection révén, míg egy PictureFrame szabályozza a kép pozícióját, méretét, vonalformázását, forgását, vágását, képhatásait és egyéb keretszintű beállításokat.

Ez a szétválasztás akkor hasznos, ha ugyanaz a kép többször is megjelenik. Adja hozzá a képet egyszer a prezentációhoz, tartsa meg a visszaadott PPImage, és használja ezt a kép erőforrást képkeretek létrehozásakor.

A képkeretek raster (például PNG vagy JPEG) és vektor (SVG) képeket is tartalmazhatnak. Emellett hivatkozhatnak kapcsolt képekre is, ahelyett, hogy a kép bájtjait a prezentációban tárolnák. A választás befolyásolja a hordozhatóságot, fájlméretet, kinyerést és az export viselkedését, ezért érdemes eldönteni, hogyan legyen a kép tárolva a formázás vagy optimalizálás előtt.

Beágyazott kép hozzáadása és formázása

Beágyazott kép esetén adja hozzá a kép adatát a prezentációhoz, és hozzon létre egy képkeretet a ShapeCollection::addPictureFrame. A kép a prezentációcsomag részévé válik, ezért a prezentáció önmagában is marad, ha egy másik számítógépre helyezik.

A következő példa egy JPEG képet ad hozzá, a kép eredeti méreteiben hoz létre egy keretet, és alkalmaz vonalformázást és forgatást:

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

A képkeret szabályozza a megjelenített geometriát; a keret méretének módosítása nem változtatja meg a beágyazott kép erőforrásban tárolt eredeti pixelméreteket. Ez a különbség későbbi vágás vagy tömörítés esetén fontos.

Relatív méretezés használata

PictureFrame a keret relatív szélesség- és magasságméretezését teszi elérhetővé a setRelativeScaleWidth és a setRelativeScaleHeight segítségével. Az 1.0 érték az eredeti kép 100%-ának felel meg. A relatív méretezés akkor hasznos, ha a munkafolyamatnak a forráskép méretéhez való arányt kell megtartania a végső méretek kézi kiszámítása helyett.

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

A relatív méretezés a keret méretbeállításait módosítja; nem mintavételez vagy tömörít beágyazott képet.

Beágyazott és kapcsolt képek

A beágyazott kép a kép adatát a prezentációban tárolja, ezért a legbiztonságosabb választás a hordozhatósághoz és a kiszámítható megjelenítéshez. Egy kapcsolt kép egy külső helyet tárol a Picture::setLinkPathLong metóduson keresztül ahelyett, hogy a kép adatát beágyazná.

A kapcsolt képek csökkenthetik a PPTX-ben tárolt képadatok mennyiségét, de külső függőséget hoznak létre. A kapcsolt fájlnak elérhetőnek kell maradnia az alkalmazás számára, amely a prezentációt megnyitja vagy rendereli. Ha az útvonal változik, a fájl átkerül vagy a forrás nem érhető el, a kapcsolt kép esetleg nem jelenik meg a várt módon. Azoknál a prezentációknál, amelyeket e‑mailben kell küldeni, archiválni vagy elszigetelt környezetben megjeleníteni, a beágyazott képek általában megbízhatóbbak.

Kapcsolt kép hozzáadása

A következő példa egy képkeretet hoz létre, és egy helyi képfájlra mutat. Csak a képhivatkozással foglalkozik; a videóhivatkozás egy külön média munkafolyamat, és szándékosan nincs belekeverve ebbe a példába.

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

Használjon hivatkozásokat, ha a külső fájlkezelés szándékos. Ne használja őket csak a tömörítés helyettesítésére: egy kis PPTX, amely hibás képfüggőségekkel rendelkezik, általában kevésbé hasznos, mint egy nagyobb önálló prezentáció.

Képek kinyerése képkeretekből

Mielőtt képet nyerne ki egy meglévő prezentációból, ellenőrizze, hogy a forma valóban egy PictureFrame és tartalmaz-e beágyazott képet. A kapcsolt képkeretek nem feltétlenül tartalmaznak kép bájtokat, amelyeket ugyanúgy ki lehetne nyerni.

Raster kép kinyerése

A modern kép API közvetlenül a IImage használja. A következő példa megtalálja az első beágyazott raster képet egy dián, és PNG-ként menti el:

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

A IImage::save használatával mentés a kinyert képet a kért kimeneti formátumba konvertálja. Ha a prezentációban tárolt kódolt bájtokra van szüksége egy konvertált raster fájl helyett, használja a kép erőforrás bináris adatait.

SVG kép kinyerése

SVG kép esetén a PPImage egy SvgImage objektumot tesz elérhetővé. Ez lehetővé teszi, hogy közvetlenül lekérje az SVG adatokat anélkül, hogy előbb rasterizálná a képet.

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

Az SVG tartalom SVGként tartása megőrzi a vektor forrást a prezentációban. A raster exportok, mint a PNG vagy JPEG, kötelezően a vektor tartalmat pixelekké renderelik. A PDF vagy SVG dia exportus is renderelés, ezért az exportált grafika nem tekinthető bit‑pontos másolatnak az eredeti beágyazott SVG‑ből; használd a beágyazott SvgImage::getSvgData adatot, ha maga a vektor forrás szükséges.

Kép vágása

A vágás megváltoztatja, hogy a kép mely része látható a kereten belül. A PictureFillFormat vágási értékei a forráskép méretének százalékai. A vágás eredetileg nem törli a rejtett pixeleket a beágyazott képből; csak a látható területet módosítja.

A következő példa biztonságosan megtalál egy képkeretet, és alkalmazza a vágási értékeket:

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

Mivel a rejtett képadat továbbra is jelen van, a vágás később módosítható az eredeti pixelek elvesztése nélkül. Ha a fájlméret fontosabb, mint a visszafordíthatóság, a vágott területek fizikailag eltávolíthatók, ahogyan a következő szakaszban le van írva.

Vágott képadatok eltávolítása

PictureFillFormat::deletePictureCroppedAreas eltávolítja a képadatot a jelenlegi vágási téglalapon kívülről, és visszaadja a keletkezett kép erőforrást. Ez csökkentheti a fájlméretet, de destruktív optimalizáció: a prezentáció mentése után az eltávolított pixelek már nem állnak rendelkezésre későbbi visszavágási művelethez.

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

A metódus új kép erőforrást adhat hozzá a prezentációhoz. Ha az eredeti képet más képkeretek is használják, azoknak továbbra is szükségük van a meglévő erőforrásra, így a vágott területek törlése nem feltétlenül csökkenti a képek teljes számát. WMF vagy EMF tartalom vágása ezzel a módszerrel rasterizálja a vágott eredményt PNG-be.

Raster képek tömörítése

PictureFillFormat::compressImage csökkenti a raster kép felbontását a kép megjelenítési méretéhez képest. Ugyanabban a műveletben eltávolíthatja a vágott területeket is. A metódus true értékkel tér vissza, ha a képet átméretezték vagy vágották, és false értékkel, ha nem volt szükség változtatásra.

Használjon egy előre definiált PicturesCompression értéket, ha egy szabványos célfelbontás elegendő:

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

Egy egyedi pozitív DPI érték is megadható előre definiált érték helyett, ha specifikus cél szükséges.

A tömörítés raster képekre van szánva. SVG és metafájl tartalom nem csökken ezzel a raster tömörítési munkafolyamattal. Ne feledje, hogy az alacsonyabb felbontás és a törölt vágott területek nem állíthatók vissza az optimalizált prezentációból. Válasszon célfelbontást a legnagyobb méret alapján, amelynél a kép ténylegesen meg lesz tekintve vagy exportálva, ahelyett, hogy globálisan a legalacsonyabb DPI-t alkalmazná.

Képtranszformációs hatások kezelése

A fényerő, kontraszt, színátalakítások, elmosás, alfa hatások, sorozatos láncok, ellenőrzés, eltávolítás és körtúra ellenőrzés lefedését biztosító teljes munkafolyamatért lásd a Image Transform Effects oldalt.

Képkeret geometriájának zárolása

A PictureFrameLock beállítások szabályozzák, hogy mely szerkesztési műveletek vannak letiltva egy képkeret számára. Például a setAspectRatioLocked megőrzi a forma arányait átméretezés során.

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

A zárolás a képkeret formára vonatkozik. Nem kényszeríti a forrásképet a mintavételezésre vagy a folyamatosan ugyanarra az arányra módosításra.

StretchOffset értékek beállítása

Ha a kép kitöltési mód a nyújtás, akkor a PictureFillFormat stretch‑offset értékei a képkeret határoló dobozához viszonyítva határozzák meg a kitöltő téglalapot. Pozitív százalékok belső eltolást hoznak létre az élről, míg negatív százalékok külső eltolást eredményeznek.

Ez különbözik a vágástól. A vágási értékek azt határozzák meg, hogy a forráskép mely része látható; a stretch‑offsetok a téglalapot változtatják, amelybe a látható kép kitöltése nyújtódik.

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

Használja a stretch‑offsetokat a kitöltés elhelyezéséhez. Használja a vágási tulajdonságokat, ha a cél a forráskép széleinek elrejtése.

Tárolási, fájlméret és export szempontok

A fő kompromisszumok kezelése egyszerűbb, ha a kép tárolását és a képkeret formázását külön kezeljük:

  • Beágyazott képek önállóvá teszik a prezentációt, és a megosztásra és szerveroldali renderelésre a legmegbízhatóbbak, de a nagy raster képek növelik a PPTX méretét és a memóriahasználatot.
  • Kapcsolt képek kisebb csomagot tarthatnak, de a prezentáció a külső fájlok elérhetőségétől függ a tárolt útvonalakon vagy helyeken.
  • Vágás eleve nem destruktív. A rejtett pixelek beágyazva maradnak, amíg a vágott területeket kifejezetten nem törlik vagy nem távolítják el tömörítés során.
  • Tömörítés jelentősen csökkentheti a fájlméretet a túlméretezett raster képek esetén, de feláldozza a forrás felbontását. Azt a dián belüli célméret ismerete után kell alkalmazni.
  • SVG képek esetén meg kell maradni SVG formátumban, ha a vektor megőrzése fontos. Közvetlenül nyerje ki a beágyazott SVG-t, ha magára a vektor erőforrásra van szükség. A raster dia exportok mindig a renderelt diát pixelekké konvertálják.
  • Ismétlődő képek esetén lehetőség szerint használja újra a meglévő PPImage erőforrást, ahelyett, hogy ugyanazt a fájlt többször betöltené a prezentációs munkafolyamatba.

Nagy prezentációk esetén a képoptimalizálás általában leginkább hatékony, ha szelektíven alkalmazzák: logókat és diagramokat vektor tartalomként tartsák, fényképeket a valós megjelenítési méretük szerint tömörítsék, a vágott pixeleket csak akkor távolítsák el, ha a későbbi szerkesztés nem szükséges, és kerüljék a külső hivatkozásokat, kivéve ha a függőségkezelés része a telepítési tervnek.

GYIK

Mi a különbség egy képkeret és egy kép erőforrás között?

A PPImage egy a prezentációhoz társított kép erőforrást képvisel. A PictureFrame egy dián lévő forma, amely képet jelenít meg, és a keretszintű geometriát és formázást tárolja, mint például méret, forgatás, vágási értékek, hatások és zárolások.

Be kellene ágyaznom vagy kapcsolnom a képeket?

Ágyazza be a képeket, ha a prezentációnak hordozhatónak, archiváltnak vagy külső erőforrásokhoz való hozzáférés nélkül történő renderelésnek kell lennie. Kapcsolja a képeket csak akkor, ha a kép fájlokat szándékosan a PPTX-en kívül tartja, és a külső helyek megbízhatóan karbantarthatók.

Csökkenti a vágás a PPTX fájlméretét?

Nem önmagában. A normál vágási beállítások elrejtik a forráskép részeit, de megtartják az alatta lévő pixeleket. Használja a PictureFillFormat::deletePictureCroppedAreas vagy a kép tömörítést vágott terület eltávolítással, ha ezeket a pixeleket véglegesen el lehet dobni.

Vissza tudom állítani a kép minőségét a tömörítés után?

Nem. A tömörítés csökkentheti a tárolt raster felbontást, és a vágott területek eltávolítása megsemmisíti a kép adatokat. Tartsa meg az eredeti forrásképet a prezentáción kívül, ha később nagy felbontású szerkesztésre lehet szükség.

Hogyan kell kezelni az SVG képeket?

Tartsa SVG formátumban az SVG tartalmat, ha a vektor pontossága fontos. A beágyazott SvgImage közvetlenül kinyerhető. A dia raster formátumba, például PNG vagy JPEG formátumba történő renderelése rasterizálja az SVG-t a dia képének részeként.

Hogyan kerülhetem el a nem biztonságos átalakításokat létező diák beolvasásakor?

Ellenőrizze a forma típusát, mielőtt képkeret‑specifikus tagokat használna. A java_instanceof ellenőrzés a PictureFrame ellen érvénytelen átalakítások megelőzése érdekében, és lehetővé teszi, hogy a kód kezelje azokat a diákat, amelyek nem tartalmaznak képkeretet.