Správa efektů transformace obrázku v prezentacích s .NET

Přehled

Aspose.Slides představuje úpravy obrázků jako uspořádanou kolekci operací transformace obrázku. Pro rámeček obrázku začněte s rámcem ISlidesPicture a přistupte k ISlidesPicture.ImageTransform. Vrácená IImageTransformOperationCollection vám umožní přidávat, procházet, kontrolovat, odstraňovat a vymazávat efekty, aniž byste přepisovali původní bajty obrázku.

Tento článek ukazuje kompletní pracovní postup pro jas a kontrast, barevné transformace, rozostření, průhlednost, řazené řetězce efektů, efektivní hodnoty, odstraňování a ověření PPTX round‑trip.

Pochopte vlastnictví efektů a opakované použití obrázku

Obrazový zdroj a obrázek, který jej zobrazuje, jsou různé objekty:

  • IPPImage ukládá nebo odkazuje na zdrojová data obrázku, která vlastní prezentace.
  • ISlidesPicture patří k výplni obrázku a odkazuje na zdroj obrázku, přičemž uchovává kolekci transformací obrázku.
  • IPictureFrame je tvar snímku, který vlastní příslušnou výplň obrázku, geometrii, nastavení ořezu a další formátování úrovně rámce.

Proto operace transformace obrázku nemodifikují bajty v IPPImage. Když je stejný IPPImage předán metodě IShapeCollection.AddPictureFrame vícekrát, každý nový rámeček obrázku získá vlastní ISlidesPicture a vlastní kolekci transformací. Použití odstínu šedi na jednom rámečku neovlivní ostatní rámečky, i když všechny používají stejný vložený obrazový zdroj.

Stejný model ISlidesPicture.ImageTransform používají také další výplně obrázků, např. tvar nebo pozadí snímku. Níže uvedené příklady se zaměřují na rámečky obrázků.

Používejte platné rozsahy parametrů a jednotky

Ukázané metody používají následující sémantické rozsahy a jednotky. Držte se těchto rozsahů, i když konkrétní verze knihovny neodmítne každou mimo‑rozsahovou hodnotu okamžitě; cílový formát prezentace může během uložení nebo při otevření souboru PowerPointem normalizovat, vynechat nebo odmítnout neplatná data.

Operace Parametry Platný rozsah a jednotka
AddBrightnessContrastEffect brightness, contrast -100100, procent; 0 ponechá komponentu beze změny.
AddGrayScaleEffect None Žádné číselné parametry. Alfa zůstává beze změny.
AddDuotoneEffect Color1, Color2 Dvě barvy pro tmavé a světlé pixely. RGB a alfa kanály v System.Drawing.Color používají hodnoty od 0 do 255.
AddTintEffect hue, amount Odstín je od 0 (včetně) do 360 (vyloučeno) stupňů; množství je od -100 do 100 procent.
AddHSLEffect hue, saturation, luminance Odstín je od 0 (včetně) do 360 (vyloučeno) stupňů; sytost a luminance jsou od -100 do 100 procent.
AddColorReplaceEffect Color Náhradní barva používá kanálové hodnoty od 0 do 255. Existující alfa hodnoty zůstávají beze změny.
AddBlurEffect radius, grow Poloměr je nezáporný a měří se v bodech; grow je logická hodnota určující, zda může rozostřený obsah přesahovat původní ohraničení.
AddAlphaModulateFixedEffect amount Nezáporné procento. Použijte 0100 pro obyčejné škálování neprůhlednosti: 0 je plně průhledné a 100 zachovává existující alfa.
AddAlphaReplaceEffect alpha 0100, procenta neprůhlednosti.
AddAlphaBiLevelEffect threshold 0100, procenta alfa prahu. Hodnoty pod prahem se stanou průhlednými; hodnoty na nebo nad prahem se stanou neprůhlednými.

Pro pevnou alfa modulaci jsou průhlednost a neprůhlednost komplementární. Například 35 % průhlednosti odpovídá hodnotě modulace alfa 65 %.

Použijte jas a kontrast

IImageTransformOperationCollection.AddBrightnessContrastEffect vrací operaci IBrightnessContrast. Její skalární nastavení se předává při vytvoření operace. IBrightnessContrast.GetEffective vrací vypočítané pouze pro čtení hodnoty, které lze zkontrolovat nebo zaznamenat.

Následující příklad zvýší jas o 15 % a kontrast o 20 %, poté zobrazí náhled bez úpravy vloženého obrázku:

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 je rozšíření Office 2010 pro efekt obrázku a není tak přenositelné jako standardní efekt DrawingML luminance. Pokud má jas a kontrast zůstat po PPTX round‑trip editovatelné, použijte IImageTransformOperationCollection.AddLuminanceEffect a výsledek ověřte po opětovném otevření souboru. Sekce omezení formátů toto rozlišení vysvětluje podrobněji.

Použijte transformace barev

Barevné efekty lze použít nezávisle na různých rámecích obrázku, které znovu používají jeden zdroj obrázku. Následující příklad vytvoří pět rámečků a použije odstín šedi, duotón, tónování, úpravu HSL a nahrazení barvy.

IDuotone obsahuje dva nezávisle editovatelné parametry barvy: Color1 mapuje tmavé pixely, zatímco Color2 mapuje světlé pixely. To z něj činí užitečný příklad efektu, jehož nastavení jsou složitější než jediná skalární hodnota.

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 nahrazuje barvu každého pixelu jednou pevnou barvou a zachovává alfa kanál. Liší se od AddColorChangeEffect, který mapuje jednu zdrojovou barvu na jinou a vystavuje oba formáty zdrojové i cílové barvy.

Přidejte rozostření, průhlednost a alfa efekty

AddBlurEffect ovlivňuje všechny barevné kanály, včetně alfa. Nastavte grow na true, pokud rozostřený okraj může přesáhnout původní okraje obrázku.

Pro jednotnou průhlednost použijte AddAlphaModulateFixedEffect. Násobí každou existující hodnotu alfa, takže částečně průhledné pixely zůstávají proporcionálně odlišné. AddAlphaReplaceEffect naopak přiřadí jednu hodnotu alfa všem pixelům. AddAlphaBiLevelEffect převádí alfa na dvě úrovně podle prahu.

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

Další operace alfa bez parametrů zahrnují AddAlphaCeilingEffect, který učiní každou nenulovou alfu plně neprůhlednou; AddAlphaFloorEffect, který učiní každou alfu pod 100 % plně průhlednou; a AddAlphaInverseEffect, který mění alfu na 100% - alfa.

Sestavte řazený řetězec efektů

Každá metoda Add...Effect přidá novou operaci na konec kolekce. Vykreslovací engine používá kolekci jako řazený potrubní pás: výstup operace 0 se stane vstupem operace 1 a tak dále. V důsledku toho může stejná sada operací v jiném pořadí vytvořit odlišný obrázek.

Například odstín šedi následovaný tónováním nejprve odstraní chromatickou informaci a pak přetónuje výsledek luminance. Tónování následované odstínem šedi zase odstraní tónování. Podobně náhrada alfa může přepsat hodnoty alfa vypočítané dřívějšími operacemi, zatímco modulace alfa zachová jejich relativní rozdíly.

Následující příklad vytvoří řetězec čtyř operací, uloží jej jako PPTX, otevře prezentaci znovu, zkontroluje typy operací i jejich pořadí a vykreslí výsledek po opětovném otevření:

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.");
}

Kolekce nevyžaduje kompatibilní matici, která by omezovala barvy, alfa a rozostření na samostatné řetězce. Mohou být kombinovány, ale kombinace nejsou vždy užitečné. Pevná náhrada barvy odstraní RGB variaci vytvořenou předchozími barevnými efekty; odstín šedi po duotónu odstraní dvě vybrané barvy; a efekty alfa ceiling, floor, replacement nebo bi‑level mohou zrušit detaile alfa vytvořené dříve. Sestavujte řetězec podle požadované sekvence zpracování pixelů, nikoli jako neuspořádané příznaky formátování.

Prozkoumejte editovatelné a efektivní hodnoty

Editovatelná operace je objekt uložený v ISlidesPicture.ImageTransform. V závislosti na efektu může přímo vystavovat zapisovatelné členy. Například IBlur vystavuje zapisovatelný Radius a Grow, IAlphaModulateFixed vystavuje zapisovatelný Amount a IAlphaBiLevel vystavuje zapisovatelný Threshold. Barevné efekty jako IDuotone vystavují mutable objekty IColorFormat.

Některé rozhraní operací, včetně IBrightnessContrast, IHSL, ITint a IAlphaReplace, neexponují své vytvářející skaláry jako zapisovatelné vlastnosti. Pro změnu těchto nastavení odstraňte operaci a přidejte novou na požadovanou pozici.

Efektivní data vrácená metodou GetEffective() jsou vypočítaná a pouze pro čtení. Hodí se k rozpoznání tématem závislých barev a ke čtení normalizovaných hodnot, které vykreslovací engine používá, ale nejsou dalším editovatelným povrchem. Následující příklad prochází řetězec a kontroluje efektivní hodnoty tam, kde API je poskytuje:

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

Efekty bez parametrů, jako odstín šedi, alfa ceiling a alfa inverse, stále mají objekt s efektivními daty, ale není co tisknout jako skalární nastavení. Jejich přítomnost a pozice v kolekci jsou důležité informace.

Odstraňte nebo vymažte transformace obrázku

Použijte IImageTransformOperationCollection.RemoveAt k odebrání jedné operace podle indexu. Protože se indexy po odebrání posouvají, nejprve najděte cílovou operaci a až po procházení ji odstraňte. Metodu Clear() použijte k odstranění celého řetězce.

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

Odstranění nebo vymazání transformací mění jen formátování obrázku. Neodstraňuje, nekomeprimuje ani jinak nemění znovu použité zdroje IPPImage.

Zvažte formáty prezentací a cílové exporty

Transformace obrázku pocházejí z DrawingML, takže PPTX je preferovaný editovatelný formát pro řetězce efektů. I v PPTX však nekaždá operace má stejnou přenositelnost:

  • Standardní operace DrawingML jako luminance, odstín šedi, duotón, tónování, HSL, rozostření a běžné alfa operace mají nejlepší šanci přežít PPTX round‑trip. Vždy po uložení souboru otevřete znovu a zkontrolujte kolekci, pokud je zachování požadováno.
  • BrightnessContrast je rozšíření Office 2010, nikoli standardní operace DrawingML luminance. Lze jej použít pro renderování v paměti, ale není zaručeno, že po uložení a opětovném otevření PPTX zůstane editovatelným IBrightnessContrast. Pro trvalé úpravy jasu a kontrastu upřednostněte AddLuminanceEffect.
  • Binární formát PPT předchází plnému modelu efektů DrawingML. Ukládání do PPT může vynechat nepodporované operace, zredukovat řetězec na podporovanou podmnožinu nebo aproximovat vzhled. Nepoužívejte PPT jako formát pro ověření komplexního editovatelného řetězce.
  • Renderování do PNG, JPEG, TIFF, PDF, SVG, HTML nebo jiných vizuálních výstupů použije podporovaný řetězec pro vytvořený vzhled. Tyto výstupy neobsahují editovatelnou IImageTransformOperationCollection; rastrové formáty výsledek zploští do pixelů a dokumentové/vektorové exporty ukládají vlastní reprezentaci renderování.
  • Efekty nečiní propojený obrázek samostatně uložitelným. Renderování propojeného obrázku stále závisí na dostupnosti propojeného zdroje při načítání prezentace.

Různí spotřebitelé prezentací mohou renderovat okrajové případy odlišně, zvláště když jsou kombinovány několik alfa nebo barevných kvantizačních operací. Pro kritické výstupy otestujte jak editovatelný round‑trip, tak finální exportní formát se stejnou verzí Aspose.Slides používanou ve výrobě.

Často kladené otázky

Mění efekty transformace obrázku vložená data obrázku?

Ne. Operace patří k ISlidesPicture používanému výplní obrázku. Bajty podkladového IPPImage zůstávají beze změny.

Budou dva rámečky obrázku, které používají stejný obrázek, sdílet své efekty?

Ne. Opakované použití IPPImage snižuje duplicitní data obrázku, ale každý rámeček obrázku má obvykle vlastní ISlidesPicture a vlastní kolekci transformací obrázku.

Lze kombinovat barevné, rozostřovací a alfa efekty?

Ano. Kolekce je přijímá v jednom řazeném řetězci. Zvažte, jak každá operace ovlivňuje výstup předchozí, protože operace náhrady a prahu mohou zrušit dřívější barevné nebo alfa detaily.

Proč jsou efektivní hodnoty pouze pro čtení?

Efektivní data představují vypočítané hodnoty použité pro renderování, včetně rozpoznaných barev. Upravit můžete operaci uloženou v kolekci transformací, pokud má zapisovatelné členy; jinak ji odstraňte a přidejte novou s novými parametry.

Jaký formát použít k zachování řetězce transformací?

Použijte PPTX a ověřte soubor jeho opětovným otevřením. Starší PPT nemůže reprezentovat celý model efektů DrawingML a renderované exportní formáty zachovávají pouze vzhled, ne editovatelné operace transformace.