Как конвертировать IPictureDisp в System.Drawing.Image - PullRequest
2 голосов
/ 22 января 2009

Из библиотеки COM (Microsoft Office Document Imaging, также известный как MODI) я получаю изображение в виде IPictureDisp, которое я хотел бы преобразовать в объект System.Drawing.Image.

Какой лучший способ сделать это?

В настоящее время я использую приведенный ниже код, который, однако, создает исключение NotImplementedException.

internal sealed class IPictureDispHost : AxHost
{
    /// <summary>
    /// Default Constructor, required by the framework.
    /// </summary>
    private IPictureDispHost() : base(string.Empty) { }
    /// <summary>
    /// Convert the image to an ipicturedisp.
    /// </summary>
    /// <param name="image">The image instance</param>
    /// <returns>The picture dispatch object.</returns>
    public new static object GetIPictureDispFromPicture(Image image)
    {
        return AxHost.GetIPictureDispFromPicture(image);
    }
    /// <summary>
    /// Convert the dispatch interface into an image object.
    /// </summary>
    /// <param name="picture">The picture interface</param>
    /// <returns>An image instance.</returns>
    public new static Image GetPictureFromIPicture(object picture)
    {
        return AxHost.GetPictureFromIPicture(picture);
    }
}

...

// somewhere later the conversion gets called
Image image = IPictureDispHost.GetPictureFromIPicture(picture);

Это трассировка стека исключений:

System.NotImplementedException: The method or operation is not implemented.
   at System.Windows.Forms.UnsafeNativeMethods.IPicture.GetHandle()
   at System.Windows.Forms.AxHost.GetPictureFromIPicture(Object picture)
   at DocumentViewer.IPictureDispHost.GetPictureFromIPicture(Object picture)

У меня есть ссылки на stdole, System.Windows.Forms и System.Drawing в моем проекте. Я что-то упустил?

Ответы [ 4 ]

3 голосов
/ 10 февраля 2009

Проверьте эту статью .

В нем описаны три варианта выбора, просто выберите тот, который вы считаете наиболее простым или «самым чистым» для ваших целей (включая тот, который, как вы утверждаете, не работает на вас).

2 голосов
/ 26 января 2009

Как представляется, изображение, полученное из COM-компонентов Microsoft Office Document Imaging, не является допустимым объектом IPictureDisp, и, похоже, его невозможно преобразовать.

0 голосов
/ 10 февраля 2009

Microsoft.VisualBasic.Compatibility.VB6.Support.IPictureDispToImage не всегда будет включен в будущие обновления. Итак ... взяв пример из http://support.microsoft.com/kb/555417 я придумал следующее

Пример

Открытый класс ImageToPictureDispConverter

Inherits System.Windows.Forms.AxHost

Public Sub New()
    MyBase.New("{63109182-966B-4e3c-A8B2-8BC4A88D221C}")
End Sub

Public Function GetImageFromIPictureDisp(ByVal objImage As stdole.IPictureDisp) As System.Drawing.Image
    Dim objPicture As System.Drawing.Image
    objPicture = CType(MyBase.GetPictureFromIPicture(objImage), System.Drawing.Image)

    Return objPicture
End Function

Конечный класс

Я вижу в вашем конструкторе, что вы пропускаете пустую строку. В итоге мне пришлось пропустить следующую строку "{63109182-966B-4e3c-A8B2-8BC4A88D221C}". Если я передал пустую строку, я получил ошибку system.formatexception. Похоже, у вас есть все, что у меня есть, кроме этой строки в вашем звонке на базу.

Надеюсь, это поможет.

0 голосов
/ 22 января 2009

Вы пробовали:

picture1.image = Microsoft.VisualBasic.Compatibility.VB6.Support.IPictureDispToImage(pict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...