Zarządzanie ramkami obrazu w prezentacjach na Androidzie

Wprowadzenie

Ramka obrazu to kształt, który zawiera obraz — jest jak zdjęcie w ramce.

Możesz dodać obraz do slajdu za pomocą ramki obrazu. W ten sposób możesz formatować obraz, formatując ramkę obrazu.

Utworzenie ramki obrazu

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
  3. Utwórz obiekt IPPImage poprzez dodanie obrazu do IImagescollection powiązanego z obiektem prezentacji, który będzie używany do wypełnienia kształtu.
  4. Określ szerokość i wysokość obrazu.
  5. Utwórz PictureFrame na podstawie szerokości i wysokości obrazu za pomocą metody AddPictureFrame udostępnionej przez obiekt kształtu powiązany z odwołanym slajdem.
  6. Dodaj ramkę obrazu (zawierającą zdjęcie) do slajdu.
  7. Zapisz zmodyfikowaną prezentację jako plik PPTX.

Ten kod Java pokazuje, jak utworzyć ramkę obrazu:

// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
Presentation pres = new Presentation();
try {
    // Pobiera pierwszy slajd
    ISlide sld = pres.getSlides().get_Item(0);
    
    // Tworzy instancję klasy Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    // Dodaje ramkę obrazu o wysokości i szerokości obrazu
    sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // Zapisuje plik PPTX na dysku
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Utworzenie ramki obrazu z skalą względną

Modyfikując skalowanie względne obrazu, możesz utworzyć bardziej zaawansowaną ramkę obrazu.

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
  3. Dodaj obraz do kolekcji obrazów prezentacji.
  4. Utwórz obiekt IPPImage poprzez dodanie obrazu do IImagescollection powiązanego z obiektem prezentacji, który będzie używany do wypełnienia kształtu.
  5. Określ względną szerokość i wysokość obrazu w ramce obrazu.
  6. Zapisz zmodyfikowaną prezentację jako plik PPTX.

Ten kod Java pokazuje, jak utworzyć ramkę obrazu ze skalą względną:

// Utwórz klasę Presentation, która reprezentuje plik PPTX
Presentation pres = new Presentation();
try {
    // Pobierz pierwszy slajd
    ISlide sld = pres.getSlides().get_Item(0);
    
    // Utwórz instancję klasy Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    
    // Dodaj ramkę obrazu o wysokości i szerokości równej obrazu
    IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // Ustawianie względnej skali szerokości i wysokości
    pf.setRelativeScaleHeight(0.8f);
    pf.setRelativeScaleWidth(1.35f);
    
    // Zapisz plik PPTX na dysku
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Wyodrębnianie obrazów rastrowych z ramek obrazu

Możesz wyodrębniać obrazy rastrowe z obiektów PictureFrame i zapisywać je w formatach PNG, JPG i innych. Poniższy przykład kodu pokazuje, jak wyodrębnić obraz z dokumentu “sample.pptx” i zapisać go w formacie PNG.

Presentation presentation = new Presentation("sample.pptx");

try {
    ISlide firstSlide = presentation.getSlides().get_Item(0);
    IShape firstShape = firstSlide.getShapes().get_Item(0);

    if (firstShape instanceof IPictureFrame) {
        IPictureFrame pictureFrame = (IPictureFrame) firstShape;
        try {
			IImage slideImage = pictureFrame.getPictureFormat().getPicture().getImage().getImage();
			slideImage.save("slide_1_shape_1.png", ImageFormat.Png);
		} finally {
			if (slideImage != null) slideImage.dispose();
		}
    }
} catch (IOException e) {
} finally {
    presentation.dispose();
}

Wyodrębnianie obrazów SVG z ramek obrazu

Kiedy prezentacja zawiera grafikę SVG umieszczoną wewnątrz kształtów PictureFrame, Aspose.Slides dla Androida w wersji Java umożliwia pobranie oryginalnych obrazów wektorowych z pełną wiernością. Przeglądając kolekcję kształtów slajdu, możesz zidentyfikować każdy PictureFrame, sprawdzić, czy leżący pod nim IPPImage zawiera treść SVG, a następnie zapisać ten obraz na dysku lub w strumieniu w jego natywnym formacie SVG.

Poniższy przykład kodu demonstruje, jak wyodrębnić obraz SVG z ramki obrazu:

Presentation presentation = new Presentation("sample.pptx");

try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IShape shape = slide.getShapes().get_Item(0);

    if (shape instanceof IPictureFrame) {
        IPictureFrame pictureFrame = (IPictureFrame) shape;
        ISvgImage svgImage = pictureFrame.getPictureFormat().getPicture().getImage().getSvgImage();

        FileOutputStream fos = new FileOutputStream("output.svg");
        fos.write(svgImage.getSvgData());
        fos.close();
    }
} catch (IOException e) {
    System.out.println(e.getMessage());
} finally {
    presentation.dispose();
}

Pobieranie przezroczystości obrazu

Aspose.Slides umożliwia pobranie efektu przezroczystości zastosowanego do obrazu. Ten kod Java demonstruje tę operację:

Presentation presentation = new Presentation("Test.pptx");

var pictureFrame = (IPictureFrame) presentation.getSlides().get_Item(0).getShapes().get_Item(0);
var imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
for (var effect : imageTransform) {
    if (effect instanceof IAlphaModulateFixed) {
        var alphaModulateFixed = (IAlphaModulateFixed) effect;
        var transparencyValue = 100 - alphaModulateFixed.getAmount();
        System.out.println("Picture transparency: " + transparencyValue);
    }
}

Pobieranie jasności i kontrastu obrazu

Aspose.Slides umożliwia pobranie efektu jasności i kontrastu zastosowanego do obrazu. Interfejs ILuminance reprezentuje ten efekt transformacji obrazu.

Ten kod Java demonstruje, jak pobrać ustawienia jasności i kontrastu z ramki obrazu:

Presentation presentation = new Presentation("sample.pptx");

try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IShape shape = slide.getShapes().get_Item(0);
    IPictureFrame pictureFrame = (IPictureFrame) shape;

    IImageTransformOperationCollection imageTransform = pictureFrame.getPictureFormat().getPicture().getImageTransform();
    for (IImageTransformOperation effect : imageTransform) {
        if (effect instanceof ILuminance) {
            ILuminanceEffectiveData luminance = ((ILuminance) effect).getEffective();
            float brightness = luminance.getBrightness();
            float contrast = luminance.getContrast();

            System.out.println("Brightness: " + brightness);
            System.out.println("Contrast: " + contrast);
        }
    }
} finally {
    presentation.dispose();
}

Formatowanie ramki obrazu

Aspose.Slides oferuje wiele opcji formatowania, które można zastosować do ramki obrazu. Korzystając z tych opcji, możesz zmodyfikować ramkę obrazu, aby spełniała określone wymagania.

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
  3. Utwórz obiekt IPPImage poprzez dodanie obrazu do IImagescollection powiązanego z obiektem prezentacji, który będzie używany do wypełnienia kształtu.
  4. Określ szerokość i wysokość obrazu.
  5. Utwórz PictureFrame na podstawie szerokości i wysokości obrazu za pomocą metody AddPictureFrame udostępnionej przez obiekt IShapes powiązany z odwołanym slajdem.
  6. Dodaj ramkę obrazu (zawierającą zdjęcie) do slajdu.
  7. Ustaw kolor linii ramki obrazu.
  8. Ustaw szerokość linii ramki obrazu.
  9. Obróć ramkę obrazu, podając jej wartość dodatnią lub ujemną.
    • Wartość dodatnia obraca obraz zgodnie z ruchem wskazówek zegara.
    • Wartość ujemna obraca obraz przeciwnie do ruchu wskazówek zegara.
  10. Dodaj ramkę obrazu (zawierającą zdjęcie) do slajdu.
  11. Zapisz zmodyfikowaną prezentację jako plik PPTX.

Ten kod Java demonstruje proces formatowania ramki obrazu:

// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
Presentation pres = new Presentation();
try {
    // Pobiera pierwszy slajd
    ISlide sld = pres.getSlides().get_Item(0);
    
    // Tworzy instancję klasy Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    // Dodaje ramkę obrazu o wysokości i szerokości równej obrazowi
    IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // Zastosowuje formatowanie do PictureFrameEx
    pf.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    pf.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
    pf.getLineFormat().setWidth(20);
    pf.setRotation(45);
    
    // Zapisuje plik PPTX na dysku
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Dodanie obrazu jako linku

Aby uniknąć dużych rozmiarów prezentacji, możesz dodawać obrazy (lub filmy) za pomocą linków zamiast osadzać pliki bezpośrednio w prezentacjach. Ten kod Java pokazuje, jak dodać obraz i wideo do miejsca wstawienia:

Presentation presentation = new Presentation("input.pptx");
try {
    ArrayList<IShape> shapesToRemove = new ArrayList<IShape>();
    int shapesCount = presentation.getSlides().get_Item(0).getShapes().size();

    for (int i = 0; i < shapesCount; i++)
    {
        IShape autoShape = presentation.getSlides().get_Item(0).getShapes().get_Item(i);

        if (autoShape.getPlaceholder() == null)
        {
            continue;
        }

        switch (autoShape.getPlaceholder().getType())
        {
            case PlaceholderType.Picture:
                IPictureFrame pictureFrame = presentation.getSlides().get_Item(0).getShapes().addPictureFrame(ShapeType.Rectangle,
                        autoShape.getX(), autoShape.getY(), autoShape.getWidth(), autoShape.getHeight(), null);

                pictureFrame.getPictureFormat().getPicture().setLinkPathLong(
                        "https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");

                shapesToRemove.add(autoShape);
                break;

            case PlaceholderType.Media:
                IVideoFrame videoFrame = presentation.getSlides().get_Item(0).getShapes().addVideoFrame(
                        autoShape.getX(), autoShape.getY(), autoShape.getWidth(), autoShape.getHeight(), "");

                videoFrame.getPictureFormat().getPicture().setLinkPathLong(
                        "https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");

                videoFrame.setLinkPathLong("https://youtu.be/t_1LYZ102RA");

                shapesToRemove.add(autoShape);
                break;
        }
    }

    for (IShape shape : shapesToRemove)
    {
        presentation.getSlides().get_Item(0).getShapes().remove(shape);
    }

    presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
    if (presentation != null) presentation.dispose();
}

Przycinanie obrazów

Ten kod Java pokazuje, jak przyciąć istniejący obraz na slajdzie:

Presentation pres = new Presentation();
// Tworzy nowy obiekt obrazu
try {
    IPPImage picture;
    IImage image = Images.fromFile(imagePath);
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // Dodaje ramkę obrazu do slajdu
    IPictureFrame picFrame = pres.getSlides().get_Item(0).getShapes().addPictureFrame(
            ShapeType.Rectangle, 100, 100, 420, 250, picture);

    // Przycinanie obrazu (wartości procentowe)
    picFrame.getPictureFormat().setCropLeft(23.6f);
    picFrame.getPictureFormat().setCropRight(21.5f);
    picFrame.getPictureFormat().setCropTop(3);
    picFrame.getPictureFormat().setCropBottom(31);

    // Zapisuje wynik
    pres.save(outPptxFile, SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Usuwanie przyciętych obszarów obrazu

Jeśli chcesz usunąć przycięte obszary obrazu zawartego w ramce, możesz użyć metody deletePictureCroppedAreas(). Metoda ta zwraca przycięty obraz lub obraz pierwotny, jeśli przycinanie nie jest potrzebne.

Ten kod Java demonstruje tę operację:

Presentation presentation = new Presentation("PictureFrameCrop.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    // Pobiera ramkę obrazu z pierwszego slajdu
    IPictureFrame picFrame = (IPictureFrame)slide.getShapes().get_Item(0);

    // Usuwa przycięte obszary obrazu ramki obrazu i zwraca przycięty obraz
    IPPImage croppedImage = picFrame.getPictureFormat().deletePictureCroppedAreas();

    // Zapisuje wynik
    presentation.save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
} finally {
    if (presentation != null) presentation.dispose();
}

Kompresja obrazów

Możesz skompresować obraz w prezentacji przy użyciu metody IPictureFillFormat.compressImage. Metoda ta kompresuje obraz, zmniejszając jego rozmiar w oparciu o rozmiar kształtu i określoną rozdzielczość, z opcją usunięcia przyciętych obszarów.

Dostosowuje rozmiar i rozdzielczość obrazu podobnie jak funkcja PowerPoint Format obrazu > Kompresuj obrazy > Rozdzielczość.

Poniższe przykłady Java demonstrują, jak skompresować obraz w prezentacji, określając docelową rozdzielczość i opcjonalnie usuwając przycięte obszary:

Presentation presentation = new Presentation("demo.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IPictureFrame pictureFrame = (IPictureFrame)slide.getShapes().get_Item(0);

    // Kompresuj obraz z docelową rozdzielczością 150 DPI (rozdzielczość internetowa) i usuń przycięte obszary.
    boolean result = pictureFrame.getPictureFormat().compressImage(true, PicturesCompression.Dpi150);

    // Sprawdź wynik kompresji.
    if (result) {
        System.out.println("Image successfully compressed.");
    } else {
        System.out.println("Image compression failed or no changes were necessary.");
    }

    presentation.save("CompressedImage.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Lub używając bezpośrednio niestandardowej wartości DPI:

Presentation presentation = new Presentation("demo.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IPictureFrame pictureFrame = (IPictureFrame)slide.getShapes().get_Item(0);

    // Kompresuj obraz do 150 DPI (rozdzielczość internetowa), usuwając przycięte obszary.
    pictureFrame.getPictureFormat().compressImage(true, 150f);

    presentation.save("CompressedImage.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Zablokowanie proporcji

Jeśli chcesz, aby kształt zawierający obraz zachował proporcje nawet po zmianie wymiarów obrazu, możesz użyć metody setAspectRatioLocked aby ustawić opcję Lock Aspect Ratio.

Ten kod Java pokazuje, jak zablokować proporcje kształtu:

Presentation pres = new Presentation("pres.pptx");
try {
    ILayoutSlide layout = pres.getLayoutSlides().getByType(SlideLayoutType.Custom);
    ISlide emptySlide = pres.getSlides().addEmptySlide(layout);
    IPPImage picture;
    IImage image = Images.fromFile("image.png");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }
    IPictureFrame pictureFrame = emptySlide.getShapes().addPictureFrame(
            ShapeType.Rectangle, 50, 150, presImage.getWidth(), presImage.getHeight(), picture);

    // ustaw kształt tak, aby zachował proporcje przy zmianie rozmiaru
    pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
} catch(IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Użycie właściwości StretchOff

Używając właściwości StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight i StretchOffsetBottom z interfejsu IPictureFillFormat oraz klasy PictureFillFormat, możesz określić prostokąt wypełnienia.

Gdy dla obrazu określono rozciąganie, prostokąt źródłowy jest skalowany, aby pasował do określonego prostokąta wypełnienia. Każda krawędź prostokąta wypełnienia jest definiowana przez offset procentowy od odpowiadającej krawędzi ramki kształtu. Wartość dodatnia oznacza wcięcie, natomiast wartość ujemna – wystawienie.

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
  3. Dodaj prostokąt AutoShape.
  4. Utwórz obraz.
  5. Ustaw typ wypełnienia kształtu.
  6. Ustaw tryb wypełnienia obrazu kształtu.
  7. Dodaj ustawiony obraz, aby wypełnić kształt.
  8. Określ offsety obrazu względem odpowiedniej krawędzi ramki kształtu
  9. Zapisz zmodyfikowaną prezentację jako plik PPTX.

Ten kod Java demonstruje proces, w którym używana jest właściwość StretchOff:

// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
Presentation pres = new Presentation();
try {
    // Pobiera pierwszy slajd
    ISlide slide = pres.getSlides().get_Item(0);

    // Tworzy instancję klasy ImageEx
    IPPImage picture;
    IImage image = Images.fromFile("aspose-logo.jpg");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // Dodaje AutoShape ustawiony na prostokąt
    IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);

    // Ustawia typ wypełnienia kształtu
    aShape.getFillFormat().setFillType(FillType.Picture);

    // Ustawia tryb wypełnienia obrazu kształtu
    aShape.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);

    // Ustawia obraz jako wypełnienie kształtu
    aShape.getFillFormat().getPictureFillFormat().getPicture().setImage(picture);

    // Określa offsety obrazu względem odpowiedniej krawędzi ramki kształtu
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetLeft(25);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetRight(25);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetTop(-20);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetBottom(-10);
    
    // Zapisuje plik PPTX na dysku
    pres.save("StretchOffsetLeftForPictureFrame_out.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

FAQ

Jak mogę dowiedzieć się, które formaty obrazów są obsługiwane dla PictureFrame?

Aspose.Slides obsługuje zarówno obrazy rastrowe (PNG, JPEG, BMP, GIF itp.), jak i obrazy wektorowe (np. SVG) za pośrednictwem obiektu obrazu przypisanego do PictureFrame. Lista obsługiwanych formatów zazwyczaj pokrywa się z możliwościami silnika konwersji slajdów i obrazów.

Jak dodanie dziesiątek dużych obrazów wpłynie na rozmiar i wydajność pliku PPTX?

Osadzanie dużych obrazów zwiększa rozmiar pliku i zużycie pamięci; łączenie obrazów pomaga utrzymać mały rozmiar prezentacji, ale wymaga, aby zewnętrzne pliki pozostawały dostępne. Aspose.Slides umożliwia dodawanie obrazów jako linki, aby zmniejszyć rozmiar pliku.

Jak mogę zablokować obiekt obrazu przed przypadkowym przemieszczaniem/skalowaniem?

Użyj blokad kształtu dla PictureFrame (np. wyłącz przenoszenie lub skalowanie). Mechanizm blokady jest obsługiwany dla różnych typów kształtów, w tym PictureFrame.

Czy wierność wektorowa SVG jest zachowana przy eksportowaniu prezentacji do PDF/obrazów?

Aspose.Slides umożliwia wyodrębnienie SVG z PictureFrame jako oryginalnego wektora. Przy eksportowaniu do PDF lub formatów rastrowych, wynik może być rastrowany w zależności od ustawień eksportu; fakt, że oryginalny SVG jest przechowywany jako wektor, jest potwierdzony zachowaniem wyodrębniania.