VB.NET: сохранение метаданных изображения при перемещении в буфер обмена как изображение - PullRequest
2 голосов
/ 03 декабря 2011

Visual Studio 2010, .NET 4, VB.NET

Здравствуйте,

Я пишу небольшую программу для преобразования фрагментов LaTeX в изображения, которые можно вставлять в любую программу, в которую можно вставлять изображения. Это работает нормально, но следующий очевидный шаг - включить исходный код LaTeX в виде фрагмента метаданных в изображение, чтобы результаты могли быть изменены без необходимости перепечатывать все.

Мне удалось добавить заголовок PropertyItem с латексом, закодированным как байтовый массив ASCII в качестве его значения (id = 800, type = 2, value = System.Text.Encoding.ASCII.GetBytes (codestring)). Я проверяю, что PropertyItem действительно там, прежде чем пытаться поместить изображение в буфер обмена.

Затем я делаю Clipboard.SetImage (myImage). В результате удаляются все PropertyItems (мой заголовок плюс все остальное, что было там)! Я проверяю это, выполняя MsgBox (Clipboard.GetImage.PropertyItems.Count.ToString), который дает ноль.

Это меня очень огорчает. Кто-нибудь знает, что случилось?

Заранее спасибо!
Brian

Обновление : я выяснил, как переместить изображение в буфер обмена, а затем вернуться обратно, сохранив PropertyItems следующим образом:

Format = DataFormats.GetFormat(GetType(Image).FullName)
Dim dataObject As New DataObject
dataObject.SetData(Format.Name, image)
Clipboard.SetDataObject(dataObject)

Dim copiedImage As Image = CType(Clipboard.GetDataObject.GetData(Format.Name), Image)

Таким образом, скопированный образ имеет те же свойства объекта, что и оригинал. Тем не менее, новая проблема:

Другие программы больше не распознают то, что находится в буфере обмена, как изображение, что наносит ущерб всей цели. То есть, если я помещаю изображение в буфер обмена таким образом, когда я пытаюсь вставить в некоторый контекст, который принимает вставленные изображения, ничего не происходит.

Что делать?!

Ответы [ 2 ]

1 голос
/ 04 декабря 2011

Я считаю, что изображение буфера обмена Windows не имеет метаданных. Если вы измените формат изображения для добавления метаданных, оно больше не будет изображением буфера обмена. Если другие программы могут принять его, вы можете скопировать и вставить файл изображения (вместо изображения) в буфер обмена, и метаданные, конечно, останутся без изменений, когда они будут прочитаны целевым приложением.

0 голосов
/ 03 декабря 2011

Вы пробовали Clipboard.SetData или Clipboard.SetDataObject? SetImage копирует изображение только в растровом формате, поэтому я не удивлен, что оно удаляет элементы свойства. Вы можете попробовать:

Clipboard.SetData(DataFormats.EnhancedMetafile, myImage)

или

Clipboard.SetData(DataFormats.MetafilePict, myImage)
...