画像を縮小するには?


hiroshi  2009-06-17 06:02:38  No: 145974

ホームページにできるだけ多くの画像を載せたいので、ひとつひとつの画像のサイズをペイントの「サイズの変更」で変更しているのですが、写真の枚数が多く、いつも苦労しているので、プログラムで処理しようとしているのですがうまくいきません。
今やろうとしているのは、フォーム(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)
として記録するのですが、ペイントでやったの違ってキャンバスが元のままなのです。
キャンバスごと縮小する方法を教えて下さい。
やっている作業は、ペイントで画像を取り込み、サイズを変更して、指定したディレクトリーに記録するのと変わりありませんが、これができればいろいろ応用ができるので実現したいのです。 宜しくお願いします


オショウ  2009-06-17 07:18:18  No: 145975

この手は得意じゃ〜ないのですが・・・

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

こんなんで如何?

以上。参考まで・・・


hiroshi  2009-06-18 05:31:16  No: 145976

オショウ さん  ご回答ありがとうございます
この質問は間違えて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  は、縮小した画像のファイル名ですね?

宜しくお願いします


オショウ  2009-06-18 06:53:02  No: 145977

(1) System.Drawing を参照設定で追加して下さい。
(2) ?あれ・・・文法的には間違いではないので・・・
    因みに、使用されているVisualStudioは何ですか?
    2005/2008ともに問題ないはず・・・

    2008で作ってましたが、試しに2005にコードを引越し
    して動作確認・・・問題なく動作しました。

    あ!Professional版ですが、Expressと相違しないはず
    と思ってます。
(3) szBmp = Application.StartupPath + "\file_icon.bmp" は
    元画像です。
    Application.StartupPath + "\conv.bmp" は縮小後です。

以上。


hiroshi  2009-06-18 11:23:08  No: 145978

私の使っているVisualStudioは2003年のProfessional版ですが、古すぎますかね?リタイヤーした後に買ったもので、新しいのに買い替えたいとは常々思っているのですが、高価なので、簡単には新しいのに手が出ません。

Expressと相違しないはず  と  ありますが、ここでいうExpressとは何ですか?

System.Drawing を参照設定で追加して下さい。という意味が分かりません。
ある目的があって、60歳近くになってから.NETを勉強し始めたので、基本的なところが分かっておりません。恐縮ですが簡単に説明お願いします。


オショウ  2009-06-18 12:05:50  No: 145979

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
ここでダウンロードできます。

以上。


オショウ  2009-06-18 12:09:33  No: 145980

追伸

私の環境は既にVISTAに移行してしまっているので、残念ながら
VisualStudio2003 の動作環境がありません。

参照設定の説明ができないので・・・

http://www.ikepon.jp/old/archives/000679.html
プロジェクトの参照設定を右クリックして参照の追加を選択して
とあります。

チャレンジして下さい。

以上。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加