前提・実現したいこと
C#Windowsformデスクトップアプリ内に、ローカル画像をドラッグ&ドロップ(以下D&D)で運んで表示したあとに、その表示された画像の上でD&Dで四角を任意選択して画像を切り取り保存をしたいです。
環境:windows10 64bit
開発ツール:Visual Studio 2017 community
言語:C#(windows Forms visual C#)
発生している問題・エラーメッセージ
画像をローカルからD&Dでアプリ側で表示し、その上でD&Dをした際に四角形は出現して枠組みまではできますが、その際に下の表示されている画像が消えてしまいます。
###コード
わかりづらくなってしまうので当初のpicturebox2つ使おうとしていたコードは削除しました。
試したこと
paintイベントの中にgraphics含め描画のメソッドを入れていくことも行いましたが、paintの外側にあるマウスダウンイベントなどの中でメソッド呼び込みをどうしたらよいかわからず、そもそもpaintイベントの中にマウスイベントじたいも入れ込まなければいけないのかいろいろなサイトや書籍(C#)を見てますが、解決できませんでした。
参考サイト:
PictureBoxに線が描けません。
ラバーランドでのドラッグ範囲の切り抜き
基本描画画像が消える
イメージプロパティによくある勘違い
pictureboxを2つ重ねて上側を透過trancerateをbackcolorを選択しても四角形描画が始まるとはじめの画像表示は消えてしまいました。
あと試していない(できなかった)のはpictureboxを2つ作り、親子の関係にして上のを透過させる方法です。
最終的には四角形で切り抜き保存までを行いたいだけです。
かなり苦戦しております。どなたかご教授頂けないでしょうか。
###その後試したこと
親子関係を作りpicturebox2の方を透過で四角を描けるようにしました。
C#
1 public Form1() 2 { 3 InitializeComponent(); 4 //プロパティの設定変更 5 pictureBox1.AllowDrop = true; 6 //描画先とするImageオブジェクトを作成する 7 bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 8 9 pictureBox2.BackColor = Color.Transparent; 10 pictureBox2.Parent = pictureBox1; 11 pictureBox2.Location = new Point(0, 0); 12 13 }
それでも画像の方は四角指定の際のD&Dで消えてしまいました。
###現状(令和元年6月6日)
デザイン…picture1の上にあえてpicture2をずらして上に置いています。テストのため。
ドラッグ中…はじめに置いた画像picture1がpicture2が出てきたことで上半分欠ける(子の透過ができていない)
ドロップ後…四角形は最終的に目当てと違う場所に残ったが意図しない場所(picuture2だが座標がおかしい)
###6月6日16時の時点での現状
・なんとか元画像の上に四角枠を表示することができました。ありがとうございます。
・残りの課題は、四角の表示される位置が非常にずれています。
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Drawing.Imaging; 7using System.IO; 8using System.Linq; 9using System.Text; 10using System.Threading.Tasks; 11using System.Windows.Forms; 12 13 14namespace WindowsFormsApp_20190604 15{ 16 public partial class Form1 : Form 17 { 18 Point MD = new Point(); 19 Point MU = new Point(); 20 Bitmap bmp; 21 Bitmap backgroundBitmap;//20190605 22 Bitmap offscreenBitmap; 23 bool view = false; 24 25 26 public Form1() 27 { 28 InitializeComponent(); 29 //プロパティの設定変更 30 pictureBox1.AllowDrop = true; 31 //描画先とするImageオブジェクトを作成する 32 bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 33 } 34 private void pictureBox1_DragDrop(object sender, DragEventArgs e) 35 { 36 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false); 37 for (int i = 0; i < files.Length; i++) 38 { 39 string fileName = files[i]; 40 41 string filename = ((string[])e.Data.GetData(DataFormats.FileDrop))[0]; 42 backgroundBitmap = new Bitmap(filename); 43 offscreenBitmap = new Bitmap(backgroundBitmap);//tuika15 44 45 46 Console.WriteLine("offscreenBitmap:" + offscreenBitmap); 47 48 //表示方法をzoomにする 49 pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; 50 51 pictureBox1.Image = offscreenBitmap; 52 } 53 } 54 55 private void pictureBox1_DragEnter(object sender, DragEventArgs e) 56 { 57 if (e.Data.GetDataPresent(DataFormats.FileDrop)) 58 e.Effect = DragDropEffects.Copy; 59 } 60 61 private void GetRegion(Point p1, Point p2, ref Point start, ref Point end) 62 { 63 start.X = Math.Min(p1.X, p2.X); 64 start.Y = Math.Min(p1.Y, p2.Y); 65 66 end.X = Math.Max(p1.X, p2.X); 67 end.Y = Math.Max(p1.Y, p2.Y); 68 } 69 70 private int GetLength(int start, int end) 71 { 72 return Math.Abs(start - end); 73 } 74 75 private void DrawRegion(Point start, Point end) 76 { 77 Pen blackPen = new Pen(Color.Black); 78 Console.WriteLine(bmp); 79 Console.WriteLine(offscreenBitmap); 80 81 Graphics g = Graphics.FromImage(offscreenBitmap); 82 83 // 描画する線を点線に設定 84 blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; 85 86 // 画面を消去 87 g.Clear(SystemColors.Control); 88 89 g.DrawRectangle(blackPen, start.X, start.Y, GetLength(start.X, end.X), GetLength(start.Y, end.Y)); 90 91 g.Dispose(); 92 } 93 94 private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 95 { 96 // 描画フラグON 97 view = true; 98 99 // Mouseを押した座標を記録 100 MD.X = e.X; 101 MD.Y = e.Y; 102 } 103 104 private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 105 { 106 107 Point p = new Point(); 108 Point start = new Point(); 109 Point end = new Point(); 110 111 // 描画フラグcheck 112 if (view == false) 113 { 114 return; 115 } 116 117 // カーソルが示している場所の座標を取得 118 p.X = e.X; 119 p.Y = e.Y; 120 121 // 座標から(X,Y)座標を計算 122 GetRegion(MD, p, ref start, ref end); 123 124 // 領域を描画 125 DrawRegion(start, end); 126 127 //backの画像表示方法指定 128 pictureBox1.BackgroundImageLayout = ImageLayout.Zoom; 129 //初めにとっておいた背景bitmapを表示 130 pictureBox1.BackgroundImage = backgroundBitmap; 131 //bitmapの透過 132 offscreenBitmap.MakeTransparent(); 133 134 //Imageを表示 135 pictureBox1.Image = offscreenBitmap; 136 } 137 138 private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 139 { 140 141 Point start = new Point(); 142 Point end = new Point(); 143 144 145 // Mouseを離し た座標を記録 146 MU.X = e.X; 147 MU.Y = e.Y; 148 149 // 座標から(X,Y)座標を計算 150 GetRegion(MD, MU, ref start, ref end); 151 152 // 領域を描画 153 DrawRegion(start, end); 154 155 //PictureBox1に表示する 156 157 // 描画フラグOFF 158 view = false; 159 } 160 } 161}
回答1件
あなたの回答
tips
プレビュー