【问题标题】:Can't retrieve image from clipboard无法从剪贴板中检索图像
【发布时间】:2019-02-14 23:24:42
【问题描述】:

我尝试将 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);
    }

【问题讨论】:

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


    【解决方案1】:

    您要做的是从剪贴板中检索位图,键入“位图”。不过,我不确定 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多