回答編集履歴

3

m

2019/02/17 11:18

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -44,7 +44,17 @@
44
44
 
45
45
 
46
46
 
47
- `PreviewDragOver`イベントでファイルのD&Dのみ検知して`Drop`イベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。画像大きさ[`System.Drawing.Image.Size`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.size?view=netframework-4.7.2#System_Drawing_Image_Size)に丸投げしています。[`System.Drawing.Image.FromFile`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.fromfile?view=netframework-4.7.2#System_Drawing_Image_FromFile_System_String_)非同期版が見つからなかったので雑に`Task.Run`してすがあ大丈夫しょう、しらんけど。`Task.WhenAll`と`.Select`の組み合わせの使い方は
47
+ `PreviewDragOver`イベントでファイルのD&Dのみ検知して`Drop`イベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。MSが出してるサンプルほぼそのままで
48
+
49
+ [[XAML/C#] WPF におけるドラッグ アンド ドロップ (Windows フォームから WPF へ)](https://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-a1c048ae)
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+ 画像の大きさは[`System.Drawing.Image.Size`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.size?view=netframework-4.7.2#System_Drawing_Image_Size)に丸投げしています。DLLへの参照を追加しないとビルドできないですが。[`System.Drawing.Image.FromFile`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.fromfile?view=netframework-4.7.2#System_Drawing_Image_FromFile_System_String_)の非同期版が見つからなかったので雑に`Task.Run`してますがまあ大丈夫でしょう、しらんけど。`Task.WhenAll`と`.Select`の組み合わせの使い方は
48
58
 
49
59
  [neue cc - 非同期時代のLINQ](http://neue.cc/2013/12/04_435.html)
50
60
 
@@ -55,6 +65,34 @@
55
65
  ```charp
56
66
 
57
67
  var sizes = await Task.WhenAll(files.Select(async fileName => await Task.Run(() => System.Drawing.Image.FromFile(fileName).Size)));
68
+
69
+ ```
70
+
71
+
72
+
73
+ あとは結果表示の方に`Name="result"`とidつけて
74
+
75
+
76
+
77
+ ```xaml
78
+
79
+ <TextBox Grid.Row="1" TextWrapping="Wrap" Margin="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="result"/>
80
+
81
+ ```
82
+
83
+
84
+
85
+ とりあえず小数第四位までに四捨五入して適当に文字列作って`result.Text`に代入すれば表示されます。
86
+
87
+
88
+
89
+ ```csharp
90
+
91
+ result.Text
92
+
93
+ = $"縦: x{Math.Round(sizes[0].Height * 1.0 / sizes[1].Height, 4)} x{Math.Round(sizes[1].Height * 1.0 / sizes[0].Height, 4)}\n"
94
+
95
+ + $"横: x{Math.Round(sizes[0].Width * 1.0 / sizes[1].Width, 4)} x{Math.Round(sizes[1].Width * 1.0 / sizes[0].Width, 4)}";
58
96
 
59
97
  ```
60
98
 

2

more

2019/02/17 11:18

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -19,3 +19,69 @@
19
19
  ![before](100d93414ca0da91039cde51924f508d.png)
20
20
 
21
21
  ![after](7c557aa09d660c7feff55baf2b61861e.png)
22
+
23
+
24
+
25
+ 大して長いコードでもないしMVVMパターンとかもやってないのでGithub見れば1分で理解できるとは思うのですが、一応解説。
26
+
27
+
28
+
29
+ GUIでD&Dするとこと結果表示するところは高さが3:1になるようにしてます。`MinHeight`は保険。
30
+
31
+
32
+
33
+ ```xaml
34
+
35
+ <Grid.RowDefinitions>
36
+
37
+ <RowDefinition Height="3*"/>
38
+
39
+ <RowDefinition Height="*" MinHeight="20"/>
40
+
41
+ </Grid.RowDefinitions>
42
+
43
+ ```
44
+
45
+
46
+
47
+ `PreviewDragOver`イベントでファイルのD&Dのみ検知して`Drop`イベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。画像の大きさは[`System.Drawing.Image.Size`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.size?view=netframework-4.7.2#System_Drawing_Image_Size)に丸投げしています。[`System.Drawing.Image.FromFile`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.fromfile?view=netframework-4.7.2#System_Drawing_Image_FromFile_System_String_)の非同期版が見つからなかったので雑に`Task.Run`してますがまあ大丈夫でしょう、しらんけど。`Task.WhenAll`と`.Select`の組み合わせの使い方は
48
+
49
+ [neue cc - 非同期時代のLINQ](http://neue.cc/2013/12/04_435.html)
50
+
51
+ に解説ありますね。
52
+
53
+
54
+
55
+ ```charp
56
+
57
+ var sizes = await Task.WhenAll(files.Select(async fileName => await Task.Run(() => System.Drawing.Image.FromFile(fileName).Size)));
58
+
59
+ ```
60
+
61
+
62
+
63
+ Ctrl+Cは
64
+
65
+ [3秒でわかるWPFでCtrl+C(Copy)のときになんか実行する方法](https://qiita.com/yumetodo/items/6781a34f19993ca11421)
66
+
67
+ で書いた方法で拾ってます。
68
+
69
+
70
+
71
+ ```csharp
72
+
73
+ private void OnCtrlC(object sender, RoutedEventArgs e)
74
+
75
+ {
76
+
77
+ if (string.Empty != result.Text)
78
+
79
+ {
80
+
81
+ Clipboard.SetData(DataFormats.Text, result.Text);
82
+
83
+ }
84
+
85
+ }
86
+
87
+ ```

1

つくっちまったぜ

2019/02/17 11:09

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -1,3 +1,21 @@
1
1
  もっと簡単にはC# + XAMLで書くことですね。文字コードとWin32APIとの格闘からとりあえず逃れられます。
2
2
 
3
3
  https://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-a1c048ae
4
+
5
+
6
+
7
+ 追記
8
+
9
+
10
+
11
+ 興味が湧いたのでC# + XAMLで作ってしまいました。D&DしたあとWindowをクリックしてCtrl+Cすればクリップボードに結果が入ります。
12
+
13
+
14
+
15
+ [https://github.com/yumetodo/ImageSizeRateCalculator](https://github.com/yumetodo/ImageSizeRateCalculator)
16
+
17
+
18
+
19
+ ![before](100d93414ca0da91039cde51924f508d.png)
20
+
21
+ ![after](7c557aa09d660c7feff55baf2b61861e.png)