Hantera bildramar i presentationer på Android
Översikt
En bildram är en bildform på en bildspel som visar en bild. I Aspose.Slides är bildresursen och formen som visar den separata objekt: en Presentation äger inbäddade bildresurser via sin IImageCollection, medan en IPictureFrame styr bildens position, storlek, linjeformatering, rotation, beskärning, bild‑effekter och andra ram‑nivåinställningar.
Denna separation är användbar när samma bild visas mer än en gång. Lägg till bilden i presentationen en gång, behåll den returnerade IPPImage, och använd den bildresursen när du skapar bildramar.
Bildramar kan innehålla rasterbilder som PNG eller JPEG samt vektor‑SVG‑bilder. De kan också referera till länkade bilder i stället för att lagra bild‑bytena i presentationen. Valet påverkar portabilitet, filstorlek, extraktion och exportbeteende, så det är bra att bestämma hur bilden ska lagras innan formatering eller optimering tillämpas.
Lägg till och formatera en inbäddad bild
För en inbäddad bild, lägg till bilddata i presentationen och skapa en bildram med IShapeCollection.addPictureFrame. Bilden blir en del av presentationspaketet, så presentationen förblir självständig när den flyttas till en annan dator.
Följande exempel lägger till en JPEG‑bild, skapar en ram med bildens ursprungliga dimensioner och tillämpar linjeformatering och rotation:
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.jpg");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 100, image.getWidth(), image.getHeight(), image);
pictureFrame.getLineFormat().getFillFormat().setFillType(FillType.Solid);
pictureFrame.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
pictureFrame.getLineFormat().setWidth(3);
pictureFrame.setRotation(15);
presentation.save("picture-frame.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Bildramen styr den visade geometrin; att ändra ramens storlek ändrar inte de ursprungliga pixel‑dimensionerna som lagras i den inbäddade bildresursen. Denna distinktion blir viktig när man beskär eller komprimerar en bild senare.
Använd relativ skalning
IPictureFrame exponerar relativ bredd‑ och höjds skalning för ramen via setRelativeScaleWidth och setRelativeScaleHeight. Ett värde på 1.0 motsvarar 100 % av den ursprungliga bildstorleken. Relativ skalning är användbar när ett arbetsflöde behöver bevara ett förhållande till källbildens storlek i stället för att manuellt beräkna slutdimensionerna.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.jpg");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, image);
pictureFrame.setRelativeScaleWidth(1.35f);
pictureFrame.setRelativeScaleHeight(0.8f);
presentation.save("relative-scale.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Relativ skalning ändrar ramens skalningsinställningar; den omprovar eller komprimerar inte den inbäddade bilden.
Inbäddade och länkade bilder
En inbäddad bild lagrar bilddata i presentationen och är därför det säkraste valet för portabilitet och förutsägbar rendering. En länkad bild lagrar en extern plats via metoden ISlidesPicture.setLinkPathLong i stället för att bädda in bilddata på samma sätt.
Länkade bilder kan minska mängden bilddata som lagras i PPTX‑filen, men de introducerar ett externt beroende. Den länkade filen måste förbli tillgänglig för programmet som öppnar eller renderar presentationen. Om sökvägen ändras, filen flyttas eller resursen är otillgänglig, kan den länkade bilden missas visas som förväntat. För presentationer som måste mailas, arkiveras eller renderas i isolerade miljöer är inbäddade bilder vanligtvis mer pålitliga.
Lägg till en länkad bild
Följande exempel skapar en bildram och pekar den på en lokal bildfil. Det hanterar endast bildlänkning; videolänkning är ett separat mediaprocess och har avsiktligt inte blandats in i detta exempel.
import com.aspose.slides.*;
import java.io.File;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 320, 180, null);
File linkedImageFile = new File("linked-image.jpg");
String linkPath = linkedImageFile.getAbsolutePath();
pictureFrame.getPictureFormat().getPicture().setLinkPathLong(linkPath);
presentation.save("linked-image.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Använd länkar när extern filhantering är avsiktlig. Använd dem inte bara som ett ersättningsmedel för komprimering: ett litet PPTX‑fil med brutna bildberoenden är vanligtvis mindre användbart än en större självständig presentation.
Extrahera bilder från bildramar
Innan du extraherar en bild från en befintlig presentation, kontrollera att en form faktiskt är en IPictureFrame och att den innehåller en inbäddad bild. Länkade bildramar kanske inte innehåller bild‑byten som kan extraheras på samma sätt.
Extrahera en rasterbild
Det moderna bild‑API‑et använder IImage direkt och kräver inte den äldre Java‑bild‑omslutaren. Följande exempel hittar den första inbäddade rasterbilden på en bild och sparar den som PNG:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IPictureFrame)) {
continue;
}
IPictureFrame pictureFrame = (IPictureFrame) shape;
IPPImage embeddedImage = pictureFrame.getPictureFormat().getPicture().getImage();
if (embeddedImage == null || embeddedImage.getSvgImage() != null) {
continue;
}
IImage rasterImage = embeddedImage.getImage();
try {
rasterImage.save("extracted-image.png", ImageFormat.Png);
} finally {
rasterImage.dispose();
}
break;
}
} finally {
presentation.dispose();
}
Sparande via IImage.save konverterar den extraherade bilden till det begärda utdataformatet. Om du behöver de kodade bytena som lagras i presentationen i stället för en konverterad rasterfil, använd bildresursens binära data istället.
Extrahera en SVG‑bild
För en SVG‑bild exponerar IPPImage ett ISvgImage‑objekt. Detta låter dig hämta SVG‑data direkt i stället för att rasterisera bilden först.
import com.aspose.slides.*;
import java.io.FileOutputStream;
import java.io.IOException;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IPictureFrame)) {
continue;
}
IPictureFrame pictureFrame = (IPictureFrame) shape;
IPPImage embeddedImage = pictureFrame.getPictureFormat().getPicture().getImage();
ISvgImage svgImage = embeddedImage != null ? embeddedImage.getSvgImage() : null;
if (svgImage == null) {
continue;
}
byte[] svgData = svgImage.getSvgData();
FileOutputStream outputStream = new FileOutputStream("extracted-image.svg");
try {
outputStream.write(svgData);
} finally {
outputStream.close();
}
break;
}
} finally {
presentation.dispose();
}
Att behålla SVG‑innehåll som SVG bevarar vektorkällan i presentationen. Rasterexporter som PNG eller JPEG återger nödvändigtvis det vektoriska innehållet till pixlar. PDF‑ eller SVG‑bildexport är också en renderingsoperation, så de exporterade grafikerna bör inte behandlas som en byte‑för‑byte‑kopia av den ursprungliga inbäddade SVG‑en; använd den inbäddade ISvgImage.getSvgData‑datan när den ursprungliga vektorresursen själv behövs.
Beskär en bild
Beskärning ändrar vilken del av bilden som är synlig i ramen. Beskärningsvärdena på IPictureFillFormat är procentandelar av källbildens dimensioner. Beskärning tar inte initialt bort de dolda pixlarna från den inbäddade bilden; den ändrar endast den synliga regionen.
Följande exempel hittar en bildram på ett säkert sätt och tillämpar beskärningsvärden:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = null;
for (IShape shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
pictureFrame.getPictureFormat().setCropLeft(23.6f);
pictureFrame.getPictureFormat().setCropRight(21.5f);
pictureFrame.getPictureFormat().setCropTop(3f);
pictureFrame.getPictureFormat().setCropBottom(31f);
presentation.save("cropped-image.pptx", SaveFormat.Pptx);
}
} finally {
presentation.dispose();
}
Eftersom den dolda bilddatan fortfarande finns kvar, kan beskärningen ändras senare utan att förlora de ursprungliga pixlarna. Om filstorlek är viktigare än återförbarhet, kan de beskurna regionerna tas bort fysiskt som beskrivs i nästa avsnitt.
Ta bort beskärda bilddata
IPictureFillFormat.deletePictureCroppedAreas tar bort bilddata utanför den aktuella beskärningsrektangeln och returnerar den resulterande bildresursen. Detta kan minska filstorleken, men det är en destruktiv optimering: efter att presentationen sparats är de borttagna pixlarna inte längre tillgängliga för en senare avbeskärningsoperation.
import com.aspose.slides.*;
Presentation presentation = new Presentation("cropped-image.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = null;
for (IShape shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
IPPImage croppedImage = pictureFrame.getPictureFormat().deletePictureCroppedAreas();
if (croppedImage != null) {
presentation.save("cropped-data-removed.pptx", SaveFormat.Pptx);
}
}
} finally {
presentation.dispose();
}
Metoden kan lägga till en ny bildresurs i presentationen. Om den ursprungliga bilden också används av andra bildramar, behöver dessa ramar fortfarande sin befintliga resurs, så att ta bort beskurna områden minskar inte nödvändigtvis det totala antalet bilder. Beskärning av WMF‑ eller EMF‑innehåll med denna metod rasteriserar det beskurna resultatet till PNG.
Komprimera rasterbilder
IPictureFillFormat.compressImage minskar rasterbildens upplösning i förhållande till den storlek som bilden visas i. Den kan också ta bort beskurna regioner i samma operation. Metoden returnerar true när bilden har ändrats i storlek eller beskärts och false när ingen förändring var nödvändig.
Använd ett fördefinierat PicturesCompression‑värde när en standardmålupplösning är tillräcklig:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPictureFrame pictureFrame = null;
for (IShape shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
pictureFrame = (IPictureFrame) shape;
break;
}
}
if (pictureFrame != null) {
boolean compressed = pictureFrame.getPictureFormat().compressImage(true, PicturesCompression.Dpi150);
System.out.println(compressed ? "The image was compressed." : "No compression was necessary.");
presentation.save("compressed-image.pptx", SaveFormat.Pptx);
}
} finally {
presentation.dispose();
}
Ett anpassat positivt DPI‑värde kan skickas istället för ett fördefinierat värde när ett specifikt mål krävs.
Komprimering är avsedd för rasterbilder. SVG‑ och metafilinnehåll minskas inte av detta rasterkomprimeringsflöde. Kom också ihåg att lägre upplösning och borttagna beskurna regioner inte kan återställas från den optimerade presentationen. Välj en målupplösning baserat på den största storleken som bilden faktiskt kommer att visas eller exporteras i, snarare än att tillämpa den lägsta DPI‑nivån globalt.
Hantera bildtransformeringseffekter
För ett komplett arbetsflöde som täcker ljusstyrka, kontrast, färgtransformeringar, oskärpa, alfa‑effekter, ordnade kedjor, inspektion, borttagning och dubbelriktad verifiering, se Image Transform Effects.
Lås bildramens geometri
Inställningarna i IPictureFrameLock styr vilka redigeringsåtgärder som är inaktiverade för en bildram. Till exempel bevarar setAspectRatioLocked formens proportioner medan den ändras i storlek.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IPPImage image;
IImage sourceImage = Images.fromFile("photo.jpg");
try {
image = presentation.getImages().addImage(sourceImage);
} finally {
sourceImage.dispose();
}
IPictureFrame pictureFrame = slide.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 100, image.getWidth(), image.getHeight(), image);
pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
presentation.save("locked-picture-frame.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Låset gäller bildramens form. Det tvingar inte källbilden att omprovas eller permanent ändras till samma bildförhållande.
Justera StretchOffset‑värdena
När bildfyllningsläget är stretch definierar stretch‑offset‑värdena på IPictureFillFormat fyllningsrektangeln relativt bildramens omslutande ruta. Positiva procentsatser skapar en fördjupning från en kant, medan negativa procentsatser skapar ett utbuktande.
Detta skiljer sig från beskärning. Beskärningsvärdena väljer vilken del av källbilden som är synlig; stretch‑offset ändrar rektangeln som den synliga bildfyllningen sträcks in i.
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, 10, 10, 400, 300, image);
pictureFrame.getPictureFormat().setPictureFillMode(PictureFillMode.Stretch);
pictureFrame.getPictureFormat().setStretchOffsetLeft(12f);
pictureFrame.getPictureFormat().setStretchOffsetRight(12f);
pictureFrame.getPictureFormat().setStretchOffsetTop(8f);
pictureFrame.getPictureFormat().setStretchOffsetBottom(8f);
presentation.save("stretch-offsets.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Använd stretch‑offset för placering av fyllning. Använd beskärningsegenskaper när målet är att dölja kanterna på källbilden.
Lagring, filstorlek och exportaspekter
De viktigaste avvägningarna är enklare att hantera när bildlagring och bildramens formatering behandlas separat:
- Inbäddade bilder gör presentationen självständig och är den mest pålitliga för delning och server‑sidig rendering, men stora rasterbilder ökar PPTX‑storleken och minnesanvändningen.
- Länkade bilder kan hålla paketet mindre, men presentationen är beroende av att externa filer förblir tillgängliga på de lagrade sökvägarna eller platserna.
- Beskärning är initialt icke‑destruktiv. De dolda pixlarna förblir inbäddade tills beskurna områden uttryckligen tas bort eller tas bort under komprimering.
- Komprimering kan reducera filstorleken avsevärt för överdimensionerade rasterbilder, men den offrar källupplösning. Den bör tillämpas efter att den avsedda storleken på bilden i sliden är känd.
- SVG‑bilder bör förbli som SVG när vektorbevarande är viktigt. Extrahera den inbäddade SVG‑filen direkt när du behöver vektorresursen själv. Raster‑bildexporter konverterar alltid den renderade sliden till pixlar.
- Upprepade bilder bör återanvända en befintlig [IPPImage]‑resurs när det är möjligt i stället för att upprepade gånger ladda samma fil i presentationsarbetsflödet.
För stora presentationer är bildoptimering vanligtvis mest effektiv när den utförs selektivt: behåll logotyper och diagram som vektorinnehåll, komprimera fotografier enligt deras faktiska visningsstorlek, ta bort beskurna pixlar endast när senare redigering inte krävs, och undvik externa länkar såvida inte beroendehantering är en del av distributionsdesignen.
FAQ
Vad är skillnaden mellan en bildram och en bildresurs?
En IPPImage representerar en bildresurs som är associerad med presentationen. En IPictureFrame är en form på en bild som visar en bild och lagrar ram‑nivå geometri och formatering såsom storlek, rotation, beskärningsvärden, effekter och lås.
Ska jag bädda in eller länka bilder?
Bädda in bilder när presentationen måste vara portabel, arkiveras eller renderas utan åtkomst till externa resurser. Länka bilder endast när det är avsiktligt att hålla bildfilerna utanför PPTX och de externa platserna kan underhållas på ett tillförlitligt sätt.
Minskar beskärning PPTX‑filens storlek?
Inte i sig. Vanliga beskärningsinställningar döljer delar av källbilden men behåller de underliggande pixlarna. Använd IPictureFillFormat.deletePictureCroppedAreas eller bildkomprimering med borttagning av beskurna områden när dessa pixlar kan kasseras permanent.
Kan jag återställa bildkvaliteten efter komprimering?
Nej. Komprimering kan reducera lagrad rasterupplösning, och att ta bort beskurna regioner kastar bilddata. Behåll originalkällbilden utanför presentationen om högupplöst redigering kan behövas senare.
Hur bör SVG‑bilder hanteras?
Behåll SVG‑innehåll som SVG när vektorprecision är viktig. Den inbäddade ISvgImage kan extraheras direkt. Att rendera en bild till ett rasterformat såsom PNG eller JPEG rasteriserar SVG‑en som en del av bildens bild.
Hur kan jag undvika osäkra typekonverteringar när jag läser befintliga bilder?
Kontrollera formtypen innan du använder bildram‑specifika medlemmar. En instanceof‑kontroll mot IPictureFrame undviker ogiltiga typkonverteringar och låter koden hantera bilder som inte innehåller bildramar.