- ベストアンサー
Visual Basicで写真サイズを縮小したい。
JPG写真でも10MBを越しますので、500KB以下とか横を1,200ピクセルとかに縮小するアプリを考えてます。 縮小用のアプリでは簡単に縮小できますが、VBを使って縮小したいのです。 PictureBoxにはそんな機能はないようですが、なにか方法はあるでしょうか? OSはW10、VB2015です。 ヒントだけでも結構です。宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 縮小用のアプリでは簡単に縮小できますが、 その縮小用のアプリがコマンドラインから使えるなら、VBからコマンド呼び出して縮小とか。 > 500KB以下とか横を1,200ピクセルとかに どちたにしたいんでしょう? 例えばIrfanViewだと、後者やJPEG圧縮率を指定なら出来そうですが、ファイルサイズを指定しての圧縮は出来なそうです。 両方満たすようにとかなら、コマンドラインで詳細な動作の設定は出来ませんが、「縮小専用。」が使いやすいかも。 縮小専用。 - i-section.net http://i-section.net/software/shukusen/ 予め、そういう設定にしといて、Shell関数で呼び出しとか。 Shell("【縮小専用。のインストール場所】\ShukuSen.exe "&【対象ファイル】)
その他の回答 (3)
- neKo_quatre
- ベストアンサー率44% (735/1636)
> 縮小をVBだけでやりたいというのが目的なのです。 どの程度やるか?どういう方法でやるか?次第です。 ツールがダメなら、外部のライブラリなんかもダメ? Bitmapオブジェクトに読み込んで、Graphicsオブジェクトの機能で指定の縦横サイズに縮小とかなら、そんなに難しくないです。 補間方法を指定して画像を拡大、縮小(スケーリング)表示する: .NET Tips: C#, VB.NET http://dobon.net/vb/dotnet/graphics/interpolationmode.html ただ、ファイルサイズを指定しようと思ったら、適当な圧縮率で仮想のファイルなんか作って試行錯誤する方法でないなら、いわゆるJPEG作成するアルゴリズムに沿って処理とか。 ファイルサイズ指定してJPEG作成できるライブラリとか探す方が早いかも。
お礼
neKo_quatreさん お陰様で大分進みました。 縮小してデスクトップへ張り付けるところまでできました。 が、縮小後のサイズの決め方が良く分かりません。PictureBoxのサイズモードなどいろいろ変えてやりましたが、8MBの写真が20KBになってしまいました。 image.pixcelsizeとかいうのがあるかもしれませんので探してみます。 いずれにしましてもVBでは縮小できないのかと思ってましたので、大変な進歩です。 有難うございました。 もしお時間がありましたら、縮小のサイズの決め方お分かりでした宜しくお願い致します。 取りあえずは、今回のご回答を頂いたことで、この質問完了とさせていただきます。 有難うございました。
補足
neKo_quatreさん お陰様で大分進みました。 縮小してデスクトップへ張り付けるところまでできました。 が、縮小後のサイズの決め方が良く分かりません。PictureBoxのサイズモードなどいろいろ変えてやりましたが、8MBの写真が20KBになってしまいました。 image.pixcelsizeとかいうのがあるかもしれませんので探してみます。 いずれにしましてもVBでは縮小できないのかと思ってましたので、大変な進歩です。 有難うございました。 もしお時間がありましたら、縮小のサイズの決め方お分かりでした宜しくお願い致します。 取りあえずは、今回のご回答を頂いたことで、この質問完了とさせていただきます。 有難うございました。 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Imports System.Drawing '描画先とするImageオブジェクトを作成する Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height) 'ImageオブジェクトのGraphicsオブジェクトを作成する Dim g As Graphics = Graphics.FromImage(canvas) 'Bitmapオブジェクトの作成 Dim image = New Bitmap(My.Resources.こきあ) '補間方法を指定して画像を縮小して描画する '補間方法として最近傍補間を指定する g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor '画像を縮小して描画する。縮小しているが、まだ綺麗にはしていない。 g.DrawImage(image, 0, 0, 300, 200) '補間方法として高品質双三次補間を指定する g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic '画像を縮小して描画する。 縮小・美麗後の写真 g.DrawImage(image, 210, 0, 300, 200) 'BitmapとGraphicsオブジェクトを破棄 image.Dispose() g.Dispose() 'PictureBox1に表示する PictureBox1.Image = canvas 'ここまではOK 縦写真の場合?? 10/28/2016 '画像を作成する Dim bmp As New Bitmap(canvas) 'JPG形式で保存する bmp.Save("C:\Users\tak11\Desktop\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) '後片付け bmp.Dispose()
- bardfish
- ベストアンサー率28% (5029/17766)
PictureBoxコントールでも不可能ではなかったはずですが、JPEGで保存はできませんよ? 保存できたとしてもBMPになったはずです。 BMPはJPGよりもファイルサイズが遥かにでかくなります。圧縮されてませんからね。 市販の拡張コントロールを購入するのが一番簡単です。 でも、再配布可能なライセンス付きの拡張コントロールは高いです。モノによってはそれだけでVisualStudioのPro版が買えます。 Visual C++などでVBで使える拡張コントロールを作成すれば買わなくても実現可能ですが、敷居は格段に上がりますよねw
お礼
bardfishさん コメント有難うございます。 VBのResourcesにjpgファイルを入れて表示させていますが、BMPには変換されていないようです。 サイズも変わっていません。 縮小のアルゴリズムに則って縮小するのであれば、とても自分の力では無理ですので諦めます。 有難うございました。
- 志摩 隆(@shima327)
- ベストアンサー率42% (255/598)
小生は,VBを少々かじった程度の知識しかありませんが、 写真を縮小すると言うことは、単にファイルサイズを小さくしたり、 ピクセル数を縮小する事ではありません。 沢山ある色の画素(ピクセル)の内、どの画素を取捨選択するかという、 高度なアルゴリズムが必要で、VBで出来る話では無いと思います。 PictureBoxにその機能が無いのは、写真の縮小は別物との判断と思います。 ご存じの縮小アプリが何かは解りませんが、縮小アプリの制作者は、 どんな定義、計算式をもってアルゴリズムを完成させるか研究します。 小生、写真を趣味としていますので、多くの縮小アプリを経験していますが、 今のところ、満足(なんとか納得するレベルですが)しているのは、 たった一つです。 もちろん高度な写真編集ソフトなら、満足出来る仕上がりになるものも いくつもあります。が、いわゆる縮小アプリではまだまだ感があります。 変な理屈を述べましたが、結論は先に述べたように、 VBでは出来ないと思います。
お礼
shima327さん 早速コメントを頂き有難うございます。 そうでね、どういうアルゴで縮小しているのか知りたいですね。 VBでは無理そうですね。 「縮専」ソフトで我慢します。 有難うございました。
お礼
neKo_quatreさん 早速のコメント有難うございます。 おっしゃられる方法で、「縮専」をShellで呼び出せるのかもしれませんが、縮小をVBだけでやりたいというのが目的なのです。 縮小は500KB以下とか指定してもよいし、1,200x800ピクセルと指定する方法でもいいのですが、JPG縮小するには専門的なアルゴリズムに従う必要なあるようにも思えますが、どうなのでしょうか?