Не удается получить изображение из буфера обмена - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь сохранить диапазон ячеек от файла Excel до изображения. Я использовал метод CopyPicture из interop.excel api, чтобы изображение могло быть в буфере обмена. Например, когда я нажимаю Ctrl + V в текстовом документе, я получаю изображение, но не могу получить его с помощью кода. Возвращенные данные из метода GetImageFromClipBoard имеют значение null.

    public void SaveAsImage()
    {
        var usedRange = ws.UsedRange;
        int startRow = usedRange.Row;
        int endRow = startRow + usedRange.Rows.Count - 1;
        int startColumn = usedRange.Column;
        int endColumn = startColumn + usedRange.Columns.Count - 1; 
        Xl.Range rng = wb.ActiveSheet.Range[ws.Cells[1, 1], 
        ws.Cells[endRow, endColumn]];
        rng.CopyPicture(Xl.XlPictureAppearance.xlScreen, 
        Xl.XlCopyPictureFormat.xlBitmap);

        Image image = GetImageFromClipBoard();
        image.Save("image.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
    }

    [STAThread]
    private Image GetImageFromClipBoard()
    {
        IDataObject clipboardData = Clipboard.GetDataObject();
        Exception threadEx = null;
        Thread staThread = new Thread(
            delegate ()
            {
                try
                {
                    clipboardData = Clipboard.GetDataObject();
                }

                catch (Exception ex)
                {
                    threadEx = ex;
                }
            });
        staThread.SetApartmentState(ApartmentState.STA);
        staThread.Start();
        staThread.Join();
        return (Bitmap)clipboardData.GetData(DataFormats.Bitmap);
    }

1 Ответ

0 голосов
/ 14 февраля 2019

То, что вы пытаетесь сделать, это извлечь растровое изображение из буфера обмена, как тип «Растровое изображение». Я не уверен, что Office вообще использует этот тип.

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

Одним из основных, который используется, является DIB (в основном, файл BMP без определенного заголовка файла), но Office специально использует их:

  • "PNG+Office Art"
  • "JFIF+Office Art"
  • "GIF+Office Art"
  • "PNG"
  • "JFIF"
  • "GIF"

(я слышал, что "+ Офисное искусство" - это тоже просто изображения, но я сам не пробовал)

Так что, да, если вы попытаетесь получить их, создайте новый MemoryStream с байтами из буфера обмена и создайте новый Bitmap из MemoryStream, вы должны быть там. Вы в основном пробуете их, пока не получите что-то, что прилипает, начиная с PNG.

Некоторое время назад я написал более подробное объяснение с полным кодом , которое было сосредоточено именно на копировании и извлечении PNG и DIB из буфера обмена.

...