Képtranszformációs hatások kezelése prezentációkban Python‑nal

Áttekintés

Az Aspose.Slides a képkorrekciókat képszorzási műveletek rendezett gyűjteményeként ábrázolja. Egy képkerethez indítsa a keret Picture objektumát, és érje el a image_transform tulajdonságát. A visszakapott ImageTransformOperationCollection lehetővé teszi műveletek hozzáadását, felsorolását, vizsgálatát, eltávolítását és a gyűjtemény törlését az eredeti kép bájtjainak újbóli írása nélkül.

Ez a cikk egy teljes munkafolyamatot mutat be a fényerő és kontraszt, színátalakítások, elmosás, átlátszóság, rendezett hatláncok, hatékony értékek, eltávolítás és PPTX körkörös ellenőrzés terén.

A hatás tulajdonjogának és a kép újrahasználatának megértése

Egy képernyőforrás és a megjelenítő kép külön objektumok:

  • PPImage tárolja vagy hivatkozik a prezentáció által birtokolt forráskép adataira.
  • Picture a képtöltéshez tartozik, egy képernyőforrást hivatkozik, és tárolja a képtranszformációk gyűjteményét.
  • PictureFrame a diára helyezett alakzat, amely a megfelelő képkitöltést, geometriát, vágási beállításokat és egyéb keretszintű formázásokat birtokolja.

Ezért a képtranszformációs műveletek nem módosítják a PPImage bájtjait. Ha ugyanazt a PPImage-t többször átadják a ShapeCollection.add_picture_frame metódusnak, minden új képkeret saját Picture-t és saját transzformációs gyűjteményt kap. A szürkeskála alkalmazása az egyik keretben nem teszi szürkeskálává a többi keretet, bár mindegyik ugyanazt a beágyazott képernyőforrást használja.

Ugyanez a Picture.image_transform modell más képkitöltéseknél is használatos, például alakzat vagy dia háttér esetén. Az alábbi példák a képkeretekre fókuszálnak.

Érvényes paramétertartományok és egységek használata

A bemutatott módszerek a következő szemantikus tartományokat és egységeket alkalmazzák. Tartsa a megadott értékeket, még akkor is, ha egy adott könyvtárverzió nem utasítja el azonnal a tartományon kívüli értékeket; a célprezentáció formátuma normalizálhat, elhagyhat vagy elutasíthat érvénytelen adatot mentéskor vagy a PowerPoint fájl megnyitásakor.

Művelet Paraméterek Érvényes tartomány és egység
add_brightness_contrast_effect brightness, contrast -100‑tól 100‑ig, százalék; 0 változatlanul hagyja az alkotót.
add_gray_scale_effect Nincs Nincs numerikus paraméter. Az alfa változatlan.
add_duotone_effect color1, color2 Két szín a sötét és világos pixelekhez. Az RGB és alfa csatornák 0‑tól 255‑ig terjednek.
add_tint_effect hue, amount A színárnyalat 0 (záró) és 360 (nyitó) fok között, fokban; az mennyiség -100‑tól 100‑ig, százalék.
add_hsl_effect hue, saturation, luminance A színárnyalat 0‑tól 360‑ig, fokban; a telítettség és a fényesség -100‑tól 100‑ig, százalék.
add_color_replace_effect color A helyettesítő szín csatornaértékei 0‑tól 255‑ig. A meglévő alfa értékek változatlanok.
add_blur_effect radius, grow A sugár nemnegatív és pontban van megadva; a grow logikai érték, amely azt szabályozza, hogy elmosott tartalom túlnyúlhat‑e az eredeti határokon.
add_alpha_modulate_fixed_effect amount Nemnegatív százalék. Használja a 0‑tól 100‑ig terjedő tartományt az általános átlátszatlanság skálázásához: 0 teljesen átlátszó, 100 megőrzi a meglévő alfat.
add_alpha_replace_effect alpha 0‑tól 100‑ig, százalékos átlátszatlanság.
add_alpha_bi_level_effect threshold 0‑tól 100‑ig, százalékos alfa küszöb. Az alatta lévő értékek átlátszóvá válnak; a küszöbön vagy fölötte lévők átlátszatlanok.

A fix alfa moduláció esetén az átlátszóság és az átlátszatlanság kiegészítőek. Például a 35 % átlátszóság egy 65 % alfa modulációs értéknek felel meg.

Fényerő és kontraszt alkalmazása

ImageTransformOperationCollection.add_brightness_contrast_effect egy BrightnessContrast műveletet ad vissza. A skalár beállításokat a művelet létrehozásakor adjuk meg. A BrightnessContrast.get_effective kiszámított, csak olvasható értékeket ad, amelyeket ellenőrizhet vagy naplózhat.

Az alábbi példa 15 %‑kal növeli a fényerőt és 20 %‑kal a kontrasztot, majd előnézetet renderel anélkül, hogy módosítaná a beágyazott képet:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    with slides.Images.from_file("photo.png") as source_image:
        image = presentation.images.add_image(source_image)

    picture_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 50, 50, 400, 260, image)
    image_transform = picture_frame.picture_format.picture.image_transform
    brightness_contrast = image_transform.add_brightness_contrast_effect(15, 20)

    effective_values = brightness_contrast.get_effective()
    print("Brightness: " + str(effective_values.brightness) + "%")
    print("Contrast: " + str(effective_values.contrast) + "%")

    with slide.get_image() as preview:
        preview.save("brightness-contrast-preview.png")

A BrightnessContrast az Office 2010 kép‑effektus kiterjesztése, és kevésbé hordozható, mint a szabványos DrawingML fényerő‑effektus. Ha a fényerő és kontraszt szerkeszthetőnek kell maradnia egy PPTX körkörös mentés után, használja a ImageTransformOperationCollection.add_luminance_effect metódust, és ellenőrizze az eredményt a fájl újra megnyitása után. A formátumkorlátozások szekció részletesebben ismerteti ezt a különbséget.

Színátalakítások alkalmazása

A szín‑effektusok függetlenül alkalmazhatók különböző képkeretekre, amelyek ugyanazt a képernyőforrást használják. Az alábbi példa öt keretet hoz létre, és szürkeskálát, duotont, színátmenetet, HSL‑korrekciót és színcsere‑effektust alkalmaz.

A Duotone két függetlenül szerkeszthető színparamétert tartalmaz: a color1 a sötét pixeleket, a color2 a világos pixeleket térképezi. Ez egy jó példa olyan hatásra, amelynek beállításai összetettebbek, mint egy egyszerű skalárérték.

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    with slides.Images.from_file("photo.png") as source_image:
        image = presentation.images.add_image(source_image)

    gray_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 20, 20, 180, 120, image)
    gray_frame.picture_format.picture.image_transform.add_gray_scale_effect()

    duotone_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 220, 20, 180, 120, image)
    duotone = duotone_frame.picture_format.picture.image_transform.add_duotone_effect()
    duotone.color1.color = draw.Color.navy
    duotone.color2.color = draw.Color.gold

    tint_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 420, 20, 180, 120, image)
    tint_frame.picture_format.picture.image_transform.add_tint_effect(210, 35)

    hsl_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 120, 170, 180, 120, image)
    hsl_frame.picture_format.picture.image_transform.add_hsl_effect(30, 20, -10)

    replacement_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 320, 170, 180, 120, image)
    color_replacement = replacement_frame.picture_format.picture.image_transform.add_color_replace_effect()
    color_replacement.color.color = draw.Color.cornflower_blue

    presentation.save("color-transformations.pptx", slides.export.SaveFormat.PPTX)

Az add_color_replace_effect minden pixel színét egy fix színre cseréli, miközben megőrzi az alfat. Ez különbözik az add_color_change_effect‑től, amely egy forrás‑színt egy másikra térképezi, és mind a forrás, mind a cél színformátumát ki is teszi.

Elmosás, átlátszóság és alfa‑effektusok hozzáadása

Az add_blur_effect minden színcsatornára, beleértve az alfat is, hat. Állítsa a grow értékét True‑ra, ha az elmosott él túlnyúlhat az eredeti kép határain.

Egyenletes átlátszósághoz használja a add_alpha_modulate_fixed_effect‑t. Ez minden meglévő alfa‑értéket megszoroz, így a részben átlátszó pixelek arányosan különböznek. Az add_alpha_replace_effect ehelyett egyetlen alfa‑értéket rendel minden pixelhez. Az add_alpha_bi_level_effect két szintre konvertálja az alfat egy küszöb alapján.

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    with slides.Images.from_file("photo.png") as source_image:
        image = presentation.images.add_image(source_image)

    blurred_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 20, 20, 200, 140, image)
    blur = blurred_frame.picture_format.picture.image_transform.add_blur_effect(4.5, True)
    blur.radius = 5

    transparent_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 240, 20, 200, 140, image)
    alpha_modulate = transparent_frame.picture_format.picture.image_transform.add_alpha_modulate_fixed_effect(65)
    alpha_modulate.amount = 60

    uniform_alpha_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 20, 180, 200, 140, image)
    uniform_alpha_frame.picture_format.picture.image_transform.add_alpha_replace_effect(55)

    binary_alpha_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 240, 180, 200, 140, image)
    alpha_bi_level = binary_alpha_frame.picture_format.picture.image_transform.add_alpha_bi_level_effect(50)
    alpha_bi_level.threshold = 45
    binary_alpha_frame.picture_format.picture.image_transform.add_alpha_inverse_effect()

    presentation.save("blur-and-alpha-effects.pptx", slides.export.SaveFormat.PPTX)

A paraméter‑nélküli alfa‑operációk közé tartozik még a add_alpha_ceiling_effect, amely minden nem nulla alfat teljesen átlátszatlanná teszi; a add_alpha_floor_effect, amely minden alfatot 100 % alatti értéknél teljesen átlátszóvá változtat; valamint a add_alpha_inverse_effect, amely az alfat 100% - alfa értékre állítja.

Rendezett hatlánc felépítése

Minden add_..._effect metódus új műveletet fűz a gyűjtemény végéhez. A renderelő a gyűjteményt egy rendezett csővezetékként használja: a 0‑s művelet kimenete a 1‑es bemenete, és így tovább. Ennek következtében a műveletek különböző sorrendben történő elrendezése más képet eredményezhet.

Például a szürkeskála, majd a színátmenet először eltávolítja a kromatikus információt, majd a fényességet színezi újra. A színátmenet, majd a szürkeskála visszaállítja a színátmenetet. Hasonlóképpen, az alfa‑csere felülírhatja a korábbi műveletek által kiszámított alfa‑értékeket, míg az alfa‑moduláció megőrzi azok relatív különbségeit.

Az alábbi példa egy négy‑műveletes láncot épít fel, PPTX‑ként menti, újra megnyitja a prezentációt, ellenőrzi a művelettípusokat és azok sorrendjét, majd a megnyitott eredményt rendereli:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    with slides.Images.from_file("photo.png") as source_image:
        image = presentation.images.add_image(source_image)

    picture_frame = slide.shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 50, 50, 400, 260, image)
    image_transform = picture_frame.picture_format.picture.image_transform
    image_transform.add_gray_scale_effect()
    image_transform.add_tint_effect(220, 25)
    image_transform.add_blur_effect(2.5, False)
    image_transform.add_alpha_modulate_fixed_effect(80)

    presentation.save("image-transform-chain.pptx", slides.export.SaveFormat.PPTX)

with slides.Presentation("image-transform-chain.pptx") as reopened_presentation:
    reopened_shape = reopened_presentation.slides[0].shapes[0]

    if isinstance(reopened_shape, slides.PictureFrame):
        reopened_transform = reopened_shape.picture_format.picture.image_transform
        order_is_preserved = (
            len(reopened_transform) == 4 and
            isinstance(reopened_transform[0], slides.effects.GrayScale) and
            isinstance(reopened_transform[1], slides.effects.Tint) and
            isinstance(reopened_transform[2], slides.effects.Blur) and
            isinstance(reopened_transform[3], slides.effects.AlphaModulateFixed)
        )
        print("The effect chain was preserved." if order_is_preserved else "The effect chain changed during the round trip.")

        with reopened_presentation.slides[0].get_image() as rendered_slide:
            rendered_slide.save("reopened-effect-chain.png")
    else:
        print("The reopened shape is not a picture frame.")

A gyűjtemény nem kényszerít kompatibilitási mátrixot, amely szín, alfa és elmosás műveleteket külön láncokra korlátozna. Kombinálhatók, de a kombinációk nem mindig hasznosak. Egy fix színcsere eltávolítja a korábbi szín‑effektusok által generált RGB‑variációt; a szürkeskála duoton után eltávolítja a két kiválasztott színt; az alfa‑plafon, -padló, -csere vagy -két‑szintű műveletek eldobhatják a korábban létrehozott alfa‑részleteket. Építse fel a láncot a kívánt pixel‑feldolgozási sorozat szerint, és ne tekintse elemeit rendezetlen formázási jelzőknek.

Szerkeszthető és hatékony értékek vizsgálata

A szerkeszthető művelet az a objektum, amely a Picture.image_transform‑ben tárolódik. A hatástól függően közvetlenül is elérhetők írható tagok. Például a Blur a radius és grow tulajdonságokat teszi írhatóvá, az AlphaModulateFixed az amount‑ot, az AlphaBiLevel a threshold‑ot. A Duotone szín‑effektus pedig módosítható ColorFormat objektumokat jelenít meg.

Néhány művelet, például a BrightnessContrast, a HSL, a Tint és az AlphaReplace, nem teszik írhatóvá a létrehozáskor megadott skalár‑értékeket. Ezek beállításához távolítsa el a műveletet, és a kívánt pozícióban adjon hozzá egy újat.

A get_effective() által visszaadott hatékony adat kiszámított és csak‑olvasásra alkalmas. Hasznos a téma‑függő színek feloldásához és a renderelő által használt normalizált értékek megismeréséhez, de nem egy újabb szerkesztési felület. Az alábbi példa felsorolja a láncot, és ott vizsgálja a hatékony értékeket, ahol a megfelelő API ezt biztosítja:

import aspose.slides as slides

with slides.Presentation("image-transform-chain.pptx") as presentation:
    picture_frame = None

    for shape in presentation.slides[0].shapes:
        if isinstance(shape, slides.PictureFrame):
            picture_frame = shape
            break

    if picture_frame is not None:
        image_transform = picture_frame.picture_format.picture.image_transform

        for index, operation in enumerate(image_transform):
            print(str(index) + ": " + type(operation).__name__)

            if isinstance(operation, slides.effects.BrightnessContrast):
                effect_data = operation.get_effective()
                print("  Brightness: " + str(effect_data.brightness))
                print("  Contrast: " + str(effect_data.contrast))
            elif isinstance(operation, slides.effects.Luminance):
                effect_data = operation.get_effective()
                print("  Brightness: " + str(effect_data.brightness))
                print("  Contrast: " + str(effect_data.contrast))
            elif isinstance(operation, slides.effects.Duotone):
                effect_data = operation.get_effective()
                print("  Dark color: " + str(effect_data.color1))
                print("  Light color: " + str(effect_data.color2))
            elif isinstance(operation, slides.effects.ColorReplace):
                effect_data = operation.get_effective()
                print("  Replacement color: " + str(effect_data.color))
            elif isinstance(operation, slides.effects.HSL):
                effect_data = operation.get_effective()
                print("  HSL: " + str(effect_data.hue) + ", " + str(effect_data.saturation) + ", " + str(effect_data.luminance))
            elif isinstance(operation, slides.effects.Tint):
                effect_data = operation.get_effective()
                print("  Tint: " + str(effect_data.hue) + ", " + str(effect_data.amount))
            elif isinstance(operation, slides.effects.Blur):
                effect_data = operation.get_effective()
                print("  Blur radius: " + str(effect_data.radius) + " pt")
            elif isinstance(operation, slides.effects.AlphaModulateFixed):
                effect_data = operation.get_effective()
                print("  Alpha amount: " + str(effect_data.amount) + "%")
            elif isinstance(operation, slides.effects.AlphaReplace):
                effect_data = operation.get_effective()
                print("  Replacement alpha: " + str(effect_data.alpha) + "%")
            elif isinstance(operation, slides.effects.AlphaBiLevel):
                effect_data = operation.get_effective()
                print("  Alpha threshold: " + str(effect_data.threshold) + "%")

A paraméter‑nélküli hatások, mint a szürkeskála, alfa‑plafon vagy alfa‑inverz, szintén rendelkeznek hatékony‑adat objektummal, de nincs kiírható skalár‑beállításuk. Jelenlétük és pozíciójuk a gyűjteményben a fontos információ.

Képtranszformációk eltávolítása vagy törlése

Használja a ImageTransformOperationCollection.remove_at metódust egy művelet index szerinti eltávolításához. Mivel az indexek az eltávolítás után eltolódnak, először keresse meg a célt, majd a felsorolás után távolítsa el. A clear() a teljes lánc eltávolítására szolgál.

import aspose.slides as slides

with slides.Presentation("image-transform-chain.pptx") as presentation:
    picture_frame = None

    for shape in presentation.slides[0].shapes:
        if isinstance(shape, slides.PictureFrame):
            picture_frame = shape
            break

    if picture_frame is not None:
        image_transform = picture_frame.picture_format.picture.image_transform
        blur_index = None

        for index, operation in enumerate(image_transform):
            if isinstance(operation, slides.effects.Blur):
                blur_index = index
                break

        if blur_index is not None:
            image_transform.remove_at(blur_index)
            print("The blur operation was removed.")

        image_transform.clear()
        print("Remaining operations: " + str(len(image_transform)))
        presentation.save("image-transforms-cleared.pptx", slides.export.SaveFormat.PPTX)

A transzformációk eltávolítása vagy törlése csak a kép formázását módosítja. Nem törli, nem tömöríti újra, és nem változtatja meg a újrahasznált PPImage forrását.

Prezentációs formátumok és exportcélok figyelembevétele

A képtranszformációk a DrawingML‑ből származnak, ezért a PPTX a leginkább szerkeszthető formátum a hatláncok számára. Még PPTX‑nél sem minden művelet rendelkezik azonos hordozhatósággal:

  • A szabványos DrawingML műveletek, mint a luminancia, szürkeskála, duotone, tint, HSL, elmosás és a gyakori alfa‑műveletek, a legnagyobb eséllyel maradnak meg egy PPTX körkörös mentés után. Mindig nyissa meg újra a generált fájlt, és ellenőrizze a gyűjteményt, ha a megőrzés kötelező.
  • A BrightnessContrast egy Office 2010 kiterjesztés, nem a szabványos DrawingML luminancia‑művelet. Memóriában történő rendereléshez használható, de nem garantált, hogy a PPTX‑mentés és újra‑megnyitás után szerkeszthető BrightnessContrast műveletként marad. Tartós fényerő‑ és kontraszt‑korrekcióhoz részesítse előnyben az add_luminance_effect‑et.
  • A bináris PPT formátum előzi a teljes DrawingML‑effektus modellt. PPT‑re mentéskor a nem támogatott műveletek kihagyásra, a lánc támogatott részhalmazra csökkentésére vagy a megjelenés közelítésére kerülhet sor. Ne használja a PPT‑t ellenőrző formátumként összetett szerkeszthető láncok esetén.
  • PNG, JPEG, TIFF, PDF, SVG, HTML vagy más vizuális kimenetek a támogatott láncot alkalmazzák a megjelenő képhez. Ezek a kimenetek nem tartalmazzák a szerkeszthető ImageTransformOperationCollection‑t; a raszter formátumok a végeredményt pixelekké lapítják, a dokumentum‑ vagy vektor‑exportok pedig saját renderelési reprezentációt tárolnak.
  • Az effektek nem teszik magukévá a linkelt képet. Egy linkelt kép renderelése továbbra is a linkelt erőforrás rendelkezésre állásától függ a prezentáció betöltésekor.

Különböző prezentáció‑fogyasztók eltérően renderelhetik a szélsőséges eseteket, különösen ha több alfa‑ vagy szín‑kvantálási műveletet kombinálnak. Kritikus kimenetek esetén tesztelje mind a szerkeszthető körkörös mentést, mind a végső export formátumot ugyanazzal az Aspose.Slides verzióval, amelyet a termelésben használ.

GYIK

Módosítják a képtranszformációs hatások a beágyazott kép adatokat?

Nem. A műveletek a képkitöltéshez tartozó Picture‑hez tartoznak. A mögöttes PPImage bájtjai változatlanok maradnak.

Két képkeret, amely ugyanazt a képet használja, megosztja a hatásokat?

Nem. A PPImage újrahasználata elkerüli a duplikált képadatok tárolását, de minden képkeret általában külön Picture‑t és külön képtranszformációs gyűjteményt kap.

Kombinálhatók a szín, elmosás és alfa hatások?

Igen. A gyűjtemény engedélyezi őket egy rendezett láncban. Fontolja meg, hogy az egyes műveletek hogyan befolyásolják az előző kimenetét, mivel a csere‑ és küszöb‑műveletek eldobhatják az előző szín‑ vagy alradet.

Miért csak‑olvasásúak a hatékony értékek?

A hatékony adatok a rendereléshez használt, kiszámított értékeket képviselik, beleértve a feloldott színeket is. Szerkessze a transzformációs gyűjteményben tárolt műveletet, ahol írható tagok vannak; egyébként távolítsa el, és adjon hozzá egy újat az új létrehozási paraméterekkel.

Melyik formátumot használjam a transzformációs lánc megőrzéséhez?

Használjon PPTX‑et, és ellenőrizze a fájlt a újra‑megnyitással. A régi PPT nem képes a teljes DrawingML‑effektus modellt ábrázolni, és a renderelt export formátumok csak a megjelenést, nem a szerkeszthető transzformációs műveleteket őrzik meg.