Разрешить пользователю копировать изображение из Picturebox и сохранять его везде

В моем приложении у меня есть pictureBox, который показывает изображение. Когда пользователь щелкает правой кнопкой мыши на pictureBox и выбирает Copy из контекстного меню, я хочу скопировать изображение в буфер обмена, чтобы пользователь мог вставить его в папки и куда угодно. Как я могу это сделать?

РЕДАКТИРОВАТЬ: я использую этот код, но только этот пользователь может вставить изображение в слово.

var img = Image.FromFile(pnlContent_Picture_PictureBox.ImageLocation);
Clipboard.SetImage(img);

person Hajitsu    schedule 14.05.2013    source источник
comment
что ты уже испробовал ? добавьте немного кода, давайте посмотрим, что вы уже сделали, и поможем вам с остальным   -  person Mehran    schedule 14.05.2013
comment
я использую этот код, но только этот пользователь может вставить изображение в слово. var img = Image.FromFile(pnlContent_Picture_PictureBox.ImageLocation); Clipboard.SetImage(img);   -  person Hajitsu    schedule 14.05.2013
comment
Содержит ли поле изображения изображение из файла, изображение из памяти или оно отображается с событием Paint()?   -  person John Alexiou    schedule 14.05.2013
comment
Не только Word принимает изображения из буфера обмена.   -  person John Alexiou    schedule 14.05.2013
comment
@ ja72 он хочет иметь возможность копировать файлы, а не их содержимое. также кажется, что он загружает изображение, используя расположение файла (ImageLocation).   -  person Arash Milani    schedule 14.05.2013
comment
Я загружаю изображение в окно изображения из файла, а не из памяти или использую Paint().   -  person Hajitsu    schedule 14.05.2013


Ответы (2)


Clipboard.SetImage копирует содержимое изображения (двоичные данные) в буфер обмена, а не путь к файлу. Чтобы вставить файл в проводник Windows, вам нужно иметь коллекцию путей к файлам в буфере обмена, а не их содержимое.

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

System.Collections.Specialized.StringCollection FileCollection = new System.Collections.Specialized.StringCollection();
FileCollection.Add(pnlContent_Picture_PictureBox.ImageLocation);
Clipboard.SetFileDropList(FileCollection);

Теперь пользователь может вставить файл куда угодно, например. Проводник Виндоус.

Дополнительные сведения см. на Clipboard.SetFileDropList Method http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.setfiledroplist.aspx

person Arash Milani    schedule 14.05.2013
comment
полностью работает, но что не так с этим методом: Clipboard.SetImage(pictureBox1.Image); - person Mehran; 14.05.2013
comment
Clipboard.SetImage копирует содержимое изображения (двоичные данные) в буфер обмена, а не путь к файлу. чтобы вставить файл в окно просмотра, вам нужно иметь пути к файлам в буфере обмена, а не их содержимое. - person Arash Milani; 14.05.2013
comment
Большое спасибо @Араш Милани - person Hajitsu; 14.05.2013

Это решение, когда в окне изображения не отображается изображение файла, но оно визуализируется с помощью GDI+.

public partial class Form1 : Form
{
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        // call render function
        RenderGraphics(e.Graphics, pictureBox1.ClientRectangle);
    }

    private void pictureBox1_Resize(object sender, EventArgs e)
    {
        // refresh drawing on resize
        pictureBox1.Refresh();
    }

    private void copyToClipboardToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // create a memory image with the size taken from the picturebox dimensions
        RectangleF client=new RectangleF(
            0, 0, pictureBox1.Width, pictureBox1.Height);
        Image img=new Bitmap((int)client.Width, (int)client.Height);
        // create a graphics target from image and draw on the image
        Graphics g=Graphics.FromImage(img);
        RenderGraphics(g, client);
        // copy image to clipboard.
        Clipboard.SetImage(img);
    }

    private void RenderGraphics(Graphics g, RectangleF client)
    {
        g.SmoothingMode=SmoothingMode.AntiAlias;
        // draw code goes here
    }
}
person John Alexiou    schedule 14.05.2013