ホームページにできるだけ多くの画像を載せたいので、ひとつひとつの画像のサイズをペイントの「サイズの変更」で変更しているのですが、写真の枚数が多く、いつも苦労しているので、プログラムで処理しようとしているのですがうまくいきません。
今やろうとしているのは、フォーム(f)に設けたPctureBox1に画像を取り込み、拡大縮小の率によって異なるいくつかのボタンを設け、それをクリックし、OpenFileDialogで指定したディレクトリに記録しようというものです。
以下が私のやった内容で、縮小率50%(1000→500)の例です
PictureBox1には画像が取り込まれているとして
Public bmp as New Bitmap(1000,1000)
Public pg as Graphics
Private Sub Button1_Click(-----)
dim img as Bitmap
img=PictureBox1.Image
pg.Clear(Color.Empty)
pg.DrawImage(imag,0,0,500,500)
f.PictureBox1.imag=bmp
End Sub
これにより、画像はPictureBox1上では確かに50%に縮小され
これを、OpenFileDialogで得たPictureNameに
PictrueBox1.Image.Save(PictureName,Imaging.ImageFormat.Jpeg)
として記録するのですが、ペイントでやったの違ってキャンバスが元のままなのです。
キャンバスごと縮小する方法を教えて下さい。
やっている作業は、ペイントで画像を取り込み、サイズを変更して、指定したディレクトリーに記録するのと変わりありませんが、これができればいろいろ応用ができるので実現したいのです。 宜しくお願いします
この手は得意じゃ〜ないのですが・・・
Imports System.Drawing
Public Class Form1
Private orgBmp As Bitmap
Private dstBmp As Bitmap
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
orgBmp = Nothing
dstBmp = Nothing
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim szBmp As String
If orgBmp IsNot Nothing Then
orgBmp.Dispose()
orgBmp = Nothing
End If
If dstBmp IsNot Nothing Then
dstBmp.Dispose()
dstBmp = Nothing
End If
szBmp = Application.StartupPath + "\file_icon.bmp"
orgBmp = New Bitmap(szBmp)
dstBmp = ConvertBMP(orgBmp, 50.0)
dstBmp.Save(Application.StartupPath + "\conv.bmp")
Using g As Graphics = PictureBox1.CreateGraphics
g.DrawImage(orgBmp, 0, 0, orgBmp.Width, orgBmp.Height)
End Using
Using g As Graphics = PictureBox2.CreateGraphics
g.DrawImage(dstBmp, 0, 0, dstBmp.Width, dstBmp.Height)
End Using
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
Private Function ConvertBMP(ByVal org As Bitmap, ByVal p As Single) As Bitmap
Using dst As Bitmap = New Bitmap(CInt(CSng(org.Width * p / 100.0)), CInt(CSng(org.Height * p / 100.0)))
Using g As Graphics = Graphics.FromImage(dst)
g.DrawImage(org, 0, 0, dst.Width, dst.Height)
End Using
ConvertBMP = dst.Clone
End Using
GC.Collect()
End Function
End Class
こんなんで如何?
以上。参考まで・・・
オショウ さん ご回答ありがとうございます
この質問は間違えてVB6初心者掲示板で質問し、気が付いてこちらに質問し直したものですが、魔界の仮面弁士さんがそちらで回答してくれまして、私なりに解決したところでした。
しかし、オショウ さん が、教えていただいたやり方も勉強のため実現しようとしていたのですが、今のところうまくいっておらず、返事が遅れてしまいました。
私は.NETの本質的なところが未だ掴めていないので、初歩的質問ですが教えて下さい。
(1)最初にある
Imports System.Drawing は どこに書くのですか?
Public Class Form1 の 前に書いたのですが、宣言が必要だというコメントが返ってきます。
(2)次にPrivate Sub Button1_Click()で、
If orgBmp IsNot Nothing Then では、ステートメントの終わりを指定しろというコメントが出てきてしまいます。
(3)
szBmp = Application.StartupPath + "\file_icon.bmp" は縮小しようとしている画像ファイルの名前と考えてよいですか?
Application.StartupPath + "\conv.bmp は、縮小した画像のファイル名ですね?
宜しくお願いします
(1) System.Drawing を参照設定で追加して下さい。
(2) ?あれ・・・文法的には間違いではないので・・・
因みに、使用されているVisualStudioは何ですか?
2005/2008ともに問題ないはず・・・
2008で作ってましたが、試しに2005にコードを引越し
して動作確認・・・問題なく動作しました。
あ!Professional版ですが、Expressと相違しないはず
と思ってます。
(3) szBmp = Application.StartupPath + "\file_icon.bmp" は
元画像です。
Application.StartupPath + "\conv.bmp" は縮小後です。
以上。
私の使っているVisualStudioは2003年のProfessional版ですが、古すぎますかね?リタイヤーした後に買ったもので、新しいのに買い替えたいとは常々思っているのですが、高価なので、簡単には新しいのに手が出ません。
Expressと相違しないはず と ありますが、ここでいうExpressとは何ですか?
System.Drawing を参照設定で追加して下さい。という意味が分かりません。
ある目的があって、60歳近くになってから.NETを勉強し始めたので、基本的なところが分かっておりません。恐縮ですが簡単に説明お願いします。
VisualStudio2003ですか・・・
.NET Framework 1.1・・・
せめて、VisualStudio2005(.NET Framework 2.0)にされた方が・・・
あと、Expressをご存じない?!
で、調べもしないのですか?・・・
http://www.microsoft.com/japan/msdn/vstudio/2008/product/default.aspx
http://www.microsoft.com/japan/msdn/vstudio/2008/product/compare.aspx
エディション別情報読んで下さい。
http://www.microsoft.com/japan/msdn/vstudio/express/default.aspx
ここでダウンロードできます。
以上。
追伸
私の環境は既にVISTAに移行してしまっているので、残念ながら
VisualStudio2003 の動作環境がありません。
参照設定の説明ができないので・・・
http://www.ikepon.jp/old/archives/000679.html
プロジェクトの参照設定を右クリックして参照の追加を選択して
とあります。
チャレンジして下さい。
以上。
ツイート | ![]() |