お問い合わせ

tel:0570-046-503

営業時間 10:00~17:00(定休日:土日祝日)

ドラッグ&ドロップで画像のパス取得

   2015/08/04

画像をドラッグ&ドロップして、画面上に表示したい。

そんな要望もあるのではないかと思います。


C#で実装する場合、ドラッグ&ドロップのイベントを実装する必要があります。


そのまえに、フォーム・ドラッグ&ドロップするコントロールの

AllowDropプロパティをTrueにしておくことを忘れないようにしましょう。


それではコードの紹介です。

今回は、datagridviewの中にドラッグ&ドロップします。

        private void dgItemImage_DragDrop(object sender, DragEventArgs e)
        {
            // data nothing then through
            if (!ev.Data.GetDataPresent(DataFormats.FileDrop)) return;

            AddDropImage(sender as UI.DatagridviewBase, e);
        }
        
        /// <summary>
        /// ドラッグアンドドロップされたアイテムをプレビュー表示する。
        /// </summary>
        private void AddDropImage(UI.DatagridviewBase dg,DragEventArgs ev)
        {
            // 渡されたファイルに対して処理を行う
            foreach (var filePath in (string[])ev.Data.GetData(DataFormats.FileDrop))
            {
                var ext = System.IO.Path.GetExtension(filePath);
                //拡張子を取得して、jpg,png,gifのみに絞る
                if (ext != ".jpg" && ext != ".png" && ext != ".gif") return;


                //重複チェックをして、行追加
                var flg = false;
                                
                foreach (DataGridViewRow dr in dg.Rows)
                {
                    if (filePath == dr.Cells["ImagePath"].Value.ToString())
                    {
                    	//既に同じものが存在する場合はループを抜ける
                        flg = true;
                        break;
                    }
                }
                
                //重複が無い場合
                if (!flg)
                {
                    //行追加
                    dg.Rows.Add();

                    var row = dg.Rows[dg.Rows.Count - 1];

                    using (var bmp = new Bitmap(filePath))
                    {

                        //行の高さにあわせて幅設定
                        var w = (int)(bmp.Width * ((double)dg.RowTemplate.Height / bmp.Height));

                        int h = dg.RowTemplate.Height;

                        Bitmap dest = new Bitmap(w, h);
                        using (var g = Graphics.FromImage(dest))
                        {
                            //画像の作成
                            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                            g.DrawImage(bmp, 0, 0, w, h);

                            row.Cells["ImagePath"].Value = filePath;
                            row.Cells["FileName"].Value = System.IO.Path.GetFileName(filePath);
                            //作成した画像を表示(ImageCellにしておく)
                            row.Cells["Image"].Value = dest;
                        }

                    }
                    
                }
            }
        }


まず最初のメソッド、dgItemImage_DragDropはイベント発生時のメソッドです。

ファイルがドロップされたときのみ対象とします。フォルダがドロップされたときは無視です。


次のAddDropImageでdatagridviewにimage込みの行を追加しています。

ドロップされたファイルのパスはforeach内の

foreach (var filePath in (string[])ev.Data.GetData(DataFormats.FileDrop))

でファイルパスに変換しています。

まず、ループで同じファイルパスの画像が存在しないことを確認します。

新規であることを確認したら、新規行追加を行い、

ファイルパスからimageを作成します。

作成したimageを対象のセルに表示しています。


意外と簡単に作れてしまいます。

ドラッグ&ドロップはユーザからすれば、ファイルダイアログでファイルを選択するよりも

簡単なので、結構需要はありそうです。

  • ブログランキング・にほんブログ村へ
  • FC2ブログランキングへ
  • 人気ブログランキングへ
  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)