午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

Zipファイルの中の画像ファイルを読み込んでPictureBoxに表示する VB .NET Visual Studio Community 2015

画像ファイルだけ入っているzipファイルの中の画像を読み込んで表示する

Visual Studio Community 2015で作成

イメージ 4
7つの画像ファイルが入っているzipファイルを読み込んで画像を表示したところ
 
デザイン画面(デザイナー)

f:id:gogowaten:20191023153944p:plain

最初からあるForm1にFlowLayoutPanelを一個追加しただけ
Form1をダブルクリックしてコードを書く
 
コードf:id:gogowaten:20191023153956p:plain
エラーの処理とか書いていないので9行目で指定しているzipファイルに
画像以外のファイルが入っているとエラーになる
 

Imports System.IO.Compression
Imports System.IO

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.FlowLayoutPanel1.Dock = DockStyle.Fill
        Me.FlowLayoutPanel1.AutoScroll = True

        Dim dir As String = "D:\ブログ用\作業用\画像をまとめたもの.zip"
        Dim pb As PictureBox
        Dim fs As New FileStream(dir, FileMode.Open, FileAccess.Read)
        Dim zip As New ZipArchive(fs, ZipArchiveMode.Read)

        'PictureBoxを作成してzipファイルの中の画像ファイルを読み込んでImageに指定する
        For Each z As ZipArchiveEntry In zip.Entries
            pb = New PictureBox 'PictureBox作成
            With pb
'Zipファイルの中の画像ファイルを読み込んでPictureBoxのImageに指定する
                .Image = Image.FromStream(z.Open()) 
                .SizeMode = PictureBoxSizeMode.Zoom '画像の表示モードの指定
                .Size = New Size(120, 90)           'サイズ指定
            End With

            Me.FlowLayoutPanel1.Controls.Add(pb)  'FlowLayoutPanel1にPictureBoxを追加
        Next

        '後片付け
        fs.Dispose()
        zip.Dispose()

    End Sub
End Class

 
参照したところは
ここなんだけど自分のところではなんか違う
zipファイルを扱うのに必要なZipArchiveっていうのが出てこない!

f:id:gogowaten:20191023154016p:plain

System.IO.Compression.って入れたら上の画像みたいに出てくるはずなんだけど
出てこないから真似できない!っていろいろ検索したけどわかんなくて
以前にエクセルVBAでも似たようなこと

 
 があったのを思い出して解決できた
答えは「System.IO.Compressionを参照に追加する」
以下はその方法
 
 
参照マネージャーを開く

f:id:gogowaten:20191023154026p:plain

ソリューションエクスプローラーの上から2番目あたりを右クリック→
追加→参照
 
参照マネージャー
System.IO.Compressionを検索してチェックを入れてOK
 

f:id:gogowaten:20191023154050p:plain

参照にSystem.IO.Compressionが追加された
これでzipファイルが扱えるようになった
 
イメージ 8
何かの追加なしにZipファイルを扱えるようになったのは最近らしく
.NET Framework4.5以降ということで確認したら4.5.2
 
 
画像ファルを読み込むときによく使っているのが
Image.FromStreamとImage.FromFile
FromFileは名前からもわかりやすい、ああファイルから読み込んでいるんだなあって
でもFromStreamはよくわからん、ストリームってなんなのって
ファルからメモリに読み込んで、そのメモリから読み込む感じなのかしら
 

f:id:gogowaten:20191023154113p:plain

11行目でFileStreamをNewで作るときにZipファイルを指定してできたストリームを
12行目でZipArchiveをNewで作るときに読み込んでいる
18行目でそのZipArchiveの中のZipArchiveEntryそれぞれにOpenメソッドで開いて
開いた中から出てきたものをImage.FromStreamで取り込んでいる
ZipArchiveEntryってのはZipファイルの中にあるファイルやフォルダっぽい
それをOpenするとストリーム形式で渡してくれるってことかな
ストリーム大活躍だなあ(よくわかっていない)