Hantera bildramar i presentationer med PHP

Översikt

En bildram är en bildform som visar en bild. I Aspose.Slides är bildresursen och formen som visar den separata objekt: ett Presentation äger inbäddade bildresurser via sin ImageCollection, medan en PictureFrame styr bildens position, storlek, linjeformatering, rotation, beskärning, bildeffekter och andra ram‑nivåinställningar.

Denna separation är användbar när samma bild visas mer än en gång. Lägg till bilden i presentationen en gång, behåll den returnerade PPImage, och använd den bildresursen när du skapar bildramar.

Bildramar kan innehålla rasterbilder såsom PNG eller JPEG samt vektor‑SVG‑bilder. De kan även referera till länkade bilder i stället för att lagra bild‑bytarna i presentationen. Valet påverkar portabilitet, filstorlek, extrahering och exportbeteende, så det är bra att bestämma hur bilden ska lagras innan formatering eller optimering appliceras.

Lägg till och formatera en inbäddad bild

För en inbäddad bild, lägg till bilddata i presentationen och skapa en bildram med ShapeCollection::addPictureFrame. Bilden blir en del av presentationspaketet, så presentationen förblir självständig när den flyttas till en annan dator.

Följande exempel lägger till en JPEG‑bild, skapar en ram med bildens ursprungliga dimensioner och applicerar linjeformatering och rotation:

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

Bildramen styr den visade geometrin; att ändra ramens storlek förändrar inte de ursprungliga pixel­dimensionerna som lagras i den inbäddade bildresursen. Detta blir viktigt när man beskär eller komprimerar en bild senare.

Använd relativ skalning

PictureFrame exponerar relativ bredd‑ och höjds­skalning för ramen via setRelativeScaleWidth och setRelativeScaleHeight. Ett värde på 1.0 motsvarar 100 % av den ursprungliga bildstorleken. Relativ skalning är användbar när ett arbetsflöde måste bevara ett förhållande till källbildens storlek i stället för att manuellt beräkna slutdimensioner.

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

Relativ skalning ändrar ramens skalningsinställningar; den samplar inte om eller komprimerar den inbäddade bilden.

Inbäddade och länkade bilder

En inbäddad bild lagrar bilddata i presentationen och är därför det säkraste alternativet för portabilitet och förutsägbar rendering. En länkad bild lagrar en extern plats genom metoden Picture::setLinkPathLong i stället för att bädda in bilddata på samma sätt.

Länkade bilder kan minska mängden bilddata som lagras i PPTX, men de inför ett externt beroende. Den länkade filen måste förbli tillgänglig för programmet som öppnar eller renderar presentationen. Om sökvägen ändras, filen flyttas eller resursen blir otillgänglig, kanske den länkade bilden inte visas som förväntat. För presentationer som måste mejlas, arkiveras eller renderas i isolerade miljöer är inbäddade bilder vanligtvis mer pålitliga.

Lägg till en länkad bild

Följande exempel skapar en bildram och pekar den på en lokal bildfil. Det behandlar endast bildlänkning; videolänkning är ett separat mediaprocess och blandas med avsikt inte in i detta exempel.

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

Använd länkar när extern filhantering är avsiktlig. Använd dem inte enbart som ett ersättningsmedel för komprimering: en liten PPTX med brutna bildberoenden är vanligtvis mindre användbar än en större självständig presentation.

Extrahera bilder från bildramar

Innan du extraherar en bild från en befintlig presentation, kontrollera att en form faktiskt är en PictureFrame och att den innehåller en inbäddad bild. Länkade bildramar kanske inte innehåller bild‑bytar som kan extraheras på samma sätt.

Extrahera en rasterbild

Det moderna bild‑API‑t använder IImage direkt. Följande exempel hittar den första inbäddade rasterbilden på en bild och sparar den som 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();
}

Att spara via IImage::save konverterar den extraherade bilden till det begärda utdataformatet. Om du behöver de kodade bytarna som lagras i presentationen snarare än en konverterad rasterfil, använd bildresursens binära data i stället.

Extrahera en SVG‑bild

För en SVG‑bild exponerar PPImage ett SvgImage‑objekt. Detta låter dig hämta SVG‑data direkt i stället för att rasterisera bilden först.

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

Att behålla SVG‑innehåll som SVG bevarar den vektor‑källan i presentationen. Rasterexporter såsom PNG eller JPEG renderar nödvändigtvis den vektorinnehållet till pixlar. PDF‑ eller SVG‑bildexport är också en renderingsoperation, så de exporterade grafikerna bör inte betraktas som en byte‑för‑byte‑kopia av den inbäddade SVG:n; använd den inbäddade SvgImage::getSvgData‑datan när den ursprungliga vektorresursen själv krävs.

Beskär en bild

Beskärning ändrar vilken del av en bild som är synlig i ramen. Beskärningsvärdena på PictureFillFormat är procentandelar av källbildens dimensioner. Beskärning tar initialt inte bort de dolda pixlarna från den inbäddade bilden; den ändrar bara den synliga regionen.

Följande exempel hittar en bildram på ett säkert sätt och applicerar beskärningsvärden:

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

Eftersom den dolda bilddatan fortfarande finns kvar kan beskärningen förändras senare utan att förlora de ursprungliga pixlarna. Om filstorlek är viktigare än återställningsbarhet kan de beskärda områdena fysiskt tas bort som beskrivs i nästa avsnitt.

Ta bort beskärd bilddata

PictureFillFormat::deletePictureCroppedAreas tar bort bilddata utanför den aktuella beskärningsrektangeln och returnerar den resulterande bildresursen. Detta kan minska filstorleken, men det är en destruktiv optimering: efter att presentationen sparats är de borttagna pixlarna inte längre tillgängliga för en senare avbeskära‑operation.

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

Metoden kan lägga till en ny bildresurs i presentationen. Om den ursprungliga bilden även används av andra bildramar, behöver de ramarna fortfarande sin befintliga resurs, så att ta bort beskärda områden inte nödvändigtvis minskar det totala antalet bilder. Beskärning av WMF‑ eller EMF‑innehåll med denna metod rasteriserar det beskärda resultatet till PNG.

Komprimera rasterbilder

PictureFillFormat::compressImage minskar rasterbildens upplösning i förhållande till den storlek som bilden visas i. Den kan också ta bort beskärda områden i samma operation. Metoden returnerar true när bilden har ändrats i storlek eller beskärts och false när ingen förändring var nödvändig.

Använd ett fördefinierat PicturesCompression‑värde när en standardmål‑upplösning är tillräcklig:

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

Ett eget positivt DPI‑värde kan anges i stället för ett fördefinierat värde när ett specifikt mål krävs.

Komprimering är avsedd för rasterbilder. SVG‑ och metafil‑innehåll reduceras inte av detta rasterkomprimerings‑arbetsflöde. Kom också ihåg att lägre upplösning och borttagna beskärda områden inte kan återställas från den optimerade presentationen. Välj en mål‑upplösning baserat på den största storlek som bilden faktiskt kommer att visas eller exporteras i, snarare än att applicera den lägsta DPI:n globalt.

Hantera bildtransform‑effekter

För ett komplett arbetsflöde som täcker ljusstyrka, kontrast, färgtransformeringar, oskärpa, alfa‑effekter, ordnade kedjor, inspektion, borttagning och rund‑resa‑verifiering, se Image Transform Effects.

Lås bildramens geometri

PictureFrameLock‑inställningarna kontrollerar vilka redigeringsoperationer som är inaktiverade för en bildram. Till exempel bevarar setAspectRatioLocked formens proportioner när den skalas.

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

Låset gäller bildramens form. Det tvingar inte källbilden att samplas om eller permanent förändras till samma bildförhållande.

Justera StretchOffset‑värdena

När bildfyllnadsläget är stretch definierar stretch‑offset‑värdena på PictureFillFormat fyllningsrektangeln relativt bildramens omgivande låda. Positiva procentandelar skapar ett inskjut från en kant, medan negativa procentandelar skapar ett utskjut.

Detta skiljer sig från beskärning. Beskärningsvärden väljer vilken del av källbilden som är synlig; stretch‑offsets ändrar rektangeln som den synliga bildfyllnaden streckas in i.

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

Använd stretch‑offsets för fyllningsplacering. Använd beskärningsattribut när målet är att dölja kanter i källbilden.

Lagring, filstorlek och exportaspekter

De viktigaste avvägningarna blir enklare att hantera när bildlagring och bildramens formatering behandlas separat:

  • Inbäddade bilder gör presentationen självständig och är den mest pålitliga för delning och server‑sidig rendering, men stora rasterbilder ökar PPTX‑storleken och minnesanvändningen.
  • Länkade bilder kan hålla paketet mindre, men presentationen beror på att externa filer förblir tillgängliga på de lagrade sökvägarna eller platserna.
  • Beskärning är initialt icke‑destruktiv. De dolda pixlarna förblir inbäddade tills beskärda områden uttryckligen tas bort eller avlägsnas vid komprimering.
  • Komprimering kan minska filstorleken avsevärt för överdimensionerade rasterbilder, men den offrar källupplösning. Den bör appliceras efter att den avsedda storleken på bilden i sliden är känd.
  • SVG‑bilder bör behållas som SVG när vektor­bevarande är viktigt. Extrahera den inbäddade SVG:n direkt när du behöver själva vektorresursen. Raster‑slide‑exporter konverterar alltid den renderade sliden till pixlar.
  • Upprepade bilder bör återanvända en befintlig PPImage‑resurs när det är möjligt i stället för att upprepade gånger läsa in samma fil i presentationsarbetsflödet.

För stora presentationer är bildoptimering vanligtvis mest effektiv när den utförs selektivt: behåll logotyper och diagram som vektor­innehåll, komprimera fotografier enligt deras faktiska visningsstorlek, ta bort beskurna pixlar endast när senare redigering inte krävs, och undvik externa länkar om inte beroendehantering är en del av distributionsdesignen.

FAQ

Vad är skillnaden mellan en bildram och en bildresurs?

En PPImage representerar en bildresurs som är associerad med presentationen. En PictureFrame är en form på en slide som visar en bild och lagrar ram‑nivå‑geometri och formatering såsom storlek, rotation, beskärningsvärden, effekter och lås.

Ska jag bädda in eller länka bilder?

Bädda in bilder när presentationen måste vara portabel, arkiverad eller renderad utan åtkomst till externa resurser. Länka bilder endast när det är avsiktligt att hålla bildfilerna utanför PPTX och de externa platserna kan underhållas på ett tillförlitligt sätt.

Minskar beskärning PPTX‑filstorleken?

Inte av sig själv. Vanliga beskärningsinställningar döljer delar av källbilden men behåller de underliggande pixlarna. Använd PictureFillFormat::deletePictureCroppedAreas eller bildkomprimering med borttagning av beskärda områden när dessa pixlar kan tas bort permanent.

Kan jag återställa bildkvaliteten efter komprimering?

Nej. Komprimering kan minska lagrad raster‑upplösning, och att ta bort beskärda områden slänger bilddata. Behåll originalkällbilden utanför presentationen om högupplöst redigering senare kan bli nödvändig.

Hur bör SVG‑bilder hanteras?

Behåll SVG‑innehåll som SVG när vektor‑fidelity är viktigt. Den inbäddade SvgImage kan extraheras direkt. Rendering av en slide till ett rasterformat som PNG eller JPEG rasteriserar SVG:n som en del av slide‑bilden.

Hur kan jag undvika osäkra cast‑operationer när jag läser befintliga slides?

Kontrollera formtypen innan du använder bildram‑specifika medlemmar. En java_instanceof‑kontroll mot PictureFrame undviker ogiltiga cast‑operationer och låter koden hantera slides som inte innehåller bildramar.