Преобразовать систему.Рисование.Растровое изображение в стандартный формат.StdPicture

#c# #interop #compatibility #ole

#c# #взаимодействие #совместимость #ole

Вопрос:

У меня есть система.Рисование.В настоящее время используется Bitmap, и мне нужно преобразовать его в stdole.Стандартное изображение.
В настоящее время я использую:

 var pic = (stdole.StdPicture)Microsoft.VisualBasic.Compatibility.VB6.Support.ImageToIPicture
                   (MyDLL.Properties.Resources.Img); // this is a System.Drawing.Bitmap
  

но я получаю предупреждение компилятора:

Предупреждение «Microsoft.VisualBasic.Compatibility.VB6.Support.ImageToIPicture (система.Рисование.Изображение)’ устарело: ‘»Microsoft.VisualBasic.Совместимость.* классы устарели и поддерживаются только в 32-разрядных процессах. http://go.microsoft.com/fwlink/?linkid=160862

Итак, что использовать вместо этого? Я пока не смог найти другого решения…

Ответ №1:

взято из NetOffice http://netoffice.codeplex.com Пример добавления Office

 public class IconConverter : System.Windows.Forms.AxHost
{
   private IconConverter(): base(string.Empty)
   {
   }

   public static stdole.IPictureDisp GetIPictureDispFromImage(System.Drawing.Image image)
   {

      return (stdole.IPictureDisp)GetIPictureDispFromPicture(image);
   }
} 
  

Комментарии:

1. Более подробную информацию вы найдете в исходном сообщении, откуда было скопировано вышесказанное: blogs.msdn.microsoft.com/andreww/2007/07/30 /…

2. Для тех, кому интересно, что такое «stdole»: вы найдете его в Visual Studio Solution Explorer -> Refecence -> Добавить ссылку -> .NET -> stdole

Ответ №2:

Если вы выполните поиск в Google по запросу [преобразовать изображение .net в ole-картинку], вы найдете много разговоров о том, чтобы пойти другим путем (т. Е. Преобразовать ole-картинку в image), и множество советов, которые, по сути, гласят: «не пытайтесь использовать ole-картинки в .NET». Я согласен. Я пошел по этому пути несколько лет назад и решил, что на самом деле мне не так уж сильно нужна OLE-картинка.

Я настоятельно рекомендую вам пересмотреть вашу потребность в объектах OLE picture. Если вы сохраняете изображения в базе данных, храните их как большие двоичные объекты, а не как объекты изображения. Если вам абсолютно необходимо использовать объекты OLE picture, то удачи. Это будет очень неприятно.

Комментарии:

1. Кажется, многим людям нужно сделать это в обратном вызове LoadImage, чтобы настроить изображения кнопок ленты. Сигнатура обратного вызова — Public Function OnLoadImage(imageId As String) As IPictureDisp У вас есть предложения о том, как это решить?