إدارة إطارات الصور في العروض التقديمية على Android

إطار الصورة هو شكل يحتوي على صورة — إنه مثل صورة داخل إطار.

يمكنك إضافة صورة إلى شريحة عبر إطار صورة. بهذه الطريقة، يمكنك تنسيق الصورة عن طريق تنسيق إطار الصورة.

إنشاء إطار صورة

  1. إنشاء مثيل من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. إنشاء كائن IPPImage عن طريق إضافة صورة إلى IImagescollection المرتبطة بكائن العرض التقديمي الذي سيُستخدم لملء الشكل.
  4. تحديد عرض وارتفاع الصورة.
  5. إنشاء إطار صورة PictureFrame بناءً على عرض وارتفاع الصورة من خلال طريقة AddPictureFrame التي يوفرها كائن الشكل المرتبط بالشريحة المشار إليها.
  6. إضافة إطار صورة (يحتوي على الصورة) إلى الشريحة.
  7. كتابة العرض التقديمي المعدل كملف PPTX.

يظهر لك هذا الرمز Java كيفية إنشاء إطار صورة:

// ينشئ كائن من فئة Presentation التي تمثل ملف PPTX
Presentation pres = new Presentation();
try {
    // يحصل على الشريحة الأولى
    ISlide sld = pres.getSlides().get_Item(0);
    
    // ينشئ كائن من فئة Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    // يضيف إطار صورة بارتفاع وعرض الصورة المتساويين
    sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // يكتب ملف PPTX إلى القرص
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

إنشاء إطار صورة مع المقياس النسبي

من خلال تعديل مقياس الصورة النسبي، يمكنك إنشاء إطار صورة أكثر تعقيدًا.

  1. إنشاء مثيل من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. إضافة صورة إلى مجموعة صور العرض التقديمي.
  4. إنشاء كائن IPPImage عن طريق إضافة صورة إلى IImagescollection المرتبطة بكائن العرض التقديمي الذي سيُستخدم لملء الشكل.
  5. تحديد عرض وارتفاع الصورة النسبيين في إطار الصورة.
  6. كتابة العرض التقديمي المعدل كملف PPTX.

يوضح هذا الرمز Java كيفية إنشاء إطار صورة مع المقياس النسبي:

// إنشاء فئة Presentation التي تمثل ملف PPTX
Presentation pres = new Presentation();
try {
    // الحصول على الشريحة الأولى
    ISlide sld = pres.getSlides().get_Item(0);
    
    // إنشاء فئة Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    
    // إضافة إطار صورة بارتفاع وعرض مطابقين للصورة
    IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // ضبط نسبة التدرج النسبي للعرض والارتفاع
    pf.setRelativeScaleHeight(0.8f);
    pf.setRelativeScaleWidth(1.35f);
    
    // كتابة ملف PPTX إلى القرص
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

استخراج الصور النقطية من إطارات الصور

يمكنك استخراج الصور النقطية من كائنات PictureFrame وحفظها بصيغ PNG وJPG وغيرها. يوضح مثال الشيفرة أدناه كيفية استخراج صورة من المستند “sample.pptx” وحفظها بصيغة 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();
}

استخراج صور SVG من إطارات الصور

عندما يحتوي عرض تقديمي على رسومات SVG موضوعة داخل أشكال PictureFrame ، تتيح Aspose.Slides لنظام Android عبر Java استرجاع الصور المتجهة الأصلية بجودة كاملة. عن طريق استعراض مجموعة أشكال الشريحة، يمكنك تحديد كل PictureFrame، والتحقق مما إذا كانت IPPImage تحمل محتوى SVG، ثم حفظ تلك الصورة إلى القرص أو إلى تدفق بصيغة SVG الأصلية.

يوضح مثال الشيفرة التالي كيفية استخراج صورة SVG من إطار صورة:

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();
}

الحصول على شفافية الصورة

تتيح لك Aspose.Slides الحصول على تأثير الشفافية المطبق على الصورة. يوضح هذا الرمز Java العملية:

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);
    }
}

تنسيق إطار الصورة

توفر Aspose.Slides العديد من خيارات التنسيق التي يمكن تطبيقها على إطار الصورة. باستخدام هذه الخيارات، يمكنك تعديل إطار الصورة لجعله يتوافق مع المتطلبات المحددة.

  1. إنشاء مثيل من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. إنشاء كائن IPPImage عن طريق إضافة صورة إلى IImagescollection المرتبطة بكائن العرض التقديمي الذي سيُستخدم لملء الشكل.
  4. تحديد عرض وارتفاع الصورة.
  5. إنشاء إطار صورة PictureFrame بناءً على عرض وارتفاع الصورة من خلال طريقة AddPictureFrame التي يوفرها كائن IShapes المرتبط بالشريحة المشار إليها.
  6. إضافة إطار صورة (يحتوي على الصورة) إلى الشريحة.
  7. ضبط لون خط إطار الصورة.
  8. ضبط عرض خط إطار الصورة.
  9. تدوير إطار الصورة بإعطائه قيمة إما موجبة أو سالبة.
    • القيمة الموجبة تدور الصورة باتجاه عقارب الساعة.
    • القيمة السالبة تدور الصورة عكس اتجاه عقارب الساعة.
  10. إضافة إطار صورة (يحتوي على الصورة) إلى الشريحة.
  11. كتابة العرض التقديمي المعدل كملف PPTX.

يظهر لك هذا الرمز Java عملية تنسيق إطار الصورة:

// ينشئ كائن من فئة Presentation التي تمثل ملف PPTX
Presentation pres = new Presentation();
try {
    // يحصل على الشريحة الأولى
    ISlide sld = pres.getSlides().get_Item(0);
    
    // ينشئ كائن من فئة Image
    IPPImage imgx = pres.getImages().addImage(new FileInputStream(new File("asp1.jpg")));
    
    // يضيف إطار صورة بارتفاع وعرض مساويين للصورة
    IPictureFrame pf = sld.getShapes().addPictureFrame(ShapeType.Rectangle, 50, 150, imgx.getWidth(), imgx.getHeight(), imgx);
    
    // يطبق بعض التنسيقات على PictureFrameEx
    pf.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    pf.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
    pf.getLineFormat().setWidth(20);
    pf.setRotation(45);
    
    // يكتب ملف PPTX إلى القرص
    pres.save("RectPicFrame.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

إضافة صورة كرابط

لتجنب أحجام عروض تقديمية كبيرة، يمكنك إضافة صور (أو فيديوهات) عبر روابط بدلاً من تضمين الملفات مباشرة في العروض. يوضح هذا الرمز Java كيفية إضافة صورة وفيديو إلى عنصر نائب:

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();
}

قص الصور

يظهر لك هذا الرمز Java كيفية قص صورة موجودة على شريحة:

Presentation pres = new Presentation();
// ينشئ كائن صورة جديد
try {
    IPPImage picture;
    IImage image = Images.fromFile(imagePath);
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // يضيف إطار صورة إلى الشريحة
    IPictureFrame picFrame = pres.getSlides().get_Item(0).getShapes().addPictureFrame(
            ShapeType.Rectangle, 100, 100, 420, 250, picture);

    // يقص الصورة (قيم النسب المئوية)
    picFrame.getPictureFormat().setCropLeft(23.6f);
    picFrame.getPictureFormat().setCropRight(21.5f);
    picFrame.getPictureFormat().setCropTop(3);
    picFrame.getPictureFormat().setCropBottom(31);

    // يحفظ النتيجة
    pres.save(outPptxFile, SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

حذف المناطق المقصوصة من صورة

إذا رغبت في حذف المناطق المقصوصة من صورة موجودة داخل إطار، يمكنك استخدام طريقة deletePictureCroppedAreas() . تُعيد هذه الطريقة الصورة المقصوصة أو الصورة الأصلية إذا لم يكن القص ضروريًا.

يظهر هذا الرمز Java العملية:

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

    // يحصل على إطار الصورة من الشريحة الأولى
    IPictureFrame picFrame = (IPictureFrame)slide.getShapes().get_Item(0);

    // يحذف المناطق المقصوصة من صورة إطار الصورة ويعيد الصورة المقصوصة
    IPPImage croppedImage = picFrame.getPictureFormat().deletePictureCroppedAreas();

    // يحفظ النتيجة
    presentation.save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat.Pptx);
} finally {
    if (presentation != null) presentation.dispose();
}

قفل نسبة العرض إلى الارتفاع

إذا رغبت في أن يحتفظ الشكل الذي يحتوي على صورة بنسبة عرضه إلى ارتفاعه حتى بعد تغيير أبعاد الصورة، يمكنك استخدام طريقة setAspectRatioLocked لتعيين إعداد قفل نسبة العرض إلى الارتفاع.

يظهر لك هذا الرمز Java كيفية قفل نسبة عرض الشكل:

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);

    // ضبط الشكل للحفاظ على نسبة العرض إلى الارتفاع عند إعادة التحجيم
    pictureFrame.getPictureFrameLock().setAspectRatioLocked(true);
} catch(IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

استخدام خاصية StretchOff

باستخدام خصائص StretchOffsetLeft، StretchOffsetTop، StretchOffsetRight وStretchOffsetBottom من واجهة IPictureFillFormat وفئة PictureFillFormat، يمكنك تحديد مستطيل ملء.

عند تحديد تمديد لصورة، يتم تحجيم المستطيل المصدر ليتوافق مع مستطيل الملء المحدد. كل حافة من حواف مستطيل الملء تُعرف بنسبة إزاحة من الحافة المقابلة لصندوق حد الشكل. النسبة الموجبة تشير إلى إدخال داخلي بينما النسبة السالبة تشير إلى إخراج خارجي.

  1. إنشاء مثيل من الفئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرسها.
  3. إضافة مستطيل AutoShape.
  4. إنشاء صورة.
  5. ضبط نوع تعبئة الشكل.
  6. ضبط وضع تعبئة الصورة للشكل.
  7. إضافة صورة محددة لملء الشكل.
  8. تحديد إزاحات الصورة من الحافة المقابلة لصندوق حد الشكل.
  9. كتابة العرض التقديمي المعدل كملف PPTX.

يوضح هذا الرمز Java عملية استخدام خاصية StretchOff:

// ينشئ كائن من فئة Presentation التي تمثل ملف PPTX
Presentation pres = new Presentation();
try {
    // يحصل على الشريحة الأولى
    ISlide slide = pres.getSlides().get_Item(0);

    // ينشئ كائن من فئة ImageEx
    IPPImage picture;
    IImage image = Images.fromFile("aspose-logo.jpg");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // يضيف AutoShape من نوع Rectangle
    IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);

    // يضبط نوع تعبئة الشكل
    aShape.getFillFormat().setFillType(FillType.Picture);

    // يضبط وضع تعبئة الصورة للشكل
    aShape.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);

    // يحدد الصورة لتعبئة الشكل
    aShape.getFillFormat().getPictureFillFormat().getPicture().setImage(picture);

    // يحدد إزاحات الصورة من الحافة المقابلة لمربع حدود الشكل
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetLeft(25);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetRight(25);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetTop(-20);
    aShape.getFillFormat().getPictureFillFormat().setStretchOffsetBottom(-10);
    
    // يكتب ملف PPTX إلى القرص
    pres.save("StretchOffsetLeftForPictureFrame_out.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

الأسئلة المتكررة

كيف يمكنني معرفة تنسيقات الصور المدعومة لإطار الصورة؟

يدعم Aspose.Slides كل من الصور النقطية (PNG، JPEG، BMP، GIF، إلخ) والصور المتجهة (مثل SVG) عبر كائن الصورة المخصص لــ PictureFrame. تتقاطع قائمة الصيغ المدعومة عمومًا مع قدرات محرك تحويل الشرائح والصور.

كيف سيؤثر إضافة العشرات من الصور الكبيرة على حجم PPTX والأداء؟

يؤدي تضمين صور كبيرة إلى زيادة حجم الملف واستهلاك الذاكرة؛ يساعد ربط الصور في الحفاظ على صغر حجم العرض لكن يتطلب بقاء الملفات الخارجية متاحة. يوفّر Aspose.Slides إمكانية إضافة الصور عبر روابط لتقليل حجم الملف.

كيف يمكنني قفل كائن الصورة لمنع تحريكه/تغييره غير المقصود؟

استخدم قفل الأشكال لـ PictureFrame (مثلاً لتعطيل التحريك أو إعادة التحجيم). يدعم آلية القفل أنواعًا مختلفة من الأشكال، بما فيها PictureFrame.

هل يتم الحفاظ على دقة متجه SVG عند تصدير العرض التقديمي إلى PDF/الصور؟

تتيح Aspose.Slides استخراج SVG من PictureFrame كمتجه أصلي. عند التصدير إلى PDF أو إلى صيغ نقطية، قد يتم تحويل النتيجة إلى نقطية وفقًا لإعدادات التصدير؛ يبقى الاحتفاظ بـ SVG كمتجه واضحًا من سلوك الاستخراج.