Zarządzaj efektami przekształceń obrazu w prezentacjach za pomocą JavaScript

Przegląd

Aspose.Slides reprezentuje regulacje obrazu jako uporządkowaną kolekcję operacji przekształceń obrazu. Dla ramki obrazu zacznij od właściwości Picture ramki i uzyskaj dostęp do Picture.getImageTransform. Zwrócona ImageTransformOperationCollection pozwala na dołączanie, wyliczanie, przeglądanie, usuwanie i czyszczenie efektów bez przepisywania oryginalnych bajtów obrazu.

Ten artykuł prezentuje kompletny przepływ pracy dla jasności i kontrastu, transformacji kolorów, rozmycia, przezroczystości, uporządkowanych łańcuchów efektów, wartości skutecznych, usuwania oraz weryfikacji okrągłego przejścia PPTX.

Zrozumienie własności efektu i ponownego użycia obrazu

Zasób obrazu i obraz wyświetlany w ramce to różne obiekty:

  • PPImage przechowuje lub odwołuje się do danych źródłowego obrazu będących własnością prezentacji.
  • Picture należy do wypełnienia obrazu i odwołuje się do zasobu obrazu, jednocześnie przechowując kolekcję przekształceń obrazu.
  • PictureFrame jest kształtem slajdu, który posiada odpowiednie wypełnienie obrazu, geometrię, ustawienia przycięcia i inne formatowanie na poziomie ramki.

Dlatego operacje przekształceń obrazu nie modyfikują bajtów w PPImage. Gdy ten sam PPImage zostanie przekazany do ShapeCollection.addPictureFrame więcej niż raz, każda nowa ramka obrazu otrzymuje własny Picture i własną kolekcję przekształceń. Zastosowanie odcieni szarości do jednej ramki nie powoduje, że pozostałe ramki również stają się szare, mimo że wszystkie używają tego samego osadzonego zasobu obrazu.

Ten sam model Picture.getImageTransform jest także używany przez inne wypełnienia obrazu, takie jak kształt lub tło slajdu. Poniższe przykłady koncentrują się na ramkach obrazu.

Używaj prawidłowych zakresów parametrów i jednostek

Prezentowane metody używają następujących semantycznych zakresów i jednostek. Trzymaj się tych zakresów, nawet jeśli konkretna wersja biblioteki nie odrzuca od razu każdej wartości poza zakresem; docelowy format prezentacji może znormalizować, pominąć lub odrzucić nieprawidłowe dane podczas zapisu lub otwierania pliku w PowerPoint.

Operacja Parametry Poprawny zakres i jednostka
addBrightnessContrastEffect brightness, contrast -100 do 100, procent; 0 pozostawia komponent niezmieniony.
addGrayScaleEffect Brak Brak parametrów numerycznych. Alfa pozostaje niezmieniona.
addDuotoneEffect color1, color2 Dwa kolory dla ciemnych i jasnych pikseli. Kanały RGB i alfa w java.awt.Color używają wartości od 0 do 255.
addTintEffect hue, amount Odcień od 0 (włącznie) do 360 (wyłącznie), w stopniach; natężenie od -100 do 100, procent.
addHSLEffect hue, saturation, luminance Odcień od 0 (włącznie) do 360 (wyłącznie), w stopniach; nasycenie i luminancja od -100 do 100, procent.
addColorReplaceEffect color Kolor zamienny używa wartości kanałów od 0 do 255. Istniejące wartości alfa pozostają niezmienione.
addBlurEffect radius, grow Promień nieujemny, mierzony w punktach; grow to wartość logiczna określająca, czy rozmyta treść może wyjść poza oryginalne granice.
addAlphaModulateFixedEffect amount Nieujemny procent. Użyj 0 do 100 dla zwykłej regulacji nieprzezroczystości: 0 to w pełni przezroczyste, 100 zachowuje istniejącą alfę.
addAlphaReplaceEffect alpha 0 do 100, procent nieprzezroczystości.
addAlphaBiLevelEffect threshold 0 do 100, procentowy próg alfa. Wartości poniżej progu stają się przezroczyste; wartości równe lub wyższe – nieprzezroczyste.

Dla stałej modulacji alfa, przezroczystość i nieprzezroczystość są komplementarne. Przykładowo, 35% przezroczystości odpowiada modulacji alfa wynoszącej 65%.

Zastosuj jasność i kontrast

ImageTransformOperationCollection.addBrightnessContrastEffect zwraca operację BrightnessContrast. Jej ustawienia skalarne są podawane w momencie tworzenia operacji. BrightnessContrast.getEffective zwraca wyliczone wartości tylko do odczytu, które można przeglądać lub logować.

Poniższy przykład zwiększa jasność o 15% i kontrast o 20%, a następnie renderuje podgląd bez modyfikacji osadzonego obrazu:

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    let image;
    const sourceImage = aspose.slides.Images.fromFile("photo.png");
    try {
        image = presentation.getImages().addImage(sourceImage);
    } finally {
        sourceImage.dispose();
    }

    const pictureFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 50, 50, 400, 260, image);
    const imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
    const brightnessContrast = imageTransform.addBrightnessContrastEffect(15, 20);

    const effectiveValues = brightnessContrast.getEffective();
    console.log("Brightness: " + effectiveValues.getBrightness() + "%");
    console.log("Contrast: " + effectiveValues.getContrast() + "%");

    const preview = slide.getImage();
    try {
        preview.save("brightness-contrast-preview.png", aspose.slides.ImageFormat.Png);
    } finally {
        preview.dispose();
    }
} finally {
    presentation.dispose();
}

BrightnessContrast jest rozszerzeniem efektu obrazu z Office 2010 i jest mniej przenośny niż standardowy efekt luminancji DrawingML. Gdy jasność i kontrast muszą pozostać edytowalne po okrągłym przejściu PPTX, użyj ImageTransformOperationCollection.addLuminanceEffect i zweryfikuj wynik po ponownym otwarciu pliku. Sekcja ograniczeń formatów wyjaśnia tę różnicę szczegółowo.

Zastosuj transformacje kolorów

Efekty kolorystyczne mogą być stosowane niezależnie do różnych ramek obrazu, które używają tego samego zasobu obrazu. Poniższy przykład tworzy pięć ramek i aplikuje kolejno odcienie szarości, duoton, nalewkę, regulację HSL oraz zamianę koloru.

Duotone posiada dwa niezależnie edytowalne parametry koloru: color1 mapuje ciemne piksele, a color2 mapuje jasne piksele. To czyni go przydatnym przykładem efektu, którego ustawienia są bardziej złożone niż pojedyncza wartość skalarna.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    let image;
    const sourceImage = aspose.slides.Images.fromFile("photo.png");
    try {
        image = presentation.getImages().addImage(sourceImage);
    } finally {
        sourceImage.dispose();
    }

    const grayFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 20, 20, 180, 120, image);
    grayFrame.getPictureFormat().getPicture().getImageTransform().addGrayScaleEffect();

    const duotoneFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 220, 20, 180, 120, image);
    const duotone = duotoneFrame.getPictureFormat().getPicture().getImageTransform().addDuotoneEffect();
    duotone.getColor1().setColor(java.newInstanceSync("java.awt.Color", 0, 0, 128));
    duotone.getColor2().setColor(java.newInstanceSync("java.awt.Color", 255, 215, 0));

    const tintFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 420, 20, 180, 120, image);
    tintFrame.getPictureFormat().getPicture().getImageTransform().addTintEffect(210, 35);

    const hslFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 120, 170, 180, 120, image);
    hslFrame.getPictureFormat().getPicture().getImageTransform().addHSLEffect(30, 20, -10);

    const replacementFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 320, 170, 180, 120, image);
    const colorReplacement = replacementFrame.getPictureFormat().getPicture().getImageTransform().addColorReplaceEffect();
    colorReplacement.getColor().setColor(java.newInstanceSync("java.awt.Color", 100, 149, 237));

    presentation.save("color-transformations.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

addColorReplaceEffect zastępuje każdy piksel stałym kolorem, zachowując alfa. Różni się to od addColorChangeEffect, który mapuje jeden kolor źródłowy na inny i udostępnia oba formaty koloru źródłowego i docelowego.

Dodaj rozmycie, przezroczystość i efekty alfa

addBlurEffect wpływa na wszystkie kanały kolorów, w tym alfa. Ustaw grow na true, gdy rozmyta krawędź może wyjść poza pierwotne granice obrazu.

Aby uzyskać jednolitą przezroczystość, użyj addAlphaModulateFixedEffect. Mnoży ona każdą istniejącą wartość alfa, więc częściowo przezroczyste piksele pozostają proporcjonalnie różne. addAlphaReplaceEffect natomiast przypisuje jedną wartość alfa wszystkim pikselom. addAlphaBiLevelEffect konwertuje alfa na dwa poziomy w oparciu o określony próg.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    let image;
    const sourceImage = aspose.slides.Images.fromFile("photo.png");
    try {
        image = presentation.getImages().addImage(sourceImage);
    } finally {
        sourceImage.dispose();
    }

    const blurredFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 20, 20, 200, 140, image);
    const blur = blurredFrame.getPictureFormat().getPicture().getImageTransform().addBlurEffect(4.5, true);
    blur.setRadius(5);

    const transparentFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 240, 20, 200, 140, image);
    const alphaModulate = transparentFrame.getPictureFormat().getPicture().getImageTransform().addAlphaModulateFixedEffect(65);
    alphaModulate.setAmount(60);

    const uniformAlphaFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 20, 180, 200, 140, image);
    uniformAlphaFrame.getPictureFormat().getPicture().getImageTransform().addAlphaReplaceEffect(55);

    const binaryAlphaFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 240, 180, 200, 140, image);
    const alphaBiLevel = binaryAlphaFrame.getPictureFormat().getPicture().getImageTransform().addAlphaBiLevelEffect(50);
    alphaBiLevel.setThreshold(45);
    binaryAlphaFrame.getPictureFormat().getPicture().getImageTransform().addAlphaInverseEffect();

    presentation.save("blur-and-alpha-effects.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Inne operacje alfa nie wymagające parametrów to addAlphaCeilingEffect, które sprawia, że każda niezerowa alfa staje się w pełni nieprzezroczysta; addAlphaFloorEffect, które czyni każdą alfę poniżej 100 % w pełni przezroczystą; oraz addAlphaInverseEffect, które zmienia alfa na 100% - alpha.

Zbuduj uporządkowany łańcuch efektów

Każda metoda add...Effect dołącza nową operację na koniec kolekcji. Renderer używa kolekcji jako uporządkowanego potoku: wyjście operacji 0 staje się wejściem operacji 1 i tak dalej. W konsekwencji, te same operacje w innej kolejności mogą dać inny obraz.

Na przykład odcienie szarości, a potem nalewka najpierw usuwają informacje chromatyczne, a potem recolorują wynik luminancji. Nalewka przed odcieniami szarości usuwa nalewkę ponownie. Podobnie, zamiana alfa może nadpisać wartości alfa obliczone przez wcześniejsze operacje, podczas gdy modulacja alfa zachowuje ich względne różnice.

Poniższy przykład buduje łańcuch czterech operacji, zapisuje go jako PPTX, ponownie otwiera prezentację, sprawdza zarówno typy operacji, jak i ich kolejność, a następnie renderuje ponownie otwarty wynik:

const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    let image;
    const sourceImage = aspose.slides.Images.fromFile("photo.png");
    try {
        image = presentation.getImages().addImage(sourceImage);
    } finally {
        sourceImage.dispose();
    }

    const pictureFrame = slide.getShapes().addPictureFrame(aspose.slides.ShapeType.Rectangle, 50, 50, 400, 260, image);
    const imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
    imageTransform.addGrayScaleEffect();
    imageTransform.addTintEffect(220, 25);
    imageTransform.addBlurEffect(2.5, false);
    imageTransform.addAlphaModulateFixedEffect(80);

    presentation.save("image-transform-chain.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

const reopenedPresentation = new aspose.slides.Presentation("image-transform-chain.pptx");
try {
    const reopenedShape = reopenedPresentation.getSlides().get_Item(0).getShapes().get_Item(0);

    if (java.instanceOf(reopenedShape, "com.aspose.slides.IPictureFrame")) {
        const reopenedTransform = reopenedShape.getPictureFormat().getPicture().getImageTransform();
        const orderIsPreserved = reopenedTransform.size() === 4 &&
            java.instanceOf(reopenedTransform.get_Item(0), "com.aspose.slides.IGrayScale") &&
            java.instanceOf(reopenedTransform.get_Item(1), "com.aspose.slides.ITint") &&
            java.instanceOf(reopenedTransform.get_Item(2), "com.aspose.slides.IBlur") &&
            java.instanceOf(reopenedTransform.get_Item(3), "com.aspose.slides.IAlphaModulateFixed");
        console.log(orderIsPreserved ? "The effect chain was preserved." : "The effect chain changed during the round trip.");

        const renderedSlide = reopenedPresentation.getSlides().get_Item(0).getImage();
        try {
            renderedSlide.save("reopened-effect-chain.png", aspose.slides.ImageFormat.Png);
        } finally {
            renderedSlide.dispose();
        }
    } else {
        console.log("The reopened shape is not a picture frame.");
    }
} finally {
    reopenedPresentation.dispose();
}

Kolekcja nie narzuca macierzy kompatybilności, która ograniczałaby operacje koloru, alfa i rozmycia do osobnych łańcuchów. Mogą być one łączone, ale nie zawsze jest to użyteczne. Stała zamiana koloru usuwa zmienność RGB wytworzoną przez wcześniejsze efekty koloru; odcienie szarości po duotonie usuwają dwa wybrane kolory; a operacje alfa typu ceiling, floor, replacement lub bi‑level mogą odrzucić szczegóły alfa stworzone wcześniej. Buduj łańcuch zgodnie z pożądaną sekwencją przetwarzania pikseli, a nie jako nieuporządkowane flagi formatowania.

Przeglądaj edytowalne i skuteczne wartości

Edytowalna operacja to obiekt przechowywany w Picture.getImageTransform. W zależności od efektu może ona udostępniać bezpośrednio zapisywalne członki. Na przykład Blur udostępnia zapisywalne radius i grow, AlphaModulateFixed udostępnia zapisywalny amount, a AlphaBiLevel udostępnia zapisywalny threshold. Efekty koloru, takie jak Duotone, udostępniają mutowalne obiekty ColorFormat.

Niektóre operacje, w tym BrightnessContrast, HSL, Tint i AlphaReplace, nie udostępniają swoich scalarnych parametrów tworzenia jako zapisywalne właściwości. Aby zmienić te ustawienia, usuń operację i dodaj zamiennik w wymaganej pozycji.

Dane skuteczne zwracane przez getEffective() są obliczone i tylko do odczytu. Są przydatne do rozwiązywania zależności koloru od motywu oraz do odczytywania znormalizowanych wartości, które wykorzystuje renderer, ale nie są kolejną powierzchnią edycji. Poniższy przykład wylicza łańcuch i przegląda wartości skuteczne tam, gdzie odpowiednie API je udostępnia:

const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");

const presentation = new aspose.slides.Presentation("image-transform-chain.pptx");
try {
    const shapes = presentation.getSlides().get_Item(0).getShapes();
    let pictureFrame = null;

    for (let index = 0; index < shapes.size(); index++) {
        const shape = shapes.get_Item(index);
        if (java.instanceOf(shape, "com.aspose.slides.IPictureFrame")) {
            pictureFrame = shape;
            break;
        }
    }

    if (pictureFrame != null) {
        const imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();

        for (let index = 0; index < imageTransform.size(); index++) {
            const operation = imageTransform.get_Item(index);
            console.log(index + ": " + operation.getClass().getSimpleName());

            if (java.instanceOf(operation, "com.aspose.slides.IBrightnessContrast")) {
                const data = operation.getEffective();
                console.log("  Brightness: " + data.getBrightness());
                console.log("  Contrast: " + data.getContrast());
            } else if (java.instanceOf(operation, "com.aspose.slides.ILuminance")) {
                const data = operation.getEffective();
                console.log("  Brightness: " + data.getBrightness());
                console.log("  Contrast: " + data.getContrast());
            } else if (java.instanceOf(operation, "com.aspose.slides.IDuotone")) {
                const data = operation.getEffective();
                console.log("  Dark color: " + data.getColor1());
                console.log("  Light color: " + data.getColor2());
            } else if (java.instanceOf(operation, "com.aspose.slides.IColorReplace")) {
                const data = operation.getEffective();
                console.log("  Replacement color: " + data.getColor());
            } else if (java.instanceOf(operation, "com.aspose.slides.IHSL")) {
                const data = operation.getEffective();
                console.log("  HSL: " + data.getHue() + ", " + data.getSaturation() + ", " + data.getLuminance());
            } else if (java.instanceOf(operation, "com.aspose.slides.ITint")) {
                const data = operation.getEffective();
                console.log("  Tint: " + data.getHue() + ", " + data.getAmount());
            } else if (java.instanceOf(operation, "com.aspose.slides.IBlur")) {
                const data = operation.getEffective();
                console.log("  Blur radius: " + data.getRadius() + " pt");
            } else if (java.instanceOf(operation, "com.aspose.slides.IAlphaModulateFixed")) {
                const data = operation.getEffective();
                console.log("  Alpha amount: " + data.getAmount() + "%");
            } else if (java.instanceOf(operation, "com.aspose.slides.IAlphaReplace")) {
                const data = operation.getEffective();
                console.log("  Replacement alpha: " + data.getAlpha() + "%");
            } else if (java.instanceOf(operation, "com.aspose.slides.IAlphaBiLevel")) {
                const data = operation.getEffective();
                console.log("  Alpha threshold: " + data.getThreshold() + "%");
            }
        }
    }
} finally {
    presentation.dispose();
}

Efekty nie wymagające parametrów, takie jak odcienie szarości, alfa ceiling i alfa inverse, nadal mają obiekt danych skutecznych, ale nie mają skalarnych ustawień do wypisania. Ich obecność i pozycja w kolekcji to istotne informacje.

Usuń lub wyczyść przekształcenia obrazu

Użyj ImageTransformOperationCollection.removeAt aby usunąć jedną operację według indeksu. Ponieważ indeksy zmieniają się po usunięciu, najpierw wyszukaj docelową operację, a potem usuń ją po wyliczeniu. Użyj ImageTransformOperationCollection.clear aby usunąć cały łańcuch.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");

const presentation = new aspose.slides.Presentation("image-transform-chain.pptx");
try {
    const shapes = presentation.getSlides().get_Item(0).getShapes();
    let pictureFrame = null;

    for (let index = 0; index < shapes.size(); index++) {
        const shape = shapes.get_Item(index);
        if (java.instanceOf(shape, "com.aspose.slides.IPictureFrame")) {
            pictureFrame = shape;
            break;
        }
    }

    if (pictureFrame != null) {
        const imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
        let blurIndex = -1;

        for (let index = 0; index < imageTransform.size(); index++) {
            if (java.instanceOf(imageTransform.get_Item(index), "com.aspose.slides.IBlur")) {
                blurIndex = index;
                break;
            }
        }

        if (blurIndex >= 0) {
            imageTransform.removeAt(blurIndex);
            console.log("The blur operation was removed.");
        }

        imageTransform.clear();
        console.log("Remaining operations: " + imageTransform.size());
        presentation.save("image-transforms-cleared.pptx", aspose.slides.SaveFormat.Pptx);
    }
} finally {
    presentation.dispose();
}

Usunięcie lub wyczyszczenie przekształceń zmienia jedynie formatowanie obrazu. Nie usuwa, nie rekombinuje ani nie modyfikuje ponownie używanego zasobu PPImage.

Rozważ formaty prezentacji i cele eksportu

Przekształcenia obrazu pochodzą z DrawingML, więc PPTX jest preferowanym formatem edytowalnym dla łańcuchów efektów. Nawet w PPTX nie każda operacja ma identyczną przenośność:

  • Standardowe operacje DrawingML, takie jak luminancja, odcienie szarości, duoton, nalewka, HSL, rozmycie i typowe operacje alfa, mają największe szanse przetrwania okrągłego przejścia PPTX. Zawsze ponownie otwórz wygenerowany plik i sprawdź kolekcję, gdy wymagana jest zachowalność.
  • BrightnessContrast jest rozszerzeniem Office 2010, a nie standardową operacją luminancji DrawingML. Może być używany do renderowania w pamięci, ale nie ma gwarancji, że po zapisaniu i ponownym otwarciu PPTX pozostanie edytowalnym BrightnessContrast. Dla trwałych regulacji jasności i kontrastu preferuj addLuminanceEffect.
  • Binarny format PPT jest starszy niż pełny model efektów DrawingML. Zapis do PPT może pominąć nieobsługiwane operacje, zredukować łańcuch do obsługiwanego podzbioru lub przybliżyć wygląd. Nie używaj PPT jako formatu weryfikacji dla złożonych edytowalnych łańcuchów.
  • Renderowanie do PNG, JPEG, TIFF, PDF, SVG, HTML lub innych wyjść wizualnych stosuje obsługiwany łańcuch do wyglądu renderowanego. Te wyjścia nie zawierają edytowalnej ImageTransformOperationCollection; formaty rastrowe spłaszczają wynik w piksele, a eksporty dokumentów/wektorów przechowują własną reprezentację renderowania.
  • Efekty nie czynią połączonego obrazu samowystarczalnym. Renderowanie połączonego obrazu nadal wymaga dostępności połączonego zasobu w momencie ładowania prezentacji.

Różni konsumenci prezentacji mogą renderować przypadki brzegowe odmiennie, szczególnie gdy połączone są liczne operacje alfa lub kwantyzacji kolorów. Dla krytycznych wyników testuj zarówno edytowalny okrągły przejazd, jak i finalny format eksportu przy użyciu tej samej wersji Aspose.Slides, co w produkcji.

FAQ

Czy efekty przekształcenia obrazu modyfikują osadzone dane obrazu?

Nie. Operacje należą do Picture używanego przez wypełnienie obrazu. Podstawowe bajty PPImage pozostają niezmienione.

Czy dwie ramki obrazu, które używają tego samego obrazu, będą dzielić swoje efekty?

Nie. Ponowne użycie PPImage eliminuje duplikację danych obrazu, ale każda ramka obrazu ma zwykle odrębny Picture i własną kolekcję przekształceń obrazu.

Czy efekty koloru, rozmycia i alfa można łączyć?

Tak. Kolekcja przyjmuje je w jednym uporządkowanym łańcuchu. Rozważ, co każda operacja robi z wynikiem poprzedniej, ponieważ operacje zamiany i progowe mogą odrzucić wcześniejsze szczegóły koloru lub alfa.

Dlaczego wartości skuteczne są tylko do odczytu?

Dane skuteczne reprezentują wyliczone wartości używane do renderowania, w tym rozwiązane kolory. Edytuj operację przechowywaną w kolekcji przekształceń, gdzie istnieją zapisywalne członki; w przeciwnym razie usuń ją i dodaj zamiennik z nowymi parametrami tworzenia.

Jaki format powinienem używać, aby zachować łańcuch przekształceń?

Używaj PPTX i weryfikuj plik przez ponowne otwarcie. Starszy format PPT nie może przedstawić pełnego modelu efektów DrawingML, a formaty eksportu wizualnego zachowują jedynie wygląd, a nie edytowalne operacje przekształcenia.