Képkeretek kezelése prezentációkban .NET-ben

Áttekintés

A képkeret egy dia alakzat, amely képet jelenít meg. Az Aspose.Slides-ban a képernyő erőforrása és a megjelenítő alakzat külön objektumok: egy Presentation a beágyazott képernyő erőforrásokat a Images gyűjteményén keresztül kezeli, míg egy IPictureFrame szabályozza a kép pozícióját, méretét, vonalformázását, elforgatását, levágását, képeffektusait és egyéb keretszintű beállításait.

Ez a szétválasztás 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 IPPImage objektumot, és használja ezt a képernyő erőforrást a képkeretek létrehozásakor.

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

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

Beágyazott kép esetén adja hozzá a képadatokat a prezentációhoz, és hozzon létre egy képkeretet a IShapeCollection.AddPictureFrame metódussal. A kép a prezentációcsomag része lesz, így a prezentáció önmagában is működik, amikor egy másik számítógépre helyezik át.

Az alábbi példa JPEG képet ad hozzá, a kép natív méreteiben hoz létre egy keretet, és vonalformázást valamint elforgatást alkalmaz:

using System.Drawing;
using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var imageData = File.ReadAllBytes("photo.jpg");
var image = presentation.Images.AddImage(imageData);

var pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 100, image.Width, image.Height, image);
pictureFrame.LineFormat.FillFormat.FillType = FillType.Solid;
pictureFrame.LineFormat.FillFormat.SolidFillColor.Color = Color.Blue;
pictureFrame.LineFormat.Width = 3;
pictureFrame.Rotation = 15;

presentation.Save("picture-frame.pptx", SaveFormat.Pptx);

A képkeret szabályozza a megjelenített geometriát; a keret méretének módosítása nem változtatja meg az eredeti pixeles méreteket, amelyek a beágyazott képernyő erőforrásban vannak tárolva. Ez a különbség későbbi levágás vagy tömörítés esetén válik fontosá.

Relatív méretezés használata

IPictureFrame relatív szélesség‑ és magasság‑arányt biztosít a kerethez. Az 1.0 érték az eredeti kép 100 %-ának felel meg. A relatív méretezés hasznos, ha a munkafolyamatnak a forráskép méretéhez viszonyított arányt kell megőriznie a végső méretek kézi kiszámítása helyett.

using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var imageData = File.ReadAllBytes("photo.jpg");
var image = presentation.Images.AddImage(imageData);

var pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, image);
pictureFrame.RelativeScaleWidth = 1.35f;
pictureFrame.RelativeScaleHeight = 0.8f;

presentation.Save("relative-scale.pptx", SaveFormat.Pptx);

A relatív méretezés megváltoztatja a keret méretbeállításait; nem resample‑eli vagy tömöríti a beágyazott képet.

Beágyazott és hivatkozott képek

A beágyazott kép a képadatokat a prezentációban tárolja, ezért a legbiztonságosabb választás a hordozhatóság és a kiszámítható megjelenítés szempontjából. A hivatkozott kép egy külső helyet tárol a ISlidesPicture hivatkozási útvonalon keresztül, ahelyett, hogy a kép adatokat ugyanúgy beágyazná.

A hivatkozott képek csökkenthetik a PPTX-ben tárolt képadatok mennyiségét, de külső függőséget vezetnek be. A hivatkozott fájlnak elérhetőnek kell maradnia a prezentációt megnyitó vagy renderelő alkalmazás számára. Ha az útvonal megváltozik, a fájl áthelyezésre kerül, vagy a forrás nem áll rendelkezésre, a hivatkozott kép nem jelenhet meg a várt módon. Azoknál a prezentációknál, amelyeket e‑mailben kell elküldeni, archiválni vagy izolált környezetben renderelni, a beágyazott képek általában megbízhatóbbak.

Hivatkozott kép hozzáadása

Az alábbi példa egy képkeretet hoz létre, és egy helyi képfájlra mutat. Csak a kép hivatkozásával foglalkozik; a videó hivatkozás egy külön média‑munkafolyamat, és szándékosan nincs összekeverve ebben a példában.

using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 50, 320, 180, null);
pictureFrame.PictureFormat.Picture.LinkPathLong = Path.GetFullPath("linked-image.jpg");

presentation.Save("linked-image.pptx", SaveFormat.Pptx);

Használja a hivatkozásokat, amikor a külső fájlkezelés szándékos. Ne használja őket pusztán tömörítés helyettesítésére: egy kis PPTX törött kép‑függőségekkel általában kevésbé hasznos, mint egy nagyobb önálló prezentáció.

Képek kinyerése a képkeretekből

Mielőtt képet nyerne ki egy meglévő prezentációból, ellenőrizze, hogy az alakzat ténylegesen egy IPictureFrame‑e, és hogy tartalmaz‑e beágyazott képet. A hivatkozott képkeretek nem feltétlenül tartalmaznak olyan 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‑t használja, és nem igényli a régebbi rendszer‑kép wrapper‑t. Az alábbi példa megtalálja az első beágyazott raster képet egy dián, és PNG‑ként menti el:

using System;
using Aspose.Slides;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

foreach (var shape in slide.Shapes)
{
    if (shape is not IPictureFrame pictureFrame)
    {
        continue;
    }

    var embeddedImage = pictureFrame.PictureFormat.Picture.Image;
    if (embeddedImage == null || embeddedImage.SvgImage != null)
    {
        continue;
    }

    using var rasterImage = embeddedImage.Image;
    rasterImage.Save("extracted-image.png", Aspose.Slides.ImageFormat.Png);
    break;
}

A IImage használatával a kinyert kép a kért kimeneti formátumba kerül konvertálásra. Ha a prezentációban tárolt kódolt bájtokra van szüksége, a 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 IPPImage egy ISvgImage objektumot biztosít. Ez lehetővé teszi, hogy közvetlenül a SVG adatot szerezze meg, anélkül, hogy a képet először rasterizálná.

using System.IO;
using Aspose.Slides;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

foreach (var shape in slide.Shapes)
{
    if (shape is not IPictureFrame pictureFrame)
    {
        continue;
    }

    var embeddedImage = pictureFrame.PictureFormat.Picture.Image;
    var svgImage = embeddedImage?.SvgImage;
    if (svgImage == null)
    {
        continue;
    }

    File.WriteAllBytes("extracted-image.svg", svgImage.SvgData);
    break;
}

Az SVG tartalom SVG‑ként való megőrzése biztosítja a vektor forrást a prezentációban. A PNG vagy JPEG‑s raster exportok kötelezően pixelre renderelik a vektort. A PDF vagy SVG dia‑export is egy renderelési művelet, így az exportált grafika nem tekinthető bite‑pontos másolatnak az eredeti beágyazott SVG‑ből; használja a beágyazott ISvgImage adatot, ha a vektor forrásra van szükség.

Kép levágása

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

Az alábbi példa biztonságosan megtalál egy képkeretet, és alkalmazza a levágási értékeket:

using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];
var pictureFrame = slide.Shapes.OfType<IPictureFrame>().FirstOrDefault();

if (pictureFrame != null)
{
    pictureFrame.PictureFormat.CropLeft = 23.6f;
    pictureFrame.PictureFormat.CropRight = 21.5f;
    pictureFrame.PictureFormat.CropTop = 3f;
    pictureFrame.PictureFormat.CropBottom = 31f;
    presentation.Save("cropped-image.pptx", SaveFormat.Pptx);
}

Mivel a rejtett képadatok még mindig jelen vannak, a levágást később módosíthatja anélkül, hogy elveszítené az eredeti pixeleket. Ha a fájlméret fontosabb, mint a visszavonhatóság, a levágott területek fizikailag eltávolíthatók a következő szakaszban leírt módon.

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

IPictureFillFormat.DeletePictureCroppedAreas eltávolítja a képadatokat a jelenlegi levágási téglalapon kívü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 a eltávolított pixelek már nem állnak rendelkezésre későbbi visszalevágáshoz.

using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("cropped-image.pptx");
var slide = presentation.Slides[0];
var pictureFrame = slide.Shapes.OfType<IPictureFrame>().FirstOrDefault();

if (pictureFrame != null)
{
    var croppedImage = pictureFrame.PictureFormat.DeletePictureCroppedAreas();
    if (croppedImage != null)
    {
        presentation.Save("cropped-data-removed.pptx", SaveFormat.Pptx);
    }
}

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

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

IPictureFillFormat.CompressImage csökkenti a raster kép felbontását a kép megjelenített méretéhez viszonyítva. Ugyanebben a műveletben eltávolíthatja a levágott területeket is. A metódus true‑t ad vissza, ha a kép mérete módosult vagy levágás történt, és false‑t, ha nem volt szükség változtatásra.

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

using System;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];
var pictureFrame = slide.Shapes.OfType<IPictureFrame>().FirstOrDefault();

if (pictureFrame != null)
{
    var compressed = pictureFrame.PictureFormat.CompressImage(true, PicturesCompression.Dpi150);
    Console.WriteLine(compressed ? "The image was compressed." : "No compression was necessary.");
    presentation.Save("compressed-image.pptx", SaveFormat.Pptx);
}

Speciális cél esetén egy saját, pozitív DPI érték is megadható enum érték helyett.

A tömörítés raster képekre vonatkozik. SVG és metafájl tartalom nem csökken ezen a raster‑tömörítési munkafolyamaton. Ne feledje, hogy az alacsonyabb felbontás és a törölt levágott területek már nem állíthatók vissza a optimalizált prezentációból. Válasszon célfelbontást a legnagyobb tényleges megjelenítési vagy exportálási méret alapján, ne pedig a legkisebb DPI‑t globálisan alkalmazza.

Kép‑transzformációs hatások kezelése

A fényerő, kontraszt, színátalakítások, elmosás, alfa‑hatások, rendelt láncok, ellenőrzés, eltávolítás és round‑trip ellenőrzés teljes munkafolyamatairól lásd a Image Transform Effects oldalon.

Képkeret geometria zárolása

Az IPictureFrameLock beállítások szabályozzák, hogy mely szerkesztési műveletek vannak letiltva egy képkeretnél. Például az arányzár a méretezés során megtartja az alakzat arányait.

using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var imageData = File.ReadAllBytes("photo.jpg");
var image = presentation.Images.AddImage(imageData);

var pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 50, 100, image.Width, image.Height, image);
pictureFrame.PictureFrameLock.AspectRatioLocked = true;

presentation.Save("locked-picture-frame.pptx", SaveFormat.Pptx);

A zár a képkeret alakzatára vonatkozik. Nem kényszeríti a forrásképet, hogy ugyanarra az arányra legyen resample‑olva vagy végleg módosítva.

StretchOffset értékek módosítása

Amikor a kép kitöltési módja „stretch”, a IPictureFillFormat stretch‑offset értékei a kitöltési téglalapot a képkeret határoló keretéhez képest definiálják. A pozitív százalékok a szélről beljebb hoznak, a negatív százalékok pedig kifelé.

Ez különbözik a levágástól. A levágási értékek határozzák meg, hogy a forráskép mely része látható; a stretch‑offsetok a látható kitöltés téglalapját módosítják.

using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var imageData = File.ReadAllBytes("photo.png");
var image = presentation.Images.AddImage(imageData);

var pictureFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 400, 300, image);
pictureFrame.PictureFormat.PictureFillMode = PictureFillMode.Stretch;
pictureFrame.PictureFormat.StretchOffsetLeft = 12f;
pictureFrame.PictureFormat.StretchOffsetRight = 12f;
pictureFrame.PictureFormat.StretchOffsetTop = 8f;
pictureFrame.PictureFormat.StretchOffsetBottom = 8f;

presentation.Save("stretch-offsets.pptx", SaveFormat.Pptx);

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

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

A fő kompromisszumok könnyebben kezelhetők, ha a képtárolás és a képkeret‑formázás különállóként kezelődik:

  • Beágyazott képek önmagukban tartalmazzák a prezentációt, és a legmegbízhatóbbak megosztás és szerver‑oldali renderelés esetén, de a nagy raster képek megnövelik a PPTX méretét és a memóriahasználatot.
  • Hivatkozott képek kisebb csomagot eredményezhetnek, de a prezentáció a külső fájlok elérhetőségétől függ.
  • Levágás eleinte nem destruktív. A rejtett pixelek addig be vannak ágyazva, amíg a levágott területeket kifejezetten nem törlik vagy nem távolítják el tömörítés közben.
  • Tömörítés jelentősen csökkentheti a fájlméretet a túlnagy raster képek esetén, de a forrásfelbontás feláldozásával jár. A kívánt dián megjelenő méret ismeretében kell alkalmazni.
  • SVG képek esetén a vektor megőrzése érdekében SVG‑ként kell megtartani őket. A beágyazott SVG közvetlen kinyerése akkor szükséges, ha a vektor forrásra van szükség. A raster dia‑exportok mindig a diaszöveget pixelekre konvertálják.
  • Ismétlődő képek esetén a meglévő IPPImage erőforrás újrafelhasználása ajánlott, ahelyett, hogy ugyanazt a fájlt többször betöltené a munkafolyamatba.

Nagy prezentációk esetén a képek optimalizálása általában akkor a leghatékonyabb, ha szelektíven történik: tartsa a logókat és diagramokat vektor tartalomként, tömörítse a fényképeket a tényleges megjelenítési méretüknek megfelelően, csak akkor távolítsa el a levágott pixeleket, ha a későbbi szerkesztés nem szükséges, és kerüljön a külső hivatkozásokat, hacsak a függőségkezelés nem része a telepítési tervnek.

GYIK

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

Az IPPImage egy a prezentációhoz társított kép‑erőforrást képviseli. Egy IPictureFrame egy dia alakzata, amely egy képet jelenít meg, és a keretszintű geometriát és formázást tárolja, mint például méret, elforgatás, levágási értékek, effektusok és zárolások.

Beágyazzam vagy hivatkozzak a képekre?

Beágyazza a képeket, ha a prezentációnak hordozhatónak, archiváltnak vagy külső források nélkül rendereltnek kell lennie. Hivatkozzon képekre csak akkor, ha a képfájlok kívül tartása szándékos, és a külső helyek megbízhatóan karbantarthatók.

Csökkenti-e a levágás a PPTX fájlméretét?

Nem önmagában. A szokásos levágási beállítások elrejtik a forráskép részeit, de a pixelek továbbra is tárolódnak. Használja a IPictureFillFormat.DeletePictureCroppedAreas vagy a kép‑tömörítést levágott‑terület-eltávolítással, ha ezeket a pixeleket véglegesen el akarja távolítani.

Visszaállítható a képminőség 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 levágott területek eltávolítása adatvesztést eredményez. Tartsa meg az eredeti forrásképet a prezentáción kívül, ha később magas felbontású szerkesztésre lehet szükség.

Hogyan kell kezelni az SVG képeket?

Tartsa az SVG tartalmat SVG‑ként, ha a vektor pontossága fontos. A beágyazott ISvgImage közvetlenül kinyerhető. A dia raster formátumba (PNG vagy JPEG) való renderelése a SVG‑t pixelekre alakítja.

Hogyan kerülhető el a nem biztonságos cast használata meglévő diák olvasásakor?

Ellenőrizze a forma típusát, mielőtt képkeret‑specifikus tagokat használna. Az IPictureFrame mintázat‑illesztés vagy a forma‑gyűjtemény ezen interfész alapján való szűrése elkerüli az érvénytelen cast‑eket, és lehetővé teszi, hogy a kód olyan diákat is kezeljen, amelyek nem tartalmaznak képkeretet.