2013-05-14 3 views
5

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

EDIT: Я использую этот код, но этим пользователем только может вставлять изображение в слово.

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

Что вы пробовали? добавьте код, давайте посмотрим, что вы уже сделали, и помогите вам в этом. – Mehran

+0

Я использую этот код, но этим пользователем только можно вставить изображение в слово. 'var img = Image.FromFile (pnlContent_Picture_PictureBox.ImageLocation); Clipboard.SetImage (img); ' –

+0

Является ли в окне изображения изображение из файла, изображение из памяти или оно отображается с помощью события' Paint() '? – ja72

ответ

4

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 Methodhttp://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.setfiledroplist.aspx

+1

полностью работает, но что не так с этим методом: 'Clipboard.SetImage (pictureBox1.Image);' – Mehran

+1

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

+0

О, теперь я получаю это, спасибо Arash – Mehran

3

Это решение, когда окно картинка не отображает файл изображения, но оно отображается на с 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 
    } 
}