Gestire gli effetti di trasformazione immagine nelle presentazioni su Android
Panoramica
Aspose.Slides rappresenta le regolazioni delle immagini come una collezione ordinata di operazioni di trasformazione dell’immagine. Per un riquadro immagine, inizia con il frame’s ISlidesPicture e accedi a ISlidesPicture.getImageTransform. La IImageTransformOperationCollection restituita ti consente di aggiungere, enumerare, ispezionare, rimuovere e cancellare gli effetti senza riscrivere i byte dell’immagine originale.
Questo articolo dimostra un flusso di lavoro completo per luminosità e contrasto, trasformazioni di colore, sfocatura, trasparenza, catene di effetti ordinate, valori efficaci, rimozione e verifica round‑trip PPTX.
Comprendere la proprietà degli effetti e il riutilizzo delle immagini
Una risorsa immagine e l’immagine che la visualizza sono oggetti diversi:
- IPPImage memorizza o fa riferimento ai dati dell’immagine sorgente posseduti dalla presentazione.
- ISlidesPicture appartiene a un riempimento immagine e fa riferimento a una risorsa immagine mantenendo la collezione di trasformazioni dell’immagine.
- IPictureFrame è la forma della diapositiva che possiede il relativo riempimento immagine, la geometria, le impostazioni di ritaglio e altri formati a livello di frame.
Pertanto, le operazioni di trasformazione dell’immagine non modificano i byte in IPPImage. Quando lo stesso IPPImage viene passato a IShapeCollection.addPictureFrame più di una volta, ogni nuovo riquadro immagine riceve il proprio ISlidesPicture e la propria collezione di trasformazioni. Applicare la scala di grigi a un frame non rende gli altri frame in scala di grigi, anche se tutti riutilizzano la stessa risorsa immagine incorporata.
Lo stesso modello ISlidesPicture.getImageTransform è utilizzato anche da altri riempimenti immagine, come una forma o lo sfondo della diapositiva. Gli esempi seguenti si concentrano sui riquadri immagine.
Utilizzare intervalli di parametri e unità validi
I metodi dimostrati usano i seguenti intervalli semantici e unità. Mantieni i valori in questi intervalli anche se una versione particolare della libreria non rifiuta immediatamente ogni valore fuori intervallo; il formato di destinazione della presentazione potrebbe normalizzare, omettere o rifiutare dati non validi durante il salvataggio o quando PowerPoint apre il file.
| Operazione | Parametri | Intervallo valido e unità |
|---|---|---|
| addBrightnessContrastEffect | brightness, contrast |
da -100 a 100, percentuale; 0 lascia il componente invariato. |
| addGrayScaleEffect | Nessuno | Nessun parametro numerico. L’alpha rimane invariato. |
| addDuotoneEffect | color1, color2 |
Due colori per pixel scuri e chiari. I valori RGB e del canale alpha usati da android.graphics.Color vanno da 0 a 255. |
| addTintEffect | hue, amount |
Hue è da 0 (incluso) a 360 (escluso), in gradi; amount è da -100 a 100, percentuale. |
| addHSLEffect | hue, saturation, luminance |
Hue è da 0 (incluso) a 360 (escluso), in gradi; saturazione e luminanza sono da -100 a 100, percentuale. |
| addColorReplaceEffect | color |
Il colore di sostituzione utilizza valori di canale da 0 a 255. I valori alpha esistenti rimangono invariati. |
| addBlurEffect | radius, grow |
Il raggio è non negativo e misurato in punti; grow è un Boolean che controlla se il contenuto sfocato può estendersi oltre i limiti originali. |
| addAlphaModulateFixedEffect | amount |
Percentuale non negativa. Usa 0 a 100 per una normale scala di opacità: 0 è totalmente trasparente e 100 preserva l’alpha esistente. |
| addAlphaReplaceEffect | alpha |
Da 0 a 100, percentuale di opacità. |
| addAlphaBiLevelEffect | threshold |
Da 0 a 100, percentuale di soglia alpha. I valori al di sotto diventano trasparenti; i valori pari o superiori diventano opachi. |
Per la modulazione alpha fissa, trasparenza e opacità sono complementari. Ad esempio, il 35% di trasparenza corrisponde a una modulazione alpha del 65%.
Applicare luminosità e contrasto
IImageTransformOperationCollection.addBrightnessContrastEffect restituisce un’operazione IBrightnessContrast. Le sue impostazioni scalari sono fornite quando l’operazione è creata. IBrightnessContrast.getEffective restituisce valori calcolati in sola lettura che possono essere ispezionati o registrati.
L’esempio seguente aumenta la luminosità del 15% e il contrasto del 20%, quindi genera un’anteprima senza modificare l’immagine incorporata:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.png");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 400, 260, image);
IImageTransformOperationCollection imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
IBrightnessContrast brightnessContrast = imageTransform.addBrightnessContrastEffect(15f, 20f);
IBrightnessContrastEffectiveData effectiveValues = brightnessContrast.getEffective();
System.out.println("Brightness: " + effectiveValues.getBrightness() + "%");
System.out.println("Contrast: " + effectiveValues.getContrast() + "%");
IImage preview = slide.getImage();
try {
preview.save("brightness-contrast-preview.png", ImageFormat.Png);
} finally {
preview.dispose();
}
} finally {
presentation.dispose();
}
BrightnessContrast è un’estensione degli effetti immagine Office 2010 ed è meno portabile dell’effetto di luminanza standard DrawingML. Quando luminosità e contrasto devono rimanere modificabili dopo un round‑trip PPTX, usa IImageTransformOperationCollection.addLuminanceEffect e verifica il risultato dopo aver riaperto il file. La sezione limitazioni del formato spiega questa distinzione in maggior dettaglio.
Applicare trasformazioni di colore
Gli effetti colore possono essere applicati in modo indipendente a diversi riquadri immagine che riutilizzano la stessa risorsa immagine. L’esempio seguente crea cinque frame e applica scala di grigi, duotone, tinta, regolazione HSL e sostituzione colore.
IDuotone contiene due parametri colore modificabili in modo indipendente: color1 mappa i pixel scuri, mentre color2 mappa i pixel chiari. Questo lo rende un esempio utile di effetto le cui impostazioni sono più complesse di un singolo valore scalare.
import com.aspose.slides.*;
import android.graphics.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.png");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame grayFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 180, 120, image);
grayFrame.getPictureFormat().getPicture().getImageTransform().addGrayScaleEffect();
IPictureFrame duotoneFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 220, 20, 180, 120, image);
IDuotone duotone = duotoneFrame.getPictureFormat().getPicture().getImageTransform().addDuotoneEffect();
duotone.getColor1().setColor(Color.rgb(0, 0, 128));
duotone.getColor2().setColor(Color.rgb(255, 215, 0));
IPictureFrame tintFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 420, 20, 180, 120, image);
tintFrame.getPictureFormat().getPicture().getImageTransform().addTintEffect(210f, 35f);
IPictureFrame hslFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 120, 170, 180, 120, image);
hslFrame.getPictureFormat().getPicture().getImageTransform().addHSLEffect(30f, 20f, -10f);
IPictureFrame replacementFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 320, 170, 180, 120, image);
IColorReplace colorReplacement = replacementFrame.getPictureFormat().getPicture().getImageTransform().addColorReplaceEffect();
colorReplacement.getColor().setColor(Color.rgb(100, 149, 237));
presentation.save("color-transformations.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
addColorReplaceEffect sostituisce il colore di ogni pixel con un colore fisso preservando l’alpha. È diverso da addColorChangeEffect che mappa un colore sorgente a un altro ed espone i formati sia del colore sorgente sia di quello di destinazione.
Aggiungere effetto sfocatura, trasparenza e alfa
addBlurEffect influisce su tutti i canali colore, incluso alpha. Imposta grow a true quando il bordo sfocato può estendersi oltre i limiti originali dell’immagine.
Per una trasparenza uniforme, usa addAlphaModulateFixedEffect. Moltiplica ogni valore alpha esistente, così i pixel parzialmente trasparenti rimangono proporzionalmente diversi. addAlphaReplaceEffect invece assegna un unico valore alpha a tutti i pixel. addAlphaBiLevelEffect converte l’alpha in due livelli basati su una soglia.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.png");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame blurredFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 200, 140, image);
IBlur blur = blurredFrame.getPictureFormat().getPicture().getImageTransform().addBlurEffect(4.5, true);
blur.setRadius(5);
IPictureFrame transparentFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 240, 20, 200, 140, image);
IAlphaModulateFixed alphaModulate = transparentFrame.getPictureFormat().getPicture().getImageTransform().addAlphaModulateFixedEffect(65f);
alphaModulate.setAmount(60f);
IPictureFrame uniformAlphaFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 180, 200, 140, image);
uniformAlphaFrame.getPictureFormat().getPicture().getImageTransform().addAlphaReplaceEffect(55f);
IPictureFrame binaryAlphaFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 240, 180, 200, 140, image);
IAlphaBiLevel alphaBiLevel = binaryAlphaFrame.getPictureFormat().getPicture().getImageTransform().addAlphaBiLevelEffect(50f);
alphaBiLevel.setThreshold(45f);
binaryAlphaFrame.getPictureFormat().getPicture().getImageTransform().addAlphaInverseEffect();
presentation.save("blur-and-alpha-effects.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Altre operazioni alpha senza parametri includono addAlphaCeilingEffect che rende ogni alpha diverso da zero completamente opaco; addAlphaFloorEffect che rende ogni alpha al di sotto del 100% totalmente trasparente; e addAlphaInverseEffect che cambia alpha in 100% - alpha.
Costruire una catena di effetti ordinata
Ogni metodo add...Effect aggiunge una nuova operazione alla fine della collezione. Il renderer utilizza la collezione come pipeline ordinata: l’output dell’operazione 0 diventa l’input dell’operazione 1 e così via. Di conseguenza, le stesse operazioni in un ordine diverso possono produrre un’immagine differente.
Ad esempio, scala di grigi seguita da tinta rimuove prima le informazioni cromatiche e poi riccola la luminanza risultante. Tinta seguita da scala di grigi rimuove nuovamente la tinta. Analogamente, la sostituzione alpha può sovrascrivere i valori alpha calcolati dalle operazioni precedenti, mentre la modulazione alpha preserva le loro differenze relative.
L’esempio seguente costruisce una catena di quattro operazioni, la salva come PPTX, riapre la presentazione, verifica sia i tipi di operazione sia il loro ordine e rende il risultato riaperto:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.png");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 400, 260, image);
IImageTransformOperationCollection imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
imageTransform.addGrayScaleEffect();
imageTransform.addTintEffect(220f, 25f);
imageTransform.addBlurEffect(2.5, false);
imageTransform.addAlphaModulateFixedEffect(80f);
presentation.save("image-transform-chain.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Presentation reopenedPresentation = new Presentation("image-transform-chain.pptx");
try {
IShape reopenedShape = reopenedPresentation.getSlides().get_Item(0).getShapes().get_Item(0);
if (reopenedShape instanceof IPictureFrame) {
IPictureFrame reopenedFrame = (IPictureFrame) reopenedShape;
IImageTransformOperationCollection reopenedTransform = reopenedFrame.getPictureFormat().getPicture().getImageTransform();
boolean orderIsPreserved = reopenedTransform.size() == 4 &&
reopenedTransform.get_Item(0) instanceof IGrayScale &&
reopenedTransform.get_Item(1) instanceof ITint &&
reopenedTransform.get_Item(2) instanceof IBlur &&
reopenedTransform.get_Item(3) instanceof IAlphaModulateFixed;
System.out.println(orderIsPreserved ? "The effect chain was preserved." : "The effect chain changed during the round trip.");
IImage renderedSlide = reopenedPresentation.getSlides().get_Item(0).getImage();
try {
renderedSlide.save("reopened-effect-chain.png", ImageFormat.Png);
} finally {
renderedSlide.dispose();
}
} else {
System.out.println("The reopened shape is not a picture frame.");
}
} finally {
reopenedPresentation.dispose();
}
La collezione non impone una matrice di compatibilità che limiti le operazioni di colore, alpha e sfocatura a catene separate. Possono essere combinate, ma le combinazioni non sono sempre utili. Una sostituzione colore fissa rimuove la variazione RGB prodotta da effetti colore precedenti; la scala di grigi dopo duotone rimuove i due colori selezionati; e le operazioni alpha ceiling, floor, replace o bi‑level possono scartare i dettagli alpha creati in precedenza. Costruisci la catena secondo la sequenza di elaborazione pixel desiderata, invece di trattare i suoi elementi come flag di formattazione non ordinati.
Ispezionare valori modificabili ed efficaci
Un’operazione modificabile è l’oggetto memorizzato in ISlidesPicture.getImageTransform. A seconda dell’effetto, può esporre membri scrivibili direttamente. Ad esempio, IBlur espone valori scrivibili radius e grow, IAlphaModulateFixed espone un valore scrivibile amount, e IAlphaBiLevel espone un valore scrivibile threshold. Gli effetti colore come IDuotone espongono oggetti IColorFormat mutabili.
Alcune interfacce operative, inclusi IBrightnessContrast, IHSL, ITint e IAlphaReplace, non espongono i loro scalari di creazione come proprietà scrivibili. Per cambiare quelle impostazioni, rimuovi l’operazione e aggiungi una sostituzione nella posizione richiesta.
I dati efficaci restituiti da getEffective() sono calcolati e in sola lettura. Sono utili per risolvere i colori dipendenti dal tema e per leggere i valori normalizzati utilizzati dal renderer, ma non costituiscono un altro livello di modifica. L’esempio seguente enumera la catena e ispeziona i valori efficaci dove l’API corrispondente li fornisce:
import com.aspose.slides.*;
Presentation presentation = new Presentation("image-transform-chain.pptx");
try {
IPictureFrame pictureFrame = null;
for (IShape shape : presentation.getSlides().get_Item(0).getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
IImageTransformOperationCollection imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
for (int index = 0; index < imageTransform.size(); index++) {
IImageTransformOperation operation = imageTransform.get_Item(index);
System.out.println(index + ": " + operation.getClass().getSimpleName());
if (operation instanceof IBrightnessContrast) {
IBrightnessContrastEffectiveData data = ((IBrightnessContrast) operation).getEffective();
System.out.println(" Brightness: " + data.getBrightness());
System.out.println(" Contrast: " + data.getContrast());
} else if (operation instanceof ILuminance) {
ILuminanceEffectiveData data = ((ILuminance) operation).getEffective();
System.out.println(" Brightness: " + data.getBrightness());
System.out.println(" Contrast: " + data.getContrast());
} else if (operation instanceof IDuotone) {
IDuotoneEffectiveData data = ((IDuotone) operation).getEffective();
System.out.println(" Dark color: " + data.getColor1());
System.out.println(" Light color: " + data.getColor2());
} else if (operation instanceof IColorReplace) {
IColorReplaceEffectiveData data = ((IColorReplace) operation).getEffective();
System.out.println(" Replacement color: " + data.getColor());
} else if (operation instanceof IHSL) {
IHSLEffectiveData data = ((IHSL) operation).getEffective();
System.out.println(" HSL: " + data.getHue() + ", " + data.getSaturation() + ", " + data.getLuminance());
} else if (operation instanceof ITint) {
ITintEffectiveData data = ((ITint) operation).getEffective();
System.out.println(" Tint: " + data.getHue() + ", " + data.getAmount());
} else if (operation instanceof IBlur) {
IBlurEffectiveData data = ((IBlur) operation).getEffective();
System.out.println(" Blur radius: " + data.getRadius() + " pt");
} else if (operation instanceof IAlphaModulateFixed) {
IAlphaModulateFixedEffectiveData data = ((IAlphaModulateFixed) operation).getEffective();
System.out.println(" Alpha amount: " + data.getAmount() + "%");
} else if (operation instanceof IAlphaReplace) {
IAlphaReplaceEffectiveData data = ((IAlphaReplace) operation).getEffective();
System.out.println(" Replacement alpha: " + data.getAlpha() + "%");
} else if (operation instanceof IAlphaBiLevel) {
IAlphaBiLevelEffectiveData data = ((IAlphaBiLevel) operation).getEffective();
System.out.println(" Alpha threshold: " + data.getThreshold() + "%");
}
}
}
} finally {
presentation.dispose();
}
Gli effetti senza parametri come scala di grigi, alpha ceiling e alpha inverse hanno comunque un oggetto dati efficaci, ma non hanno impostazioni scalari da stampare. La loro presenza e posizione nella collezione sono le informazioni importanti.
Rimuovere o cancellare le trasformazioni di immagine
Usa IImageTransformOperationCollection.removeAt per rimuovere un’operazione per indice. Poiché gli indici cambiano dopo la rimozione, cerca prima il target e rimuovilo dopo l’enumerazione. Usa ImageTransformOperationCollection.clear per eliminare l’intera catena.
import com.aspose.slides.*;
Presentation presentation = new Presentation("image-transform-chain.pptx");
try {
IPictureFrame pictureFrame = null;
for (IShape shape : presentation.getSlides().get_Item(0).getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
IImageTransformOperationCollection imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
int blurIndex = -1;
for (int index = 0; index < imageTransform.size(); index++) {
if (imageTransform.get_Item(index) instanceof IBlur) {
blurIndex = index;
break;
}
}
if (blurIndex >= 0) {
imageTransform.removeAt(blurIndex);
System.out.println("The blur operation was removed.");
}
imageTransform.clear();
System.out.println("Remaining operations: " + imageTransform.size());
presentation.save("image-transforms-cleared.pptx", SaveFormat.Pptx);
}
} finally {
presentation.dispose();
}
Rimuovere o cancellare le trasformazioni modifica solo la formattazione dell’immagine. Non elimina, ricomprime o altera in altro modo la risorsa IPPImage riutilizzata.
Considerare i formati di presentazione e le destinazioni di esportazione
Le trasformazioni immagine originano in DrawingML, quindi PPTX è il formato modificabile preferito per le catene di effetti. Anche con PPTX, non ogni operazione ha la stessa portabilità:
- Le operazioni standard DrawingML come luminanza, scala di grigi, duotone, tinta, HSL, sfocatura e le comuni operazioni alpha hanno la migliore probabilità di sopravvivere a un round‑trip PPTX. Riapri sempre il file generato e ispeziona la collezione quando la preservazione è un requisito.
- BrightnessContrast è un’estensione Office 2010 anziché l’operazione di luminanza standard DrawingML. Può essere usato per il rendering in memoria, ma non è garantito che rimanga un IBrightnessContrast modificabile dopo il salvataggio e la riapertura del PPTX. Preferisci addLuminanceEffect per aggiustamenti di luminosità e contrasto persistenti.
- Il formato binario PPT precede il modello completo degli effetti DrawingML. Il salvataggio in PPT può omettere operazioni non supportate, ridurre una catena a un sottoinsieme supportato o approssimare l’aspetto. Non usare PPT come formato di verifica per una catena complessa modificabile.
- Il rendering in PNG, JPEG, TIFF, PDF, SVG, HTML o altri output visivi applica la catena supportata all’aspetto renderizzato. Quei output non contengono una
IImageTransformOperationCollectionmodificabile; i formati raster appiattiscono il risultato in pixel, e le esportazioni documento/vettoriale memorizzano la propria rappresentazione di rendering. - Gli effetti non rendono un’immagine collegata autonomamente. Il rendering di un’immagine collegata dipende ancora dal fatto che la risorsa collegata sia disponibile quando la presentazione viene caricata.
Diversi consumatori di presentazioni possono renderizzare i casi limite in modo diverso, specialmente quando più operazioni alpha o di quantizzazione colore sono combinate. Per output critici, testa sia il round‑trip modificabile sia il formato di esportazione finale con la stessa versione di Aspose.Slides usata in produzione.
FAQ
Le trasformazioni di immagine modificano i dati dell’immagine incorporata?
No. Le operazioni appartengono al ISlidesPicture usato dal riempimento immagine. I byte sottostanti di IPPImage rimangono invariati.
Due riquadri immagine che riutilizzano la stessa immagine condividono i loro effetti?
No. Riutilizzare un IPPImage evita dati immagine duplicati, ma ogni riquadro immagine normalmente ha un proprio ISlidesPicture e una propria collezione di trasformazioni dell’immagine.
È possibile combinare effetti di colore, sfocatura e alpha?
Sì. La collezione li accetta in una singola catena ordinata. Considera cosa fa ogni operazione sull’output della precedente, poiché le operazioni di sostituzione e soglia possono scartare dettagli di colore o alpha creati prima.
Perché i valori efficaci sono in sola lettura?
I dati efficaci rappresentano valori calcolati usati per il rendering, inclusi i colori risolti. Modifica l’operazione memorizzata nella collezione di trasformazioni dove esistono membri scrivibili; altrimenti rimuovila e aggiungi una sostituzione con nuovi parametri di creazione.
Quale formato dovrei usare per preservare una catena di trasformazioni?
Usa PPTX e verifica il file riaprendolo. Il legacy PPT non può rappresentare il modello completo degli effetti DrawingML, e i formati di esportazione renderizzati preservano l’aspetto ma non le operazioni di trasformazione modificabili.