สกัดรูปภาพจากรูปร่างในงานนำเสนอด้วย .NET

ภาพรวม

รูปภาพในงานนำเสนออาจปรากฏในหลายประเภทของรูปร่าง: เป็นกรอบรูปธรรมดา, เป็นพื้นหลังรูปที่ใส่ในรูปร่าง, เป็นภาพตัวอย่างของวัตถุ OLE, เป็นภาพย่อของเฟรมวิดีโอหรือเสียง, เป็นรูปซูม, หรือเป็นรูปที่ฝังอยู่ภายในรูปร่างตาราง, แผนภูมิและ SmartArt. Aspose.Slides จัดเก็บรูปเหล่านี้ในคอลเลกชันรูปของงานนำเสนอ ซึ่งเปิดให้เข้าถึงผ่านอ็อบเจกต์ ImageCollection และ IPPImage.

หากคุณต้องการส่งออกทรัพยากรรูปภาพทุกไฟล์ที่ฝังอยู่ในงานนำเสนอ ให้วนลูปผ่าน presentation.Images. บทความนี้เน้นงานที่ต่างออกไป: การท่องรูปร่างเพื่อค้นหาที่ที่รูปภาพถูกใช้บนสไลด์ เพื่อตั้งชื่อไฟล์ที่บันทึกให้มีข้อมูลบริบทที่เป็นประโยชน์ เช่น หมายเลขสไลด์, ตำแหน่งรูปร่าง และประเภทแหล่งที่ม (กรอบรูป, รูปพื้นหลัง, ตัวอย่างสื่อ, ตัวอย่าง OLE หรือรูปซูม).

เมธอดช่วยเหลือที่ใช้ร่วมกัน

เมธอดช่วยเหลือด้านล่างทำให้ตัวอย่างสั้นลง SaveOriginalImage จะเขียนไบต์ที่ฝังอยู่เดิม, เลือกสกุลไฟล์ที่ปลอดภัยจาก MIME type, และข้ามรูปภาพซ้ำโดยใช้แฮช SHA-256.

using Aspose.Slides;
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;

private static bool SaveOriginalImage(
    IPPImage image,
    string outputDirectory,
    string fileNameBase,
    ISet<string> savedImageHashes)
{
    byte[] imageData = image.BinaryData;
    string imageHash = GetSha256Hash(imageData);
    if (!savedImageHashes.Add(imageHash))
    {
        return false;
    }

    string extension = GetExtensionFromContentType(image.ContentType);
    string fileName = $"{fileNameBase}.{extension}";
    string outputPath = Path.Combine(outputDirectory, fileName);
    File.WriteAllBytes(outputPath, imageData);
    return true;
}

private static void SaveImageAsPng(IPPImage image, string outputDirectory, string fileNameBase)
{
    string fileName = $"{fileNameBase}.png";
    string outputPath = Path.Combine(outputDirectory, fileName);

    using (IImage outputImage = image.Image)
    {
        outputImage.Save(outputPath, ImageFormat.Png);
    }
}

private static IPPImage GetPictureFillImage(IFillFormat fillFormat)
{
    if (fillFormat == null || fillFormat.FillType != FillType.Picture)
    {
        return null;
    }

    return fillFormat.PictureFillFormat.Picture.Image;
}

private static IEnumerable<(IShape Shape, string NamePart)> EnumerateShapes(
    IShapeCollection shapes,
    string prefix,
    bool includeGroupedShapes)
{
    int shapeCount = shapes.Count;
    for (int shapeIndex = 0; shapeIndex < shapeCount; shapeIndex++)
    {
        IShape shape = shapes[shapeIndex];
        int displayIndex = shapeIndex + 1;
        string shapeNamePart = $"{prefix}_shape_{displayIndex}";
        yield return (shape, shapeNamePart);

        if (includeGroupedShapes && shape is IGroupShape groupShape)
        {
            foreach ((IShape Shape, string NamePart) childShape in EnumerateShapes(
                groupShape.Shapes,
                shapeNamePart,
                includeGroupedShapes))
            {
                yield return childShape;
            }
        }
    }
}

private static string GetSha256Hash(byte[] data)
{
    using (SHA256 sha256 = SHA256.Create())
    {
        byte[] hash = sha256.ComputeHash(data);
        return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
    }
}

private static string GetExtensionFromContentType(string contentType)
{
    if (string.IsNullOrWhiteSpace(contentType))
    {
        return "bin";
    }

    string mediaType = contentType.Split(';')[0].Trim().ToLowerInvariant();
    switch (mediaType)
    {
        case "image/jpeg":
            return "jpg";
        case "image/png":
            return "png";
        case "image/gif":
            return "gif";
        case "image/bmp":
            return "bmp";
        case "image/tiff":
            return "tiff";
        case "image/x-emf":
        case "image/emf":
            return "emf";
        case "image/x-wmf":
        case "image/wmf":
            return "wmf";
        case "image/svg+xml":
            return "svg";
        default:
            if (mediaType.StartsWith("image/"))
            {
                string extension = mediaType.Substring("image/".Length);
                return MakeSafeFileNamePart(extension);
            }

            return "bin";
    }
}

private static string MakeSafeFileNamePart(string value)
{
    foreach (char invalidCharacter in Path.GetInvalidFileNameChars())
    {
        value = value.Replace(invalidCharacter, '_');
    }

    return value;
}

สกัดรูปภาพจากกรอบรูป

ใช้วิธีนี้สำหรับรูปที่แทรกเป็นอ็อบเจกต์อิสระ. IPictureFrame เก็บรูปภาพใน PictureFormat.Picture.Image, ซึ่งคืนค่าอ็อบเจกต์ IPPImage.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "extracted-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is IPictureFrame pictureFrame)
            {
                IPPImage image = pictureFrame.PictureFormat.Picture.Image;
                SaveOriginalImage(image, outputDirectory, item.NamePart, savedImageHashes);
            }
        }
    }
}

สกัดรูปภาพจากรูปร่างที่เติมรูป

รูปร่างสามารถใช้รูปเป็นพื้นหลังได้. ตรวจสอบประเภทการเติมของรูปร่างก่อน: หากไม่ใช่ FillType.Picture, จะไม่มีรูปให้สกัดจากการเติมนั้น. ตัวอย่างด้านล่างจัดการอ็อบเจกต์ IAutoShape และบันทึกรูปแต่ละไฟล์เป็น PNG ผ่าน IPPImage.Image.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "shape-fill-images");
Directory.CreateDirectory(outputDirectory);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is IAutoShape autoShape)
            {
                IPPImage image = GetPictureFillImage(autoShape.FillFormat);
                if (image != null)
                {
                    SaveImageAsPng(image, outputDirectory, item.NamePart);
                }
            }
        }
    }
}

สกัดรูปภาพตัวอย่างจากกรอบวัตถุ OLE

IOleObjectFrame สามารถมีรูปทดแทนที่ PowerPoint ใช้เป็นตัวอย่างของวัตถุบนสไลด์. รูปนี้สามารถเข้าถึงได้ผ่าน SubstitutePictureFormat.Picture.Image. การสกัดรูปนี้จะให้ได้รูปตัวอย่าง, ไม่ใช่เนื้อหาแพ็คเกจ OLE ที่ฝังอยู่.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "ole-preview-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is IOleObjectFrame oleObjectFrame)
            {
                IPPImage image = oleObjectFrame.SubstitutePictureFormat.Picture.Image;
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_ole_preview";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }
            }
        }
    }
}

สกัดรูปภาพตัวอย่างจากกรอบวิดีโอ

IVideoFrame สามารถเก็บรูปตัวอย่างใน PictureFormat.Picture.Image. นี่คือโปสเตอร์หรือภาพย่อที่แสดงบนสไลด์, ไม่ใช่เฟรมที่ถอดรหัสจากสตรีมวิดีโอ.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "video-preview-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is IVideoFrame videoFrame)
            {
                IPPImage image = videoFrame.PictureFormat.Picture.Image;
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_video_preview";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }
            }
        }
    }
}

สกัดรูปภาพตัวอย่างจากกรอบเสียง

IAudioFrame สามารถเก็บภาพย่อใน PictureFormat.Picture.Image. นี่คือรูปที่แสดงสำหรับวัตถุเสียงบนสไลด์.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "audio-preview-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is IAudioFrame audioFrame)
            {
                IPPImage image = audioFrame.PictureFormat.Picture.Image;
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_audio_preview";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }
            }
        }
    }
}

สกัดรูปภาพจากวัตถุซูม

รูปร่าง IZoomFrame และ ISectionZoomFrame สามารถใช้รูปภาพกำหนดเอง. อ่าน ZoomImage จากเฟรมซูม.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "zoom-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is IZoomFrame zoomFrame && zoomFrame.ZoomImage != null)
            {
                string fileNameBase = $"{item.NamePart}_zoom";
                SaveOriginalImage(zoomFrame.ZoomImage, outputDirectory, fileNameBase, savedImageHashes);
                continue;
            }

            if (item.Shape is ISectionZoomFrame sectionZoomFrame && sectionZoomFrame.ZoomImage != null)
            {
                string fileNameBase = $"{item.NamePart}_section_zoom";
                SaveOriginalImage(sectionZoomFrame.ZoomImage, outputDirectory, fileNameBase, savedImageHashes);
                continue;
            }

        }
    }
}

สกัดรูปภาพจากกรอบซูมสรุป

ISummaryZoomFrame ก็เป็นรูปร่างเช่นกัน. รายการส่วนสรุปของมันอาจใช้รูปภาพกำหนดเอง, ซึ่งเปิดให้เข้าถึงผ่านคุณสมบัติ ZoomImage ของแต่ละส่วนสรุป.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "summary-zoom-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: false))
        {
            if (item.Shape is ISummaryZoomFrame summaryZoomFrame)
            {
                int sectionCount = summaryZoomFrame.SummaryZoomCollection.Count;
                for (int sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++)
                {
                    ISummaryZoomSection section = summaryZoomFrame.SummaryZoomCollection[sectionIndex];
                    if (section.ZoomImage != null)
                    {
                        int displayIndex = sectionIndex + 1;
                        string fileNameBase = $"{item.NamePart}_summary_zoom_{displayIndex}";
                        SaveOriginalImage(section.ZoomImage, outputDirectory, fileNameBase, savedImageHashes);
                    }
                }
            }
        }
    }
}

สกัดรูปภาพจากรูปร่างตาราง

ITable เป็นรูปร่าง. รูปภาพในตารางมักจะถูกเก็บเป็นพื้นหลังรูปในเซลล์ของตาราง.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "table-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: true))
        {
            if (item.Shape is ITable table)
            {
                int rowCount = table.Rows.Count;
                int columnCount = table.Columns.Count;
                for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
                {
                    for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
                    {
                        ICell cell = table[columnIndex, rowIndex];
                        IPPImage image = GetPictureFillImage(cell.CellFormat.FillFormat);
                        if (image != null)
                        {
                            string fileNameBase = $"{item.NamePart}_cell_{rowIndex + 1}_{columnIndex + 1}";
                            SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                        }
                    }
                }
            }
        }
    }
}

สกัดรูปภาพจากรูปร่างแผนภูมิ

IChart เป็นรูปร่าง. ตัวอย่างด้านล่างสกัดรูปภาพจากพื้นหลังรูปของพื้นที่แผนภูมิ.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "chart-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: true))
        {
            if (item.Shape is Aspose.Slides.Charts.IChart chart)
            {
                IFillFormat fillFormat = chart.FillFormat;
                IPPImage image = GetPictureFillImage(fillFormat);
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_chart_area";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }
            }
        }
    }
}

สกัดรูปภาพจากรูปร่าง SmartArt

ISmartArt เป็นอ็อบเจกต์รูปร่าง. ขึ้นอยู่กับเค้าโครง SmartArt, รูปภาพอาจถูกเก็บในพื้นหลังรูปของจุดรายการ (node bullet) หรือในรูปแบบการเติมของรูปร่างจุด.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "smartart-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: true))
        {
            if (item.Shape is Aspose.Slides.SmartArt.ISmartArt smartArt)
            {
                int nodeCount = smartArt.AllNodes.Count;
                for (int nodeIndex = 0; nodeIndex < nodeCount; nodeIndex++)
                {
                    Aspose.Slides.SmartArt.ISmartArtNode node = smartArt.AllNodes[nodeIndex];
                    IPPImage bulletImage = GetPictureFillImage(node.BulletFillFormat);
                    if (bulletImage != null)
                    {
                        string fileNameBase = $"{item.NamePart}_smartart_node_{nodeIndex + 1}_bullet";
                        SaveOriginalImage(bulletImage, outputDirectory, fileNameBase, savedImageHashes);
                    }

                    int nodeShapeCount = node.Shapes.Count;
                    for (int nodeShapeIndex = 0; nodeShapeIndex < nodeShapeCount; nodeShapeIndex++)
                    {
                        var nodeShape = node.Shapes[nodeShapeIndex];
                        IPPImage image = GetPictureFillImage(nodeShape.FillFormat);
                        if (image != null)
                        {
                            string fileNameBase = $"{item.NamePart}_smartart_node_{nodeIndex + 1}_shape_{nodeShapeIndex + 1}";
                            SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                        }
                    }
                }
            }
        }
    }
}

รวมรูปภาพที่อยู่ภายในรูปร่างกลุ่ม

รูปร่างกลุ่มมีคอลเลกชันรูปร่างของตนเอง. ตัวช่วย EnumerateShapes ที่ใช้ร่วมกันมีตัวเลือก includeGroupedShapes. ตั้งค่าเป็น true เมื่อคุณต้องการตรวจสอบรูปร่างภายในอ็อบเจกต์ IGroupShape. ตัวอย่างด้านล่างสกัดรูปภาพจากกรอบรูป, รูปที่เติมในรูปร่าง, ตัวอย่าง OLE, ภาพย่อเฟรมวิดีโอ, และภาพย่อเฟรมเสียง. เพื่อรวมรูปภาพตาราง, แผนภูมิ, SmartArt, และรูปซูมสรุปด้วย, ให้ใช้ตรรกะการสกัดเฉพาะจากส่วนก่อนหน้าโดยยังคงการท่องรูปร่างแบบเรียกซ้ำเหมือนเดิม.

string inputPath = "sample.pptx";
string outputDirectory = Path.Combine(Environment.CurrentDirectory, "all-shape-images");
Directory.CreateDirectory(outputDirectory);

var savedImageHashes = new HashSet<string>(StringComparer.Ordinal);

using (Presentation presentation = new Presentation(inputPath))
{
    foreach (ISlide slide in presentation.Slides)
    {
        string slidePrefix = $"slide_{slide.SlideNumber}";
        foreach ((IShape Shape, string NamePart) item in EnumerateShapes(
            slide.Shapes,
            slidePrefix,
            includeGroupedShapes: true))
        {
            if (item.Shape is IPictureFrame pictureFrame)
            {
                IPPImage image = pictureFrame.PictureFormat.Picture.Image;
                SaveOriginalImage(image, outputDirectory, item.NamePart, savedImageHashes);
                continue;
            }

            if (item.Shape is IAutoShape autoShape)
            {
                IPPImage image = GetPictureFillImage(autoShape.FillFormat);
                if (image != null)
                {
                    SaveOriginalImage(image, outputDirectory, item.NamePart, savedImageHashes);
                }

                continue;
            }

            if (item.Shape is IOleObjectFrame oleObjectFrame)
            {
                IPPImage image = oleObjectFrame.SubstitutePictureFormat.Picture.Image;
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_ole_preview";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }

                continue;
            }

            if (item.Shape is IVideoFrame videoFrame)
            {
                IPPImage image = videoFrame.PictureFormat.Picture.Image;
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_video_preview";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }

                continue;
            }

            if (item.Shape is IAudioFrame audioFrame)
            {
                IPPImage image = audioFrame.PictureFormat.Picture.Image;
                if (image != null)
                {
                    string fileNameBase = $"{item.NamePart}_audio_preview";
                    SaveOriginalImage(image, outputDirectory, fileNameBase, savedImageHashes);
                }
            }
        }
    }
}

กรณีขอบเขตและบันทึกปฏิบัติ

  • รูปภาพซ้ำ: รูปร่างหลายรูปร่างอาจอ้างอิงรูปเดียวกันหรือรูปแยกต่างหากที่มีไบต์เท่ากัน. ทำแฮช IPPImage.BinaryData ก่อนเขียนไฟล์หากคุณต้องการไฟล์ผลลัพธ์หนึ่งไฟล์ต่อรูปภาพที่ไม่ซ้ำ.
  • ข้อมูลดั้งเดิม vs. ผลลัพธ์แปลง: การบันทึก IPPImage.BinaryData จะคงข้อมูล JPEG, PNG, GIF, SVG, EMF หรือ WMF ที่ฝังอยู่. การบันทึก IPPImage.Image ผ่าน IImage.Save มีประโยชน์เมื่อคุณต้องการรูปแบบผลลัพธ์ที่สม่ำเสมอ.
  • ประเภทการเติมที่ไม่รองรับ: รูปร่างที่เติมสีทึบ, ไล่สี, ลวดลาย หรือไม่มีการเติมจะไม่บรรจุรูปภาพ. ตรวจสอบ FillType ก่อนอ่าน PictureFillFormat.
  • รูปร่างกลุ่ม: คอลเลกชันรูปร่างระดับบนของสไลด์ไม่ทำให้กลุ่มแบน. ตรวจสอบอย่างเรียกซ้ำ IGroupShape.Shapes เมื่อเนื้อหากลุ่มมีความสำคัญ.
  • ตัวอย่างวัตถุ OLE: IOleObjectFrame อาจเปิดเผยภาพตัวอย่างผ่าน SubstitutePictureFormat, แต่ภาพนั้นเป็นเพียงตัวอย่างบนสไลด์ ไม่ได้เป็นไฟล์ที่ฝังอยู่ภายในวัตถุ OLE.
  • ภาพย่อเฟรมวิดีโอ: IVideoFrame อาจเปิดเผยภาพตัวอย่างผ่าน PictureFormat, แต่ภาพนั้นเป็นเพียงโปสเตอร์ที่แสดงบนสไลด์ ไม่ได้สกัดจากสตรีมวิดีโอ.
  • ภาพย่อเฟรมเสียง: IAudioFrame อาจเปิดเผยไอคอนหรือภาพย่อผ่าน PictureFormat; ไม่ได้เป็นข้อมูลเสียงที่ฝังอยู่.
  • รูปภาพซูม: รูปร่างซูมสไลด์, ซูมส่วน, และซูมสรุปอาจใช้ IPPImage กำหนดเองผ่าน ZoomImage.
  • โมเดลรูปร่างซ้อนกัน: วัตถุตาราง, แผนภูมิ, และ SmartArt ทำตาม IShape, แต่รูปภาพมักถูกเก็บในวัตถุการจัดรูปแบบของเซลล์ตาราง, ส่วนของแผนภูมิ, หรือโหนด SmartArt ที่ซ้อนกัน.
  • รูปภาพที่ถูกครอปหรือแปลง: การเข้าถึง IPPImage จะให้ทรัพยากรรูปที่เก็บไว้. มันจะไม่แสดงการครอป, ความโปร่งใส, การเปลี่ยนสี, การหมุน หรือเอฟเฟ็กต์ภาพอื่น ๆ ที่รูปแบบของรูปร่างกำหนด.

คำถามที่พบบ่อย

ฉันสามารถสกัดรูปภาพดั้งเดิมโดยไม่ครอป, ไม่ใช้เอฟเฟ็กต์, หรือไม่แปลงรูปร่างได้หรือไม่?

ใช่. เข้าถึงอ็อบเจกต์ IPPImage และเขียน IPPImage.BinaryData ลงดิสก์. วิธีนี้จะคงรูปที่ถูกเข้ารหัสเดิมที่เก็บในงานนำเสนอ, ไม่ใช่วิธีที่รูปแสดงบนสไลด์.

ฉันสามารถส่งออกทุกรูปที่สกัดเป็น PNG ได้หรือไม่?

ใช่. ใช้ IPPImage.Image เพื่อรับอ็อบเจกต์ IImage, แล้วเรียก IImage.Save พร้อม ImageFormat.Png. วิธีนี้จะเปลี่ยนรูปเป็น PNG และอาจไม่ได้รักษาประเภทไฟล์หรือข้อมูลเวกเตอร์เดิม.

ฉันจะหลีกเลี่ยงการบันทึกรูปเดียวกันหลายครั้งได้อย่างไร?

ใช้แฮชของ IPPImage.BinaryData และเก็บแฮชไว้ในเซ็ต. หากรูปใหม่มีแฮชที่มีอยู่แล้ว, ให้ข้ามหรือบันทึกการอ้างอิงอื่นไปยังไฟล์ผลลัพธ์ที่มีอยู่.

ทำไมบางรูปร่างถึงไม่สร้างรูปภาพ?

กรอบรูป, รูปที่เติมในรูปร่าง, กรอบวัตถุ OLE, กรอบสื่อ, กรอบซูม, ตาราง, แผนภูมิ, และอ็อบเจกต์ SmartArt สามารถอ้างอิงรูปภาพได้. บางประเภทรูปร่างเปิดเผยรูปผ่านวัตถุการจัดรูปแบบที่ซ้อนกัน, ดังนั้นการตรวจสอบเพียง PictureFormat หรือ FillFormat ของรูปร่างอาจไม่เพียงพอ.

ฉันสามารถสกัดภาพย่อที่แสดงสำหรับเฟรมวิดีโอได้หรือไม่?

ใช่. ใช้ IVideoFrame.PictureFormat แล้วอ่าน PictureFormat.Picture.Image. วิธีนี้จะสกัดภาพโปสเตอร์ที่เก็บกับเฟรมวิดีโอ, ไม่ใช่เฟรมที่สร้างจากไฟล์วิดีโอ.

ฉันจะกำหนดได้อย่างไรว่ารูปร่างใดใช้รูปภาพเฉพาะจากคอลเลกชันรูปของงานนำเสนอ?

Aspose.Slides ไม่เก็บลิงก์ย้อนกลับจาก IPPImage ไปยังรูปร่าง. ให้สร้างแมพปิ้งในระหว่างการท่อง: เมื่อพบการอ้างอิงรูป, ให้บันทึกหมายเลขสไลด์, เส้นทางรูปร่าง, และแฮชหรือดัชนีของรูปในคอลเลกชัน.

ฉันสามารถสกัดรูปภาพที่ฝังอยู่ในวัตถุ OLE, เช่น เอกสารแนบ, ได้หรือไม่?

คุณสามารถสกัดตัวอย่างสไลด์ของวัตถุ OLE จาก IOleObjectFrame.SubstitutePictureFormat. อย่างไรก็ตาม ตัวอย่างนั้นไม่ใช่เอกสารที่ฝังอยู่. หากต้องการสกัดรูปภาพจากไฟล์ที่ฝังอยู่, ให้สกัดข้อมูล OLE แล้วตรวจสอบด้วยเครื่องมือที่รองรับประเภทไฟล์นั้น.