プロジェクト

全般

プロフィール

20210214 » 履歴 » バージョン 1

sylow castle, 2021/02/14 14:45

1 1 sylow castle
# 20210214
2
3
実に半年ぶりぐらい。大体こんなことをやろうとしている
4
5
## 出発
6
7
Snipping ToolsはCtrl + C でキャプチャした画像をクリップボードに入れられる。
8
いちいちファイル保存を経由して、MarkdownEditorに貼るのは面倒なので
9
クリップボードに保管した画像をDATA URIスキームで貼り付けたいというひと手間省くためだけの願望を実現しようと色々調べてみた結果。
10
11
以下、記事のお品書き
12
13
1. Webとクリップボード 
14
1. PowerShellとクリップボード
15
1. .NETのImageのbase64エンコーディング
16
17
### Webでのクリップボード
18
19
願望からやらなきゃいけないことは
20
21
- Clipboardのデータを読む
22
- 生データをbase64エンコードする
23
24
主に前者についてのお話。
25
今まで使っていたexecCommandはいつ削除されてもおかしくないらしい。なんということ。
26
27
という訳でクリップボードの正しい扱い方について情報収集していった。代替となりそうなW3C Clipboard APIだけどまだ草案段階でMDNのドキュメントも反映されきってないという素敵な状況。
28
まだ使えないなぁということで色々ぐぐってたら出てきたのがpaste.js: https://github.com/layerssss/paste.js 先人は偉大。
29
ソース眺めた感じ、Navigator.clipboardオブジェクトを基本的に使いつつ、Firefox対応の処理を入れている感じ。よさげ。pasteImageなるイベントも実装してくれてるし。
30
31
### PowerShellとクリップボード
32
33
さて、paste.jsで実装しようかなと思ったんだけど、「クリップボードの画像をbase64エンコードする」ってブラウザでやるべきことか?とか疑問が沸いてきたため、例えばPowerShellとか使う方法を考えてみる。
34
35
1. クリップボードから画像を読む
36
1. 読んだ画像をbase64エンコードする
37
1. base64文字列をクリップボードに入れる
38
39
とかそんな処理を書けばいいのかなと。ブラウザでやるとセキュリティとかメンドウクサイ。
40
とりあえず、使えそうなコマンドレットは以下二つ。
41
42
- Get-Clipboard
43
- Set-Clipboard
44
45
Set-Clipboardは今回見ない。
46
47
リファレンス( https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-clipboard?view=powershell-5.1 )によると-Formatオプションでテキストだの画像だの音声だのと指定できるらしい、が、PowerShell 7ではこのオプション削除されているらしいのは注意。Windows想定だからPowerShell 5.1で良いや。
48
49
コマンド結果:
50
```
51
PS Get-Clipboard -Format Image  |sv image
52
PS $image.GetType()
53
54
IsPublic IsSerial Name                                     BaseType
55
-------- -------- ----                                     --------
56
True     True     Bitmap                                   System.Drawing.Image
57
```
58
59
なんかBitmapクラスとかいうよくわからんのが出来たので調べよう。後参考( https://www.haruru29.net/blog/how-to-do-clipboard-operations-using-powershell/ )によるとリソースの開放とか気を付けたほうが良いみたい。まぁそうか。
60
61
## base64エンコーディング
62
63
なんか以前、System.Text.Encodingクラスとかからテキストをバイト列にしたことはあったな。そう確かPowerShell 5.1 でUTF-8で保存すると、ついてしまうBOMを外すためにやった。今回は画像なのでちょっと違うなぁ。
64
結局のところバイトストリームを得られればいいんじゃないかな。
65
ImageクラスのSaveMemoryStream(Stream,ImageFormat)でMemoryStreamに保存、バイト列化してConvertクラスでbase64エンコーディングとかでいけそうかなぁ。
66
67
68
## 参考
69
70
- https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand
71
- https://qiita.com/tatesuke/items/00de1c6be89bad2a6a72
72
- https://qiita.com/chelproc/items/9e0328e5d413afb52d0c
73
- https://github.com/layerssss/paste.js
74
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-clipboard?view=powershell-5.1
75
- https://win.just4fun.biz/?PowerShell/PowerShell%E3%81%A7Base64%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89
76
- https://www.haruru29.net/blog/how-to-do-clipboard-operations-using-powershell/