スクリーンショットのサイズ変更で画質が粗くなる

サイズ変更後のスクリーンショットが、文字が潰れるくらい画質の粗いものになってしまいます。

具体的には、
サイズ変更はDrawImageメソッドを使用しており、こちらを行わずにそのまま貼り付ければオリジナル画質のままで、縮小すると画質が粗くなります。
(image.scale()でも同様に粗い画質になります)

ちなみに、スクリーンショットの取得、Excelに貼り付け、サイズ変更まですべて手動で行えばオリジナル画質のまま縮小できます。

縮小した際に画質が粗くなるのはどの環境で実施しても同様なのでしょうか?私のPCだけでしょうか?
また、メソッドを使用しても画質を維持する方法はないでしょうか。

追記
手動で縮小した時と、DrawImageを利用した時の比較データ(pdf)と、入力画像を添付いたします。

(出力比較)
比較.pdf (235.0 KB)

(入力画像)

こんにちは

具体的にどのような状態になっているか例示いただいたほうが良いかと思います。
可能であれば、ダミーでも良いので、入力と現状の出力を添付いただくとベターかと思います。

1 Like

ありがとうございます。
データ追加いたしました。

手動の場合は、core.image変数のままクリップボードに格納しますが、サイズ変更の場合Drawing.image変数でBitMapを経由してからcore.imageへセットするために画質が落ちているのかと思いました。

こんにちは

この手の話をする場合は、入力はともかく(この場合も地図画像のようなのでpng等の方が好ましいと思いますが)、出力は可逆圧縮方式での画像を添付いただく方が良いです。
PDFになってしまうと、どの段階で劣化しているかがわからなくなりますので。ちなみにJPEGも非可逆圧縮ですのであまりよくないです。リサイズで劣化したのか、JPEG自体の非可逆圧縮によるものなのか、その両方なのか、確認する要素が増えますので。

ありがとうございます。

(DrawImageによる自動縮小)
DrawImage
こちらになります。

入力画像はファイルサイズが大きすぎるためか、こちらにアップロードするとjpegになってしまいます。

入力画像と共に、zipファイルに入れさせていただきました。
image.zip (2.2 MB)

こんにちは

幅で見たとき1920を650に縮小していますので「こんなもの」ではないかと思いますが...
手動で縮小したものと差があるとのことですが、こちら添付可能でしょうか?

Excel上でスクリーンショットを手動で縮小した場合には差があるのですが(比較.pdf)、手動で縮小したものをコピーしてペイントから保存してみるとDrawImageを通したものと画質は変わりませんでした。

このスクリーンショットは、Excelに貼り付けたのち最終的にはPDFになるのですが、Excel上で見てもPDFで見ても、最初に添付させていただいたPDFの2枚目の画質になってしまいます。
オリジナル画像をExcel上で手動で縮小したのがPDFの1枚目なのですが、これと同様の画質で貼り付けるにするにはどうしたら良いでしょうか?

こんにちは

これは画面上ではサイズは小さくなっていますが、画像自体の情報量はそのままです。

オリジナル画像をExcel上で手動で縮小したのがPDFの1枚目なのですが、これと同様の画質で貼り付けるにするにはどうしたら良いでしょうか?

いくつか方法は考えられますが、マクロでやってしまた方が簡単なような気がします。(UiPathからはそのマクロを呼ぶ)

1 Like

なるほどですね。差分のある原因が理解できました。

メソッドではなくマクロを利用するのですね。
マクロからであれば情報量をそのままに、メソッドと同じように一つ一つのスクリーンショットに対して縮小することができるのでしょうか?

やりたいこと
スクリーンショットのそれぞれの貼り付け先は決まっており、A4縦の横幅に収まるように縮小したいです。
また、元の画像サイズや縦横比が不定のものもあるため、できれば縦横比を維持したまま縮小したいと考えています。

こんにちは

Excel VBAの話になりますので、インターネット上で調べればたくさん事例が出てくると思います。
(それを元に試したほうが早いと思います。)

ちなみに、こちらの「 Graphics.InterpolationModeプロパティ」を使用した拡大縮小の補間方法はUiPathでは実現できないでしょうか?

途中までやってみたのですが、Graphic変数の g を最終的にSetimageする方法がわかりませんでした。

お手数をおかけしてしまい申し訳ございませんが、ご確認いただけますと幸いです。

こんにちは

補間方法なので、拡大時はモードによる違いがかなりありますが、縮小時はそれほど影響はありませんよ。上記でセット自体は出来ていると思います。

確かにそうですね。
マクロ有効ブックにするのに抵抗があるためどうにかUiPathで実現できる方法を模索していました。

ちなみに、手動での縮小の場合は情報量がそのままと教えていただきましたが、なぜメソッドからだと情報量が小さくなってしまうのでしょうか?

例えば縮小するのが問題ならExcel自体のキャンバスを大きくしてしまって、それをA4に収まるように印刷時に設定してしまえば、最終的に同じサイズだったとしても画質は落ちないということでしょうか?

簡単でなくても良いので、方法をご教示いただけますと幸いです。

こんにちは

幅1920の画像を幅650にしますので、情報量は減少するのは、ある意味当然なのですが…。

手動で650pxにするのとメソッドからするのと何が違うのでしょうか。。

手動というのはエクセル上の操作を指しているとすると、エクセル上での操作は、ワークシート上での見た目のサイズは変化していますが、画像自体は何ら加工されていない状態で保持されています。情報量がそのままというのは、このような意味です。

1 Like

なるほどですね。それをUiPathでできたら良いのですが、貼り付け先がExcelの場合必ずこうなってしまうのでしょうかね。。
手動で縮小する操作の再現でもできれば良いのですが。

こんにちは

上記はアイデアとしてはありかと思います。
その他の文字について縮小前提で大きくしておく必要はあるかと思いますが。

簡単でなくても良いので、方法をご教示いただけますと幸いです。

アプローチ案としては
1.UI操作で頑張る
2. オフィス相互運用オブジェクト(Excel.Interop)で頑張る
3.ClosedXMLやNPOIで頑張る

1は安定性の観点からやめておいた方が無難と思います。
2はInvokeCodeでコード書ければ、ありかもしれません。
(リソースの解放をしっかりやらないとメモリリーク等につながります。)
以下3のサンプルです。あいにくUiPath付帯ののCloseXMLはバージョンが低いため
nuget.orgなどから最新のClosedXMLを導入する必要がありますので注意ください。
(また例外時のリソースの解放は記述していませんので、その点も注意ください)

Sample20220223-2.zip (9.0 KB)

1 Like

大変ありがたいです。
こちらゆっくり見させていただきます!