Képtranszformációs effektusok kezelése prezentációkban .NET segítségével

Áttekintés

Az Aspose.Slides a képi állításokat rendezett gyűjteményként képzi meg a képtranszformációs műveletekből. Egy képkockához kezdje a képkocka ISlidesPicture objektumával, és érje el a ISlidesPicture.ImageTransform-t. A visszaadott IImageTransformOperationCollection lehetővé teszi műveletek hozzáadását, felsorolását, vizsgálatát, eltávolítását és a hatások törlését az eredeti kép bájtjainak újraírása nélkül.

Ez a cikk bemutat egy teljes munkafolyamatot fényerő‑kontraszt, színátalakítások, elmosás, átlátszóság, rendezett hatásláncok, hatékony értékek, eltávolítás és PPTX round‑trip ellenőrzés esetén.

Az effektus tulajdonjogának és a kép újrahasználatának megértése

Egy kép erőforrás és a megjelenítő kép két külön objektum:

  • IPPImage tárolja vagy hivatkozik a prezentáció által birtokolt forráskép adataira.
  • ISlidesPicture egy képkitöltéshez tartozik, hivatkozik egy kép erőforrásra, miközben tárolja a képtranszformációk gyűjteményét.
  • IPictureFrame a dia alakja, amely a megfelelő képkitöltést, geometriát, vágási beállításokat és egyéb keret‑szintű formázást birtokolja.

Ezért a képtranszformációs műveletek nem módosítják a IPPImage bájtjait. Amikor ugyanazt az IPPImage‑t többször adja át a IShapeCollection.AddPictureFrame metódusnak, minden új képkocka kap egy saját ISlidesPicture‑t és egy saját transzformáció‑gyűjteményt. A szürkeárnyalatos hatás egy kerethez nem teszi szürkeárnyalatosá a többi keretet, még ha mindegyik ugyanazt az beágyazott kép erőforrást használja is.

Ugyanez az ISlidesPicture.ImageTransform modell más képkitöltéseknél is használatos, például alakzat vagy dia háttér esetén. Az alábbi példák a képkockákra fókuszálnak.

Érvényes paramétertartományok és mértékegységek használata

A bemutatott módszerek a következő szemantikai tartományokat és mértékegységeket alkalmazzák. Tartsa a értékeket ezekben a tartományokban, még akkor is, ha egy adott könyvtárverzió nem utasítja el azonnal a tartományon kívüli értékeket; a célprezentáció formátuma normalizálhatja, elhagyhatja vagy elutasíthatja a hibás adatokat mentéskor vagy amikor a PowerPoint megnyitja a fájlt.

Művelet Paraméterek Érvényes tartomány és egység
AddBrightnessContrastEffect brightness, contrast -100 és 100 között, százalék; 0 meghagyja az alkotóelemet változatlanul.
AddGrayScaleEffect None Nincsenek numerikus paraméterek. Az alfa változatlan marad.
AddDuotoneEffect Color1, Color2 Két szín a sötét és a világos pixelekhez. A System.Drawing.Color RGB és alfa csatornái 0‑tól 255‑ig terjednek.
AddTintEffect hue, amount A árnyalat 0 (inkluzív) és 360 (exkluzív) fok között; az érték -100 és 100 között, százalék.
AddHSLEffect hue, saturation, luminance A árnyalat 0‑tól 360‑ig fokban; a telítettség és a fényerő -100‑tól 100‑ig, százalék.
AddColorReplaceEffect Color A helyettesítő szín csatornaértékei 0‑tól 255‑ig terjednek. A meglévő alfa értékek változatlanok.
AddBlurEffect radius, grow A sugár nemnegatív és pontban mérhető; a grow logikai érték, amely meghatározza, hogy a elmosott tartalom túlnyúlhat-e az eredeti határokon.
AddAlphaModulateFixedEffect amount Nemnegatív százalék. Az 0‑tól 100‑ig terjedő értékek a szokásos átlátszatlanság skálázást jelentik: 0 teljesen átlátszó, 100 megőrzi a meglévő alfat.
AddAlphaReplaceEffect alpha 0‑tól 100‑ig, százalékos átlátszatlanság.
AddAlphaBiLevelEffect threshold 0‑tól 100‑ig, százalékos alfa küszöb. Az alatta lévő értékek átlátszóvá válnak; a küszöbnél nagyobb vagy egyenlő értékek átlátszatlanná.

Fix alfa‑moduláció esetén az átlátszóság és az átlátszatlanság kiegészítik egymást. Például a 35 % átlátszóság a 65 % alfa‑modulációs értéknek felel meg.

Fényerő és kontraszt alkalmazása

IImageTransformOperationCollection.AddBrightnessContrastEffect egy IBrightnessContrast műveletet ad vissza. Skáláris beállításait a művelet létrehozásakor adjuk meg. Az IBrightnessContrast.GetEffective számított, csak‑olvasásra szánt értékeket ad, amelyeket ellenőrizhet vagy naplózhat.

Az alábbi példa 15 % fényerőt és 20 % kontrasztot ad hozzá, majd előnézetet renderel anélkül, hogy módosítaná a beágyazott képet:

using System;
using System.IO;
using Aspose.Slides;
using Aspose.Slides.Effects;

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, 50, 50, 400, 260, image);

var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
IBrightnessContrast brightnessContrast = imageTransform.AddBrightnessContrastEffect(15f, 20f);

var effectiveValues = brightnessContrast.GetEffective();
Console.WriteLine("Brightness: " + effectiveValues.Brightness + "%");
Console.WriteLine("Contrast: " + effectiveValues.Contrast + "%");

using var preview = slide.GetImage();
preview.Save("brightness-contrast-preview.png", ImageFormat.Png);

BrightnessContrast egy Office 2010 képeffekt‑kiterjesztés, és kevésbé hordozható, mint a szabványos DrawingML fényerő‑effekt. Amikor a fényerő és a kontraszt szerkeszthető maradjon egy PPTX round‑trip után, használja a IImageTransformOperationCollection.AddLuminanceEffect‑et, és ellenőrizze az eredményt a fájl újbóli megnyitása után. A formátumkorlátozások szakaszban részletesebben kifejtésre kerül ez a különbség.

Színátalakítások alkalmazása

A színeffektek önállóan alkalmazhatók különböző képkockákra, amelyek ugyanazt a kép erőforrást használják. Az alábbi példa öt keretet hoz létre, és rájuk alkalmazza a szürkeárnyalatos, duotone, árnyalat, HSL‑korrekció és színcserét.

IDuotone két önállóan szerkeszthető színparamétert tartalmaz: a Color1 a sötét pixeleket, a Color2 a világos pixeleket rendeli hozzá. Ez egy olyan effektus példája, amelynek beállításai komplexebbek egy egyszerű skalár értéknél.

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.png");
var image = presentation.Images.AddImage(imageData);

var grayFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 20, 20, 180, 120, image);
grayFrame.PictureFormat.Picture.ImageTransform.AddGrayScaleEffect();

var duotoneFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 220, 20, 180, 120, image);
var duotone = duotoneFrame.PictureFormat.Picture.ImageTransform.AddDuotoneEffect();
duotone.Color1.Color = Color.Navy;
duotone.Color2.Color = Color.Gold;

var tintFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 420, 20, 180, 120, image);
tintFrame.PictureFormat.Picture.ImageTransform.AddTintEffect(210f, 35f);

var hslFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 120, 170, 180, 120, image);
hslFrame.PictureFormat.Picture.ImageTransform.AddHSLEffect(30f, 20f, -10f);

var replacementFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 320, 170, 180, 120, image);
var colorReplacement = replacementFrame.PictureFormat.Picture.ImageTransform.AddColorReplaceEffect();
colorReplacement.Color.Color = Color.CornflowerBlue;

presentation.Save("color-transformations.pptx", SaveFormat.Pptx);

AddColorReplaceEffect minden pixel színét egy fix színre cseréli, miközben megőrzi az alfat. Ez különbözik a AddColorChangeEffect-től, amely egy forrás‑színt egy másikra térképezi, és mindkét színformátumot ki is téri.

Elmosás, átlátszóság és alfa‑effektek hozzáadása

AddBlurEffect minden színcsatornát, köztük az alfat, érint. Állítsa a grow értékét true‑ra, ha az elmosott él meghaladhatja az eredeti kép határait.

Egységes átlátszóság esetén használja a AddAlphaModulateFixedEffect-et. Ez minden meglévő alfa‑értéket megszoroz, így a részben átlátszó pixelek arányosan eltérőek maradnak. Az AddAlphaReplaceEffect ehelyett egyetlen alfa‑értéket rendel minden pixelhez. Az AddAlphaBiLevelEffect az alfat két szintre konvertálja egy küszöb alapján.

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 blurredFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 20, 20, 200, 140, image);
var blur = blurredFrame.PictureFormat.Picture.ImageTransform.AddBlurEffect(4.5, true);
blur.Radius = 5;

var transparentFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 240, 20, 200, 140, image);
var alphaModulate = transparentFrame.PictureFormat.Picture.ImageTransform.AddAlphaModulateFixedEffect(65f);
alphaModulate.Amount = 60f;

var uniformAlphaFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 20, 180, 200, 140, image);
uniformAlphaFrame.PictureFormat.Picture.ImageTransform.AddAlphaReplaceEffect(55f);

var binaryAlphaFrame = slide.Shapes.AddPictureFrame(ShapeType.Rectangle, 240, 180, 200, 140, image);
var alphaBiLevel = binaryAlphaFrame.PictureFormat.Picture.ImageTransform.AddAlphaBiLevelEffect(50f);
alphaBiLevel.Threshold = 45f;
binaryAlphaFrame.PictureFormat.Picture.ImageTransform.AddAlphaInverseEffect();

presentation.Save("blur-and-alpha-effects.pptx", SaveFormat.Pptx);

Más, paraméter‑mentes alfa‑műveletek: a AddAlphaCeilingEffect minden nem‑nulla alfat teljesen átlátszatlanná teszi; a AddAlphaFloorEffect minden 100 % alatti alfat teljesen átlátszóvá alakítja; valamint az AddAlphaInverseEffect, amely az alfat 100% - alfa értékre változtatja.

Rendezett effektuslánc felépítése

Minden Add...Effect metódus egy új műveletet fűz a gyűjtemény végéhez. A renderelő a gyűjteményt rendezett csővezeték‑ként használja: a 0‑ás művelet kimenete lesz az 1‑es bemenete, stb. Ennek következtében ugyanazok a műveletek más sorrendben eltérő képet eredményezhetnek.

Például a szürkeárnyalatos hatás után az árnyalat először eltávolítja a kromatikus információt, majd a luminancia eredményt színezi újra. Az árnyalat után a szürkeárnyalatos hatás visszavonja az árnyalatot. Hasonlóképpen, az alfa‑helyettesítés felülírhatja a korábbi műveletek által számított alfa‑értékeket, míg az alfa‑moduláció megőrzi azok relatív különbségeit.

Az alábbi példa egy négy műveletből álló láncot épít, PPTX‑ként menti, újra megnyitja a prezentációt, ellenőrzi a művelettípusokat és a sorrendet, majd rendereli a újra‑megnyitott eredményt:

using System;
using System.IO;
using Aspose.Slides;
using Aspose.Slides.Effects;
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, 50, 50, 400, 260, image);

var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
imageTransform.AddGrayScaleEffect();
imageTransform.AddTintEffect(220f, 25f);
imageTransform.AddBlurEffect(2.5, false);
imageTransform.AddAlphaModulateFixedEffect(80f);

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

using var reopenedPresentation = new Presentation("image-transform-chain.pptx");
var reopenedShape = reopenedPresentation.Slides[0].Shapes[0];

if (reopenedShape is IPictureFrame reopenedFrame)
{
    var reopenedTransform = reopenedFrame.PictureFormat.Picture.ImageTransform;
    var orderIsPreserved = reopenedTransform.Count == 4 && 
            reopenedTransform[0] is IGrayScale && 
            reopenedTransform[1] is ITint && 
            reopenedTransform[2] is IBlur && 
            reopenedTransform[3] is IAlphaModulateFixed;
    Console.WriteLine(orderIsPreserved ? "The effect chain was preserved." : "The effect chain changed during the round trip.");

    using var renderedSlide = reopenedPresentation.Slides[0].GetImage();
    renderedSlide.Save("reopened-effect-chain.png", ImageFormat.Png);
}
else
{
    Console.WriteLine("The reopened shape is not a picture frame.");
}

A gyűjtemény nem kényszerít kompatibilitási mátrixot, amely szín‑, alfa‑ és elmosási műveleteket külön láncokra korlátozna. Kombinálhatók, de a kombinációk nem mindig hasznosak. Egy fix színcsere eltávolítja az előző színeffektusok által létrehozott RGB‑variációkat; a duotone után a szürkeárnyalatos hatás eltávolítja a kiválasztott két színt; az alfa‑ceiling, floor, replace vagy bi‑level műveletek az előbb létrehozott alfa‑részleteket eldobhatják. Építse fel a láncot a kívánt pixel‑feldolgozási sorrend szerint, ne tekintse elemeit rendezetlen formázási jelzőnek.

Szerkeszthető és hatékony értékek vizsgálata

A szerkeszthető művelet az ISlidesPicture.ImageTransform‑ben tárolt objektum. Az effektustól függően közvetlenül is elérhetőek a írható tagok. Például az IBlur írható Radius és Grow mezőket kínál, az IAlphaModulateFixed írható Amount‑ot, az IAlphaBiLevel pedig írható Threshold‑et. Az IDuotone szín‑effektusok módosítható IColorFormat objektumokat adnak.

Néhány művelet‑interfész, például az IBrightnessContrast, IHSL, ITint és az IAlphaReplace, nem teszi elérhetővé a létrehozási skalárokat írásra. Ezek beállításainak módosításához távolítsa el a műveletet, és adjon hozzá egy újat a kívánt pozícióban.

A GetEffective()‑vel visszakapott hatékony adatok számított és csak‑olvasásra szántak. Hasznosak a témafüggő színek feloldásához és a renderelő által használt normalizált értékek olvasásához, de nem jelentenek újabb szerkesztési felületet. Az alábbi példa felsorolja a láncot, és a megfelelő API‑k által biztosított hatékony értékeket vizsgálja:

using System;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Effects;

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

if (pictureFrame != null)
{
    var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;

    for (var index = 0; index < imageTransform.Count; index++)
    {
        var operation = imageTransform[index];
        Console.WriteLine(index + ": " + operation.GetType().Name);

        switch (operation)
        {
            case IBrightnessContrast brightnessContrast:
                var brightnessContrastData = brightnessContrast.GetEffective();
                Console.WriteLine("  Brightness: " + brightnessContrastData.Brightness);
                Console.WriteLine("  Contrast: " + brightnessContrastData.Contrast);
                break;
            case ILuminance luminance:
                var luminanceData = luminance.GetEffective();
                Console.WriteLine("  Brightness: " + luminanceData.Brightness);
                Console.WriteLine("  Contrast: " + luminanceData.Contrast);
                break;
            case IDuotone duotone:
                var duotoneData = duotone.GetEffective();
                Console.WriteLine("  Dark color: " + duotoneData.Color1);
                Console.WriteLine("  Light color: " + duotoneData.Color2);
                break;
            case IColorReplace colorReplace:
                var colorReplaceData = colorReplace.GetEffective();
                Console.WriteLine("  Replacement color: " + colorReplaceData.Color);
                break;
            case IHSL hsl:
                var hslData = hsl.GetEffective();
                Console.WriteLine("  HSL: " + hslData.Hue + ", " + hslData.Saturation + ", " + hslData.Luminance);
                break;
            case ITint tint:
                var tintData = tint.GetEffective();
                Console.WriteLine("  Tint: " + tintData.Hue + ", " + tintData.Amount);
                break;
            case IBlur blur:
                var blurData = blur.GetEffective();
                Console.WriteLine("  Blur radius: " + blurData.Radius + " pt");
                break;
            case IAlphaModulateFixed alphaModulate:
                var alphaData = alphaModulate.GetEffective();
                Console.WriteLine("  Alpha amount: " + alphaData.Amount + "%");
                break;
            case IAlphaReplace alphaReplace:
                var alphaReplaceData = alphaReplace.GetEffective();
                Console.WriteLine("  Replacement alpha: " + alphaReplaceData.Alpha + "%");
                break;
            case IAlphaBiLevel alphaBiLevel:
                var alphaBiLevelData = alphaBiLevel.GetEffective();
                Console.WriteLine("  Alpha threshold: " + alphaBiLevelData.Threshold + "%");
                break;
        }
    }
}

Paraméter‑mentes hatások, mint a szürkeárnyalatos, alfa‑ceiling vagy alfa‑inverse, szintén rendelkeznek hatékony‑adat objektummal, de nincs kiírandó skalár beállítás. Jelenlétük és pozíciójuk a gyűjteményben a fontos információ.

Képtranszformációk eltávolítása vagy törlése

Használja a IImageTransformOperationCollection.RemoveAt‑et egy művelet index szerinti eltávolításához. Mivel az indexek az eltávolítás után eltolódnak, először keresse meg a célt, majd a felsorolás után távolítsa el. A Clear()‑el az egész láncot törölheti.

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

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

if (pictureFrame != null)
{
    var imageTransform = pictureFrame.PictureFormat.Picture.ImageTransform;
    var blurIndex = -1;

    for (var index = 0; index < imageTransform.Count; index++)
    {
        if (imageTransform[index] is IBlur)
        {
            blurIndex = index;
            break;
        }
    }

    if (blurIndex >= 0)
    {
        imageTransform.RemoveAt(blurIndex);
        Console.WriteLine("The blur operation was removed.");
    }

    imageTransform.Clear();
    Console.WriteLine("Remaining operations: " + imageTransform.Count);
    presentation.Save("image-transforms-cleared.pptx", SaveFormat.Pptx);
}

A transzformációk eltávolítása vagy törlése csak a kép formázását módosítja. Nem törli, nem tömöríti újra és nem változtatja meg a újra‑használt IPPImage erőforrást.

Prezentációs formátumok és exportcélok figyelembevétele

A képtranszformációk a DrawingML‑ből származnak, ezért a PPTX a leginkább szerkeszthető formátum a hatásláncok számára. Még PPTX esetén sem minden művelet rendelkezik azonos hordozhatósággal:

  • A szabványos DrawingML műveletek – például luminance, szürkeárnyalatos, duotone, tint, HSL, blur és általános alfa‑műveletek – a legnagyobb eséllyel maradnak meg egy PPTX round‑trip során. Mindig nyissa meg újra a generált fájlt, és vizsgálja meg a gyűjteményt, ha a megőrzés kötelező.
  • A BrightnessContrast egy Office 2010‑kiterjesztés, nem a szabványos DrawingML luminance művelet. Memóriabeli rendereléshez használható, de nem garantált, hogy mentés és újbóli megnyitás után szerkeszthető IBrightnessContrast marad. Inkább a AddLuminanceEffect‑et részesítse előnyben a tartós fényerő‑kontraszt beállításokhoz.
  • A bináris PPT formátum előzi a teljes DrawingML effektus‑modellt. PPT‑be mentés esetén a nem támogatott műveletek elhagyhatók, a lánc egy támogatott részhalmazra csökken, vagy a megjelenés csak közelítően jelenik meg. Ne használja a PPT‑t ellenőrzési formátumként egy összetett szerkeszthető lánc esetén.
  • PNG, JPEG, TIFF, PDF, SVG, HTML vagy egyéb vizuális kimenetek a támogatott láncot alkalmazzák a megjelenéshez. Ezek a kimenetek nem tartalmaznak szerkeszthető IImageTransformOperationCollection‑t; a raszteres formátumok a végeredményt pixelekké lapítják, a dokumentum‑/vektoralapú exportok saját renderelési reprezentációt tárolnak.
  • Az effektusok nem teszik a hivatkozott képet önállóvá. Egy hivatkozott kép renderelése továbbra is a hivatkozott erőforrás elérhetőségétől függ, amikor a prezentáció betöltődik.

Különböző prezentáció‑fogyasztók eltérően renderelhetik a szélsőséges eseteket, különösen ha több alfa‑ vagy szín‑kvantálási műveletet kombinálnak. Kritikus kimenet esetén tesztelje mind a szerkeszthető round‑tripet, mind a végleges exportformátumot az éles környezetben használt Aspose.Slides verzióval.

GYIK

Módosítják a képtranszformációs effektusok a beágyazott képadatokat?

Nem. A műveletek az ISlidesPicture‑hez tartoznak, amely a képkitöltést használja. Az alapjául szolgáló IPPImage bájtjai változatlanok maradnak.

Két olyan képkocka, amely ugyanazt a képet használja, megosztja az effektusokat?

Nem. Az IPPImage újrafelhasználása elkerüli a duplikált képadatokat, de minden képkocka általában saját ISlidesPicture‑t és saját képtranszformációs gyűjteményt kap.

Kombinálhatók a szín‑, elmosási és alfa‑effektek?

Igen. A gyűjtemény egyetlen rendezett láncban fogadja őket. Fontolja meg, hogy az egyes műveletek hogyan befolyásolják az előző kimenetét, mivel a helyettesítő és küszöb‑műveletek eldobhatják a korábbi szín‑ vagy alfa‑részleteket.

Miért csak‑olvasásra szántak a hatékony értékek?

A hatékony adatok a rendereléshez használt számított értékeket tartalmazzák, köztük a feloldott színeket. Szerkessze a transzformációs gyűjteményben tárolt műveletet, ahol írható tagok vannak; egyébként távolítsa el, és adjon hozzá egy újat a kívánt létrehozási paraméterekkel.

Melyik formátumot használjam a transzformációs lánc megőrzéséhez?

Használjon PPTX‑et, és ellenőrizze a fájlt újbóli megnyitással. Az örökölt PPT nem képes a teljes DrawingML effektus‑modellt megjeleníteni, a renderelt exportformátumok pedig csak a megjelenést, nem pedig a szerkeszthető transzformációs műveleteket őrzik meg.