
ChatGPTにスクリーンショットを渡すことが多くなってきた。
そのまま何枚も貼っていると、画像の容量が大きいためか、すぐにアップロード上限へ引っかかって「数分待って」と言われることがある。
上限の詳しい内訳は発表されていないので、画像を軽くしたら何枚多く送れるのかは分からない。ただ、少しでもサイズを小さくして渡せばマシになるかもしれないと思って試してみた。
今回作ったのは、StrokesPlus.netで右クリックを押しながら左クリックすると、前面のウインドウを撮影して75%に縮小し、そのままクリップボードへ入れる設定だ。
今のところ以前と同じくらいのペースで使っているが、アップロード上限には出くわさなくなった。具体的な改善数値は出せないものの、少なくとも「このスクショを貼ったらまた止まるかも」という精神的な負担は減った。その設定過程を残しておく。
ChatGPTへ貼るスクショを軽くしたかった

普段のスクリーンショットにはWindows標準のSnipping Toolを使っている。クリップボードへ直接入るので便利だが、設定画面のスクショでも1枚1MB前後になることがあった。
ChatGPTに操作画面を見てもらうだけなら、元の解像度をそのまま維持しなくても文字が読めれば十分なことが多い。
今回やりたかったことは次の4つ。
- 撮影の操作を増やさない
- 文字が読める程度の画質は残す
- 画像を自動で軽くする
- 撮影後はそのまま
Ctrl + Vで貼れるようにする
実際に75%へ縮小して貼った画像は、886×1530・約280KBになった。Snipping Toolで撮った画像が毎回同じ条件ではないため厳密な比較ではないが、1MB前後だった画像よりはかなり軽い。
なお、ChatGPTのアップロード上限が画像の枚数・容量・利用状況のどれで決まるのかは分からない。今回確認できたのは、画像を軽くしたあと、今のところ同じ使い方で上限に遭遇していないところまでだ。
右クリック+左クリックで撮影する設定

もともとStrokesPlus.netには、Snipping Toolを起動するアクションを作っていた。
sp.Run('explorer.exe "ms-screenclip:"');
ジェスチャーは登録せず、修飾子に左ボタンを指定。これで右クリックを押しながら左クリックするとSnipping Toolが起動するようにしていた。
ただ、Snipping Toolを起動してから範囲を選ぶと操作が一段増える。そこで同じ右+左クリックを使い、StrokesPlus.net側で前面のウインドウを直接撮れないか試した。
目標にした流れはこれ。
- 撮りたいウインドウを前面にする
- 右クリックを押しながら左クリックする
- 前面ウインドウを撮影する
- 縦横75%へ縮小する
- クリップボードへコピーする
- ChatGPTで
Ctrl + Vを押す
action.Boundsではエラーになった

最初は action.Bounds からウインドウサイズを取得しようとした。
var srcImage = new drawing.System.Drawing.Bitmap(
action.Bounds.Width,
action.Bounds.Height
);
ところが実行すると、次のエラーが出た。
使用されたパラメーターが有効ではありません。

書き方を少し変えて試しても同じエラー。今回の右クリック+左クリック操作では、action.Bounds からBitmap作成に使えるウインドウサイズを取れていないようだった。
ここは原因を断定せず、別の取得方法へ切り替えた。
action.Window.Rectangleで前面ウインドウを取得できた

代わりに使ったのが action.Window.Rectangle だ。
var rect = action.Window.Rectangle;
var w = rect.Width;
var h = rect.Height;
if (w <= 0 || h <= 0) {
sp.MessageBox(
"Window size error\nWidth=" + w + "\nHeight=" + h,
"Screenshot"
);
} else {
var img = new drawing.System.Drawing.Bitmap(w, h);
var g = drawing.System.Drawing.Graphics.FromImage(img);
g.CopyFromScreen(
rect.X,
rect.Y,
0,
0,
new drawing.System.Drawing.Size(w, h)
);
clip.SetImage(img);
g.Dispose();
img.Dispose();
}
これで、前面にあるウインドウの位置とサイズを取得し、その範囲を撮影してクリップボードへ入れられた。
途中では成功・失敗を知らせる通知も追加したが、ShowBalloonTip の引数が合わずエラーになった。

エラー時は無理に処理を続けず、最終的にはキャプチャ範囲の幅か高さが0以下なら失敗通知を出す形にした。
75%縮小からコピーまでを自動化した

最終的に使っているコードがこれ。
var rect = action.Window.Rectangle;
var srcW = rect.Width;
var srcH = rect.Height;
if (srcW <= 0 || srcH <= 0) {
sp.ShowBalloonTip(
"Screenshot",
"キャプチャ失敗",
"error",
1500
);
} else {
var srcImage = new drawing.System.Drawing.Bitmap(srcW, srcH);
var srcGraphics =
drawing.System.Drawing.Graphics.FromImage(srcImage);
srcGraphics.CopyFromScreen(
rect.X,
rect.Y,
0,
0,
new drawing.System.Drawing.Size(srcW, srcH)
);
var scale = 0.75;
var dstW = Math.round(srcW * scale);
var dstH = Math.round(srcH * scale);
var dstImage =
new drawing.System.Drawing.Bitmap(dstW, dstH);
var dstGraphics =
drawing.System.Drawing.Graphics.FromImage(dstImage);
dstGraphics.InterpolationMode =
drawing.System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
dstGraphics.DrawImage(
srcImage,
0,
0,
dstW,
dstH
);
clip.SetImage(dstImage);
sp.ShowBalloonTip(
"Screenshot",
"75%縮小 → クリップボード",
"info",
1000
);
dstGraphics.Dispose();
srcGraphics.Dispose();
dstImage.Dispose();
srcImage.Dispose();
}
scale を 0.75 にしているので、縦と横がそれぞれ75%になる。総画素数で見ると元画像の約56%だ。
現在の操作はかなり単純になった。
- 撮りたいウインドウを前面にする
- 右クリックを押しながら左クリックする
- 「75%縮小 → クリップボード」の通知を確認する
- ChatGPTの入力欄で
Ctrl + Vを押す
理想は、右+左クリックで起動したあとに撮りたいウインドウをクリックして選ぶ動きだった。ただ、発動後に次のクリックを待つ処理までStrokesPlus.netだけで組むと複雑になりそうだったため、今回は先に撮りたいウインドウを前面へ出す運用にしている。
今のところ、この形で十分使えている。アップロード上限がどれだけ緩和されたかは数値で示せないが、スクショ1枚ごとの容量を気にすることは減った。何より、撮影・縮小・コピーが一度に終わるので、ChatGPTへ画面を見せる流れがかなり楽になった。
※今は同時にローカルに保存してバックアップもしている。



コメント