0

パワーポイントウィンドウのサイドパネルの形式でpptaddを開発しています。必要なのは、カスタマイズされたスライドサムネイルです。これまでに行ったことは、Export()メソッドを使用して、すべてのスライドを一時的な画像に変換して表示することです。しかし、ディスクから保存/ロードする必要があり、インタラクティブな方法でそれらを表示する必要があるため、このアプローチは遅すぎます(十分に高速である必要があります)

スライドのサムネイルをメモリにエクスポートする方法があるかどうか疑問に思っています...

4

2 に答える 2

1

考えられるアプローチの1つ:

ActivePresentation.Slides(x).Copy

これにより、スライドがWindowsクリップボードに、ビットマップ、PNG、JPGなどのさまざまな形式で配置されます。

クリップボードから実行しているものに画像をロードする方法がある場合は、これで問題ありません。

于 2013-01-24T15:59:48.040 に答える
0

クリップボードを使用するアイデアを提供してくれたスティーブに感謝します。

編集 は機能しますが、まだ遅いです.70枚のスライドを生成すると、4〜5秒かかりました。

これが私がやったことです

slide.Copy();
if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Bitmap))
{
    ImageSource imgSource = BinaryStructConverter.ImageFromClipboardDib();
}

BinaryStructConverter については、ここから素敵なコードを取得しました: http://www.thomaslevesque.com/2009/02/05/wpf-paste-an-image-from-the-clipboard/ (何らかの方法で変換する必要があるため、クリップボードから直接コピーするだけでは、ビットマップ イメージ形式が台無しになる可能性があります)。

[StructLayout(LayoutKind.Sequential, Pack = 2)]
public struct BITMAPFILEHEADER
{
    public static readonly short BM = 0x4d42; // BM

    public short bfType;
    public int bfSize;
    public short bfReserved1;
    public short bfReserved2;
    public int bfOffBits;
}

[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
    public int biSize;
    public int biWidth;
    public int biHeight;
    public short biPlanes;
    public short biBitCount;
    public int biCompression;
    public int biSizeImage;
    public int biXPelsPerMeter;
    public int biYPelsPerMeter;
    public int biClrUsed;
    public int biClrImportant;
}

public static class BinaryStructConverter
{
    public static ImageSource ImageFromClipboardDib()
    {
        MemoryStream ms = Clipboard.GetData("DeviceIndependentBitmap") as MemoryStream;
        if (ms != null)
        {
            byte[] dibBuffer = new byte[ms.Length];
            ms.Read(dibBuffer, 0, dibBuffer.Length);

            BITMAPINFOHEADER infoHeader =
                BinaryStructConverter.FromByteArray<BITMAPINFOHEADER>(dibBuffer);

            int fileHeaderSize = Marshal.SizeOf(typeof(BITMAPFILEHEADER));
            int infoHeaderSize = infoHeader.biSize;
            int fileSize = fileHeaderSize + infoHeader.biSize + infoHeader.biSizeImage;

            BITMAPFILEHEADER fileHeader = new BITMAPFILEHEADER();
            fileHeader.bfType = BITMAPFILEHEADER.BM;
            fileHeader.bfSize = fileSize;
            fileHeader.bfReserved1 = 0;
            fileHeader.bfReserved2 = 0;
            fileHeader.bfOffBits = fileHeaderSize + infoHeaderSize + infoHeader.biClrUsed * 4;

            byte[] fileHeaderBytes =
                BinaryStructConverter.ToByteArray<BITMAPFILEHEADER>(fileHeader);

            MemoryStream msBitmap = new MemoryStream();
            msBitmap.Write(fileHeaderBytes, 0, fileHeaderSize);
            msBitmap.Write(dibBuffer, 0, dibBuffer.Length);
            msBitmap.Seek(0, SeekOrigin.Begin);

            return BitmapFrame.Create(msBitmap);
        }
        return null;
    }

    public static T FromByteArray<T>(byte[] bytes) where T : struct
    {
        IntPtr ptr = IntPtr.Zero;
        try
        {
            int size = Marshal.SizeOf(typeof(T));
            ptr = Marshal.AllocHGlobal(size);
            Marshal.Copy(bytes, 0, ptr, size);
            object obj = Marshal.PtrToStructure(ptr, typeof(T));
            return (T)obj;
        }
        finally
        {
            if (ptr != IntPtr.Zero)
                Marshal.FreeHGlobal(ptr);
        }
    }

    public static byte[] ToByteArray<T>(T obj) where T : struct
    {
        IntPtr ptr = IntPtr.Zero;
        try
        {
            int size = Marshal.SizeOf(typeof(T));
            ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(obj, ptr, true);
            byte[] bytes = new byte[size];
            Marshal.Copy(ptr, bytes, 0, size);
            return bytes;
        }
        finally
        {
            if (ptr != IntPtr.Zero)
                Marshal.FreeHGlobal(ptr);
        }
    }
}
于 2013-01-29T07:52:47.290 に答える