Не удается получить изображение из буфера обмена
Я пытаюсь сохранить диапазон ячеек от файла 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 ответ
То, что вы пытаетесь сделать, это извлечь растровое изображение из буфера обмена, как тип "Растровое изображение". Я не уверен, что Office вообще использует этот тип.
Обратите внимание, что DataFormats
не перечисление; они просто ссылаются на строковые идентификаторы, обычно используемые для содержимого буфера обмена. Это сразу означает, что вы можете добавить пользовательские. Эти пользовательские обычно помещаются в буфер обмена как поток байтов. В этом ответе подробно описан способ хранения и извлечения этих байтовых массивов в буфер обмена.
Одним из основных, который используется, является DIB (в основном, файл BMP без его определенного заголовка файла), но Office определенно использует их:
"PNG+Office Art"
"JFIF+Office Art"
"GIF+Office Art"
"PNG"
"JFIF"
"GIF"
(Я слышал, что "+Office Art" - это просто изображения, но я сам не пробовал)
Так что да, если вы попытаетесь получить их, сделайте новый MemoryStream
с байтами из буфера обмена, и сделать новый Bitmap
из MemoryStream вы должны быть там. Вы в основном пробуете их, пока не получите что-то, что прилипает, начиная с PNG.
Некоторое время назад я написал более подробное объяснение с полным кодом, в котором особое внимание уделялось копированию и извлечению PNG и DIB из буфера обмена.