Zarządzanie efektami przekształcenia obrazu w prezentacjach za pomocą PHP
Przegląd
Aspose.Slides przedstawia regulacje obrazu jako uporządkowaną kolekcję operacji przekształcenia obrazu. Dla ramki obrazu rozpocznij od Picture ramki i uzyskaj dostęp do Picture::getImageTransform. Zwrócona ImageTransformOperationCollection pozwala dodawać, wyliczać, przeglądać, usuwać i wyczyścić efekty bez przepisania oryginalnych bajtów obrazu.
Ten artykuł demonstruje kompletny przepływ pracy dla jasności i kontrastu, przekształceń kolorów, rozmycia, przezroczystości, uporządkowanych łańcuchów efektów, wartości efektywnych, usuwania oraz weryfikacji round‑trip PPTX.
Zrozumienie własności efektu i ponownego użycia obrazu
Zasób obrazu i obraz wyświetlający go 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łcenia 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 szarości do jednej ramki nie powoduje, że inne ramki stają się szare, mimo że wszystkie korzystają z tego samego wbudowanego zasobu obrazu.
Ten sam model Picture::getImageTransform jest również używany przez inne wypełnienia obrazów, takie jak kształt lub tło slajdu. Poniższe przykłady koncentrują się na ramach obrazu.
Używanie prawidłowych zakresów parametrów i jednostek
Prezentowane metody wykorzystują następujące semantyczne zakresy i jednostki. Trzymaj wartości w tych zakresach, nawet jeśli konkretna wersja biblioteki nie odrzuca od razu każdej nieprawidłowej wartości; docelowy format prezentacji może normalizować, pomijać lub odrzucać nieprawidłowe dane podczas zapisu lub otwierania pliku w PowerPoint.
| Operation | Parameters | Valid range and unit |
|---|---|---|
| addLuminanceEffect | brightness, contrast |
-100‑100, procent; 0 pozostawia komponent niezmieniony. |
| addGrayScaleEffect | None | Brak parametrów liczbowych. Alfa pozostaje niezmieniona. |
| addDuotoneEffect | color1, color2 |
Dwa kolory dla ciemnych i jasnych pikseli. Kanały RGB i alfa w java.awt.Color używają zakresu 0‑255. |
| addTintEffect | hue, amount |
Odcień 0 (włącznie)‑360 (wyłącznie) stopni; ilość -100‑100, procent. |
| addHSLEffect | hue, saturation, luminance |
Odcień 0‑360 stopni; nasycenie i luminancja -100‑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ść Boolean określająca, czy rozmyta treść może wyjść poza pierwotne granice. |
| addAlphaModulateFixedEffect | amount |
Nieujemny procent. Użyj 0‑100 do typowego skalowania nieprzezroczystości: 0 to w pełni przezroczyste, 100 zachowuje istniejącą alfę. |
| addAlphaReplaceEffect | alpha |
0‑100, procent nieprzezroczystości. |
| addAlphaBiLevelEffect | threshold |
0‑100, procentowy próg alfy. Wartości poniżej progu stają się przezroczyste; wartości równe lub powyżej stają się nieprzezroczyste. |
Dla stałej modulacji alfa, przezroczystość i nieprzezroczystość są komplementarne. Na przykład 35 % przezroczystości odpowiada modulacji alfa o wartości 65 %.
Zastosowanie jasności i kontrastu
ImageTransformOperationCollection::addLuminanceEffect zwraca operację Luminance. Jej ustawienia skalarne są podawane w momencie tworzenia operacji. Luminance::getEffective zwraca wyliczone wartości tylko do odczytu, które można przejrzeć lub zalogować.
Poniższy przykład zwiększa jasność o 15 % i kontrast o 20 %, a następnie renderuje podgląd bez modyfikacji wbudowanego obrazu:
use aspose\slides\ImageFormat;
use aspose\slides\Images;
use aspose\slides\Presentation;
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, 50, 50, 400, 260, $image);
$imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
$luminance = $imageTransform->addLuminanceEffect(15, 20);
$effectiveValues = $luminance->getEffective();
echo "Brightness: " . java_values($effectiveValues->getBrightness()) . "%" . PHP_EOL;
echo "Contrast: " . java_values($effectiveValues->getContrast()) . "%" . PHP_EOL;
$preview = $slide->getImage();
try {
$preview->save("brightness-contrast-preview.png", ImageFormat::Png);
} finally {
if (!java_is_null($preview)) {
$preview->dispose();
}
}
} finally {
$presentation->dispose();
}
Luminance to standardowy efekt jasności i kontrastu w DrawingML. Gdy te ustawienia muszą pozostać edytowalne po round‑trip PPTX, otwórz ponownie zapisaną prezentację i zweryfikuj zarówno typ operacji, jak i jej wartości efektywne.
Zastosowanie przekształceń kolorów
Efekty kolorystyczne można nakładać niezależnie na różne ramki obrazu, które korzystają z jednego zasobu obrazu. Poniższy przykład tworzy pięć ramek i stosuje kolejno szarość, duoton, odcień, regulację HSL i zamianę koloru.
Duotone zawiera dwa niezależnie edytowalne parametry koloru: color1 mapuje ciemne piksele, natomiast color2 mapuje jasne piksele. To użyteczny przykład efektu, którego ustawienia są bardziej złożone niż pojedyncza wartość skalarna.
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.png");
try {
$image = $presentation->getImages()->addImage($sourceImage);
} finally {
if (!java_is_null($sourceImage)) {
$sourceImage->dispose();
}
}
$grayFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 20, 20, 180, 120, $image);
$grayFrame->getPictureFormat()->getPicture()->getImageTransform()->addGrayScaleEffect();
$duotoneFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 220, 20, 180, 120, $image);
$duotone = $duotoneFrame->getPictureFormat()->getPicture()->getImageTransform()->addDuotoneEffect();
$duotone->getColor1()->setColor(new Java("java.awt.Color", 0, 0, 128));
$duotone->getColor2()->setColor(new Java("java.awt.Color", 255, 215, 0));
$tintFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 420, 20, 180, 120, $image);
$tintFrame->getPictureFormat()->getPicture()->getImageTransform()->addTintEffect(210, 35);
$hslFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 120, 170, 180, 120, $image);
$hslFrame->getPictureFormat()->getPicture()->getImageTransform()->addHSLEffect(30, 20, -10);
$replacementFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 320, 170, 180, 120, $image);
$colorReplacement = $replacementFrame->getPictureFormat()->getPicture()->getImageTransform()->addColorReplaceEffect();
$colorReplacement->getColor()->setColor(new Java("java.awt.Color", 100, 149, 237));
$presentation->save("color-transformations.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
addColorReplaceEffect zastępuje kolor każdego piksela jednym stałym kolorem, zachowując alfę. Różni się od addColorChangeEffect, które mapuje jeden kolor źródłowy na inny i udostępnia zarówno formaty koloru źródłowego, jak i docelowego.
Dodawanie rozmycia, przezroczystości i efektów alfa
addBlurEffect wpływa na wszystkie kanały kolorów, w tym alfy. Ustaw grow na true, gdy rozmyta krawędź może wyjść poza pierwotne granice obrazu.
Do jednolitej przezroczystości użyj addAlphaModulateFixedEffect. Mnoży ona każdą istniejącą wartość alfy, więc częściowo przezroczyste piksele pozostają proporcjonalnie różne. addAlphaReplaceEffect natomiast przypisuje jedną wartość alfy wszystkim pikselom. addAlphaBiLevelEffect konwertuje alfę na dwa poziomy w oparciu o podany próg.
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.png");
try {
$image = $presentation->getImages()->addImage($sourceImage);
} finally {
if (!java_is_null($sourceImage)) {
$sourceImage->dispose();
}
}
$blurredFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 20, 20, 200, 140, $image);
$blur = $blurredFrame->getPictureFormat()->getPicture()->getImageTransform()->addBlurEffect(4.5, true);
$blur->setRadius(5);
$transparentFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 240, 20, 200, 140, $image);
$alphaModulate = $transparentFrame->getPictureFormat()->getPicture()->getImageTransform()->addAlphaModulateFixedEffect(65);
$alphaModulate->setAmount(60);
$uniformAlphaFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 20, 180, 200, 140, $image);
$uniformAlphaFrame->getPictureFormat()->getPicture()->getImageTransform()->addAlphaReplaceEffect(55);
$binaryAlphaFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 240, 180, 200, 140, $image);
$alphaBiLevel = $binaryAlphaFrame->getPictureFormat()->getPicture()->getImageTransform()->addAlphaBiLevelEffect(50);
$alphaBiLevel->setThreshold(45);
$binaryAlphaFrame->getPictureFormat()->getPicture()->getImageTransform()->addAlphaInverseEffect();
$presentation->save("blur-and-alpha-effects.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Inne operacje alfa bez parametrów obejmują 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 alfę na 100% - alpha.
Budowanie uporządkowanego łańcucha efektów
Każda metoda add...Effect dołącza nową operację na koniec kolekcji. Renderujący 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ą dawać inny obraz.
Na przykład szarość, a potem odcień najpierw usuwa informacje chromatyczne, a potem recoloruje wynik luminancji. Odcień, a potem szarość ponownie usuwa odcień. Podobnie zamiana alfy może nadpisać wartości alfy obliczone przez wcześniejsze operacje, podczas gdy modulacja alfy 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ść, oraz renderuje ponownie otwarty wynik:
use aspose\slides\ImageFormat;
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.png");
try {
$image = $presentation->getImages()->addImage($sourceImage);
} finally {
if (!java_is_null($sourceImage)) {
$sourceImage->dispose();
}
}
$pictureFrame = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 50, 400, 260, $image);
$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", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
$reopenedPresentation = new Presentation("image-transform-chain.pptx");
try {
$reopenedShape = $reopenedPresentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
if (java_instanceof($reopenedShape, new JavaClass("com.aspose.slides.PictureFrame"))) {
$reopenedTransform = $reopenedShape->getPictureFormat()->getPicture()->getImageTransform();
$orderIsPreserved = java_values($reopenedTransform->size()) === 4 &&
java_instanceof($reopenedTransform->get_Item(0), new JavaClass("com.aspose.slides.GrayScale")) &&
java_instanceof($reopenedTransform->get_Item(1), new JavaClass("com.aspose.slides.Tint")) &&
java_instanceof($reopenedTransform->get_Item(2), new JavaClass("com.aspose.slides.Blur")) &&
java_instanceof($reopenedTransform->get_Item(3), new JavaClass("com.aspose.slides.AlphaModulateFixed"));
echo $orderIsPreserved ? "The effect chain was preserved." : "The effect chain changed during the round trip.";
$renderedSlide = $reopenedPresentation->getSlides()->get_Item(0)->getImage();
try {
$renderedSlide->save("reopened-effect-chain.png", ImageFormat::Png);
} finally {
if (!java_is_null($renderedSlide)) {
$renderedSlide->dispose();
}
}
} else {
echo "The reopened shape is not a picture frame.";
}
} finally {
$reopenedPresentation->dispose();
}
Kolekcja nie narzuca macierzy kompatybilności, która ogranicza operacje koloru, alfy i rozmycia do oddzielnych łańcuchów. Mogą być łączone, ale kombinacje nie zawsze są użyteczne. Stała zamiana koloru usuwa wariację RGB wytworzoną przez wcześniejsze efekty kolorystyczne; szarość po duotonie usuwa dwa wybrane kolory; a operacje alfa typu ceiling, floor, replace lub bi‑level mogą odrzucić szczegóły alfy stworzone wcześniej. Buduj łańcuch zgodnie z pożądaną sekwencją przetwarzania pikseli, a nie traktuj elementów jako nieuporządkowane flagi formatowania.
Inspekcja wartości edytowalnych i efektywnych
Edytowalna operacja to obiekt przechowywany w Picture::getImageTransform. W zależności od efektu może ona bezpośrednio udostępniać zapisywalne pola. Na przykład Blur udostępnia zapisywalne radius i grow, AlphaModulateFixed udostępnia zapisywalny amount, a AlphaBiLevel udostępnia zapisywalny threshold. Efekty kolorystyczne, takie jak Duotone, udostępniają zmienne obiekty ColorFormat.
Niektóre operacje, w tym Luminance, HSL, Tint i AlphaReplace, nie udostępniają swoich skalarów tworzenia jako zapisywalnych własności. Aby zmienić te ustawienia, usuń operację i dodaj zamiennik w wymaganej pozycji.
Dane efektywne zwracane przez getEffective() są wyliczone i tylko do odczytu. Są przydatne do rozwiązywania zależności od tematu i odczytywania znormalizowanych wartości używanych przez renderujący, ale nie stanowią dodatkowej powierzchni edycji. Poniższy przykład wylicza łańcuch i inspekcjonuje wartości efektywne tam, gdzie odpowiednie API je udostępnia:
use aspose\slides\Presentation;
$presentation = new Presentation("image-transform-chain.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) {
$imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
$effectCount = java_values($imageTransform->size());
for ($index = 0; $index < $effectCount; $index++) {
$operation = $imageTransform->get_Item($index);
echo $index . ": " . java_values($operation->getClass()->getSimpleName()) . PHP_EOL;
if (java_instanceof($operation, new JavaClass("com.aspose.slides.Luminance"))) {
$data = $operation->getEffective();
echo " Brightness: " . java_values($data->getBrightness()) . PHP_EOL;
echo " Contrast: " . java_values($data->getContrast()) . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.Duotone"))) {
$data = $operation->getEffective();
echo " Dark color: " . java_values($data->getColor1()->toString()) . PHP_EOL;
echo " Light color: " . java_values($data->getColor2()->toString()) . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.ColorReplace"))) {
$data = $operation->getEffective();
echo " Replacement color: " . java_values($data->getColor()->toString()) . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.HSL"))) {
$data = $operation->getEffective();
echo " HSL: " . java_values($data->getHue()) . ", " . java_values($data->getSaturation()) . ", " . java_values($data->getLuminance()) . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.Tint"))) {
$data = $operation->getEffective();
echo " Tint: " . java_values($data->getHue()) . ", " . java_values($data->getAmount()) . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.Blur"))) {
$data = $operation->getEffective();
echo " Blur radius: " . java_values($data->getRadius()) . " pt" . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.AlphaModulateFixed"))) {
$data = $operation->getEffective();
echo " Alpha amount: " . java_values($data->getAmount()) . "%" . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.AlphaReplace"))) {
$data = $operation->getEffective();
echo " Replacement alpha: " . java_values($data->getAlpha()) . "%" . PHP_EOL;
} elseif (java_instanceof($operation, new JavaClass("com.aspose.slides.AlphaBiLevel"))) {
$data = $operation->getEffective();
echo " Alpha threshold: " . java_values($data->getThreshold()) . "%" . PHP_EOL;
}
}
}
} finally {
$presentation->dispose();
}
Efekty bez parametrów, takie jak szarość, alfa ceiling i alfa inverse, nadal mają obiekt danych efektywnych, ale nie mają skalarnych ustawień do wydrukowania. Ich obecność i pozycja w kolekcji są istotną informacją.
Usuwanie lub czyszczenie przekształceń 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.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("image-transform-chain.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) {
$imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
$effectCount = java_values($imageTransform->size());
$blurIndex = -1;
for ($index = 0; $index < $effectCount; $index++) {
if (java_instanceof($imageTransform->get_Item($index), new JavaClass("com.aspose.slides.Blur"))) {
$blurIndex = $index;
break;
}
}
if ($blurIndex >= 0) {
$imageTransform->removeAt($blurIndex);
echo "The blur operation was removed." . PHP_EOL;
}
$imageTransform->clear();
echo "Remaining operations: " . java_values($imageTransform->size()) . PHP_EOL;
$presentation->save("image-transforms-cleared.pptx", SaveFormat::Pptx);
}
} finally {
$presentation->dispose();
}
Usunięcie lub wyczyszczenie przekształceń zmienia tylko formatowanie obrazu. Nie usuwa, nie kompresuje ani nie modyfikuje ponownie używanego zasobu PPImage.
Rozważanie formatów prezentacji i docelowych formatów eksportu
Przekształcenia obrazu pochodzą z DrawingML, więc PPTX jest preferowanym edytowalnym formatem dla łańcuchów efektów. Nawet w PPTX nie każda operacja ma identyczną przenośność:
- Standardowe operacje DrawingML, takie jak luminancja, szarość, duoton, odcień, HSL, rozmycie i typowe operacje alfa, mają największe szanse przetrwania round‑trip PPTX. Zawsze ponownie otwieraj wygenerowany plik i inspekcjonuj kolekcję, gdy zachowanie jest wymogiem.
- Binarny format PPT powstał przed pełnym modelem efektów DrawingML. Zapis do PPT może pomijać nieobsługiwane operacje, redukować łańcuch do obsługiwanego podzestawu lub przybliżać wygląd. Nie używaj PPT jako formatu weryfikacji dla złożonego edytowalnego łańcucha.
- Renderowanie do PNG, JPEG, TIFF, PDF, SVG, HTML lub innych formatów wizualnych stosuje obsługiwany łańcuch do wyglądu wynikowego. Te wyjścia nie zawierają edytowalnego
ImageTransformOperationCollection; formaty rastrowe spłaszczają wynik do pikseli, a eksporty dokumentów lub wektorów przechowują własną reprezentację renderingu. - Efekty nie czynią połączonego obrazu samowystarczalnym. Renderowanie połączonego obrazu nadal zależy od dostępności połączonego zasobu w momencie ładowania prezentacji.
Różni konsumenci prezentacji mogą renderować przypadki brzegowe inaczej, zwłaszcza gdy połączone są liczne operacje alfa lub kwantyzacji kolorów. Dla krytycznych wyjść przetestuj zarówno edytowalny round‑trip, jak i ostateczny format eksportu przy użyciu tej samej wersji Aspose.Slides, co w produkcji.
FAQ
Czy efekty przekształcenia obrazu modyfikują dane wbudowanego obrazu?
Nie. Operacje należą do Picture używanego przez wypełnienie obrazu. Podstawowe bajty PPImage pozostają niezmienione.
Czy dwa ramki obrazu, które używają tego samego obrazu, współdzielą swoje efekty?
Nie. Ponowne użycie PPImage eliminuje duplikację danych obrazu, ale każda ramka obrazu zazwyczaj ma osobny Picture i własną kolekcję przekształceń obrazu.
Czy efekty koloru, rozmycia i alfy mogą być łączone?
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ą odrzucać wcześniejsze szczegóły koloru lub alfy.
Dlaczego wartości efektywne są tylko do odczytu?
Dane efektywne reprezentują wyliczone wartości używane do renderowania, w tym rozwiązywane kolory. Edytuj operację przechowywaną w kolekcji przekształceń, gdzie istnieją zapisywalne pola; 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 ponownym otwarciem. Starszy format PPT nie może przedstawić pełnego modelu efektów DrawingML, a formaty eksportu graficznego zachowują jedynie wygląd, nie edytowalne operacje przekształcenia.