无法从剪贴板检索图像

时间:2019-01-07 07:43:48

标签: c# interop clipboard excel-interop image-formats

我尝试将单元格范围从excel文件保存到图片。 我使用了来自interop.excel api的CopyPicture方法,因此图片位于剪贴板上。 例如,当我在Word文档上按ctrl + v时,我得到了图片,但是我无法成功通过代码获得它。 从GetImageFromClipBoard方法返回的数据为空。

    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 :(得分:0)

您要执行的操作是从剪贴板中检索位图,类型为“位图”。不过,我不确定Office是否使用该类型。

请注意,DataFormats不是枚举;它们只是引用剪贴板内容中常用的字符串ID。这立即意味着您可以添加自定义项。这些自定义项通常作为字节流放在剪贴板上。 This answer详细说明了在剪贴板上存储和获取这些字节数组的方式。

使用的主要文件之一是DIB(基本上是没有特定文件头的BMP文件),但是Office专门使用了这些文件:

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

(我听说“ + Office Art”也只是图像,但我自己还没有尝试过)

是的,如果您尝试获取它们,使用剪贴板中的字节创建一个新的MemoryStream,然后使用MemoryStream创建一个新的Bitmap,那么您应该在那里。从PNG开始,您基本上可以尝试使用它们直到出现可粘贴的东西。

前一段时间我写了more detailed explanation with full code,它专门用于在剪贴板上复制和检索PNG和DIB。

相关问题