Проблема при сохранении данных буфера обмена в виде изображения

Я скопировал некоторые данные в буфер обмена с помощью MS-Word Com API.

Range.CopyAsPicture();

и когда я вставляю (Ctrl + v) его в программу рисования окна, он отображается.

Проблема заключается в преобразовании данных буфера обмена в изображение. Используя С#, я просмотрел различные ссылки в Интернете и попробовал следующий код, который не работает.

MemoryStream ms = Clipboard.GetData("DeviceIndependentBitmap") as MemoryStream;

над строкой, возвращающей null

clipboardData.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap)

Над строкой возвращается false

Может ли кто-нибудь предложить, как можно преобразовать данные буфера обмена в изображение.


person slash shogdhe    schedule 21.12.2014    source источник


Ответы (2)


Если все, что вам нужно, это получить растровое изображение изображения в буфере обмена (или базовые двоичные данные), рассмотрите возможность использования GetImage. Вот фрагмент кода, который вы можете попробовать:

        BitmapSource bmpSource = Clipboard.GetImage();
        MemoryStream ms = new MemoryStream();
        BitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmpSource));
        encoder.Save(ms);
        ms.Seek(0, SeekOrigin.Begin);

Если это тоже не сработает, вы можете попробовать заглянуть в это обходной путь, он не кажется напрямую связанным, но может быть именно тем, что вам нужно.

person JoefGoldstein    schedule 21.12.2014
comment
Буфер обмена.ПолучитьИзображение(); возвращает ноль - person slash shogdhe; 22.12.2014
comment
Приложения MS Office используют строку PNG в качестве формата данных, а данные представляют собой MemoryStream, содержащие байты изображения png. - person Nyerguds; 02.10.2017

Судя по всему, MS Office помещает изображения в буфер обмена как поток байтов PNG, что на самом деле является очень разумным нововведением. Эти данные изображения просто используют идентификатор «PNG».

Поэтому попробуйте это вместо этого:

if (retrievedData.GetDataPresent("PNG"))
{
    MemoryStream png_stream = retrievedData.GetData("PNG") as MemoryStream;
    if (png_stream != null)
        return new Bitmap(png_stream);
}
person Nyerguds    schedule 04.10.2017