SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

ZIPファイル内の画像を表示する.NET アプリケーションの作成

ComponentOne Studio 2010JのC1Zipコントロールを使ったZIP形式ファイルから画像を表示するアプリケーションの作成

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

 ComponentOne Studio 2010JのC1Zipコントロールは、ZIP形式のファイル圧縮・展開機能などを提供するコントロールです。今回は、このC1Zipコントロールを使い、画像を圧縮したZIPファイルを指定するだけで中身の画像ファイルを取り出し、ファイル名とともに表示してくれるアプリ ケーションを作成しました。

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

はじめに

 サイズの大きなファイルや、複数のファイルを1つにまとめる事ができるファイル圧縮技術は、ファイル管理には欠かせないものになっています。その中でも、ZIP形式の圧縮技術は、Windows VistaからはOS標準で搭載されており、専用のアプリケーションがなくても圧縮・解凍が可能になっています。

 しかし、一度圧縮したZIPファイルの中身を確認するとなると、解凍して1つ1つのファイルを開かなくてはならないという、面倒な操作を行うことになります。ZIPファイルを指定するだけで、その中身を取り出して表示してくれるアプリケーションがあると便利ですね。

 そこで、ComponentOne Studio 2010JのPowerTools ZIP for .NETにあるC1Zipコントロールを使い、画像を圧縮したZIPファイルを指定するだけで中身の画像ファイルを取り出し、ファイル名とともに表示してくれるアプリケーションを作成しました。

指定したZIPファイルを開き、画像とファイル名を取り出して表示する
指定したZIPファイルを開き、画像とファイル名を取り出して表示する
画像以外のファイルを圧縮したZIPファイルは開けないようにしている
画像以外のファイルを圧縮したZIPファイルは開けないようにしている

対象読者

 Visual Basic/Visual C# 2005/2008を使ってプログラムを作ったことのある人

必要な環境

 Visual Basic 2005/2008、Visual C# 2005/2008、Visual Studio 2005/2008でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2008を使用して作成し、動作確認を行っています。

プログラム実行時の注意事項

 ZIP for .NETのC1Zipコントロールを使って作成したアプリケーションを配布する場合、ZIP for .NETのアセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。

ファイル 内容
C1.C1Zip.2.dll C1Zipコントロール(Visual Studio 2005/2008用)

 このファイルを、プログラムを実行するフォルダにフォルダ構成を変えずに格納します。

コンポーネントのインストール

 はじめてZIP for .NETのC1Zipコントロールを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2010Jをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。

 製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 ZIP for .NETのC1Zipコントロールは、インストールしてもVisual Studioのツールボックスに表示されません。コントロールという形態ではなくDLLで機能が提供されているためで、C1Zipコントロールを使用する場合はDLLに対してプロジェクトの「参照設定」を行う必要があります。

 ソリューションエクスプローラの「参照設定」の上でショートカットメニューを表示し、[参照の追加]を選びます。そして、「.NET」のコンポーネント名が「ComponentOne C1Zip JPN」を選択します。

コンポーネント名が「ComponentOne C1Zip JPN」を選択する
コンポーネント名が「ComponentOne C1Zip JPN」を選択する

C1Zipコントロールについて

 C1Zipコントロールは、ZIP形式のファイル圧縮・展開機能を提供するコントロールです。ZIPファイルの作成、圧縮ファイルの解凍と一部ファイルの取出し、圧縮ファイルの追加・管理などの操作を行うことができます。また、操作対象はファイルだけでなく、フォルダごとの圧縮・解凍を行うことができます。

 さらに、ZIPファイルの操作はディスクに対してだけでなく、メモリやネットワークなど「ストリーム」に対して行うことができます。配列変数で直接処理を行うことができるので、データをいちいちディスクに落とす必要がなく、その分高速な処理を行うことができます。

 C1Zipコントロールでの処理は、次の3種類のクラスを使って行われます。

クラス 説明
C1ZipFile/C1ZipEntry/C1ZipEntryCollection ZIPファイルを作成する/開く/管理する操作を行うクラス
C1ZStreamReader/C1ZStreamWriter .NETストリーム(メモリ、ファイル、ネットワークの各ストリームなど)でのデータの圧縮/展開を行うクラス
ZStream ZlibのC#実装を行うクラス

 C1ZStreamReaderとC1ZStreamWriterクラスは、ZIPファイル内のデータはもちろん、あらゆる.NETストリーム上でデータ圧縮・解凍を行うクラスです。

 通常のストリームに付加することで、これらのクラスを介してデータの読み取りと書き込みを行います。従って、例えばADO.NETでデータベースのテーブルデータをそのまま読み込んで直接圧縮したり、ZIPファイルの中の圧縮ファイルを取り出して直接コントロールで表示したり、といった操作が可能になります。

ZIPファイルから画像ファイルを読み込むアプリケーションの作成

 では、さっそくこのC1Zipコントロールを使ったアプリケーションを作成しましょう。今回作成するアプリケーションは、次のような機能を持ちます。操作対象のZIPファイルは、画像ファイルだけを格納しているZIPファイルです。

  1. 画像ファイル(JPEGファイル)を4つ圧縮したZIPファイル「images.zip」を開き、JPEGファイルを1つずつストリームに読み出す
  2. 読み出したJPEGファイルをPictureBoxコントロールでフォームに表示する
  3. そのファイル名をLabelコントロールでPictureBoxコントロールの下に表示する
  4. 画像ファイル以外のファイルを格納しているZIPファイルを指定した場合は、処理を中止する

 なお、PictureBox・Labelコントロールはコードから作成します。

GUIのデザイン

 デザイン時に作成するフォームと、実行時のフォームのレイアウトは次のようになります。

デザイン時に作成するフォーム
デザイン時に作成するフォーム
実行時のフォームのレイアウト
実行時のフォームのレイアウト

 デザイン時の各コントロールのプロパティは、次のように設定します。

オブジェクト プロパティ 設定値
Form1 Text ZIPファイルから画像ファイルを読み込むアプリケーション
Button1 Text 画像の取り出し...
Label1 Text ""
Border Fixed3D
Panel1 Border Fixed3D
Dock Top
Panel2 Border Fixed3D
Dock Fill
OpenFileDialog1 FileName *.zip
Filter *.zip|*.zip
images.zipの中身
images.zipの中身

ZIPファイルを開く処理

 では、最初にZIPファイル「images.zip」を開く処理を作成します。処理は、すべてButtonコントロールのClickイベントハンドラで行います。ZIPファイルの指定は、「ファイルを開くダイアログボックス」を使用します。

 まず、「System.IO」「C1.C1Zip」の2つの名前空間への参照を設定します。そして、「ファイルを開くダイアログボックス」を表示し、ZIPファイルのファイル名を取得します。取得したファイル名はLabelコントロールで表示します。

Visual Basic
Imports System.IO
Imports C1.C1Zip

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim w, h, i As Integer
        Dim fname As String

        Dim ret As DialogResult = OpenFileDialog1.ShowDialog()
        If ret = DialogResult.Cancel Then
            MessageBox.Show("キャンセルボタンが押されました。" & Chr(13) & _
                            "操作をキャンセルします", "操作の中止", _
                            MessageBoxButtons.OK, MessageBoxIcon.Stop)
            Exit Sub
        Else
            fname = OpenFileDialog1.FileName
            Label1.Text = fname
        End If
C#
using System.IO;
using C1.C1Zip;

namespace myzip_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int w, h, i;
            string fname;

            DialogResult ret= openFileDialog1.ShowDialog();
            if(ret == DialogResult.Cancel)
            {
                ret = MessageBox.Show("キャンセルボタンが押されました。" + "\r\n" +
                                      "処理を終了します", "操作の中止", 
                                      MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return;
            }else
            {
                fname = openFileDialog1.FileName;
                label1.Text = fname;
            }

 取得したファイル名を使ってZIPファイルを開きます。まず、C1ZipFileクラスのインスタンスを作成します。そして、Openメソッドを使ってZIPファイルを開きます。

 ファイルを開いたら、Entriesプロパティで現在開いているZIPファイル内のエントリのコレクションクラス「C1ZipEntryCollection」を取得します。このコレクションには、ZIPファイル内に圧縮されているファイルの情報が「C1ZipEntryオブジェクト」として格納されています。

 また、コレクションのCountプロパティを調べると、圧縮されているファイル数が把握できるので、これを確認します。もし、何も格納されていなければ、ここで処理を中止します。

Visual Basic
'ZIPファイルを開く
 Dim zip As New C1ZipFile()
 zip.Open(fname)

 'ZIP内のファイル数の確認
 Dim cnt As Integer = zip.Entries.Count
 If cnt = 0 Then
     MessageBox.Show("読み込むファイルがありません")
     Exit Sub
 End If
C#
//ZIPファイルを開く
C1ZipFile zip = new C1ZipFile();
zip.Open(fname);
//ZIP内のファイル数の確認
int cnt = zip.Entries.Count;
if( cnt == 0)
{
    MessageBox.Show("読み込むファイルがありません");
    return;
}

画像ファイルを取り出しPictureBoxで表示する処理

 ZIPファイルに格納されているファイル数が分かったら、続いて画像ファイルを1つずつ読み出し、PictureBoxコントロールとLabelコントロールを作成して、フォームのパネルに表示していきます。格納されているファイル数が分かったので、その数だけ処理を繰り返していきます。

 まず、C1ZipEntryCollectionから最初のJPEGファイルのC1ZipEntryオブジェクトにアクセスし、OpenReaderメソッドで画像ファイルを読み出します。OpenReaderメソッドは、ディスクに抽出せずにZIP内に格納されたファイルを、データの読み取りに使用できる「C1ZStreamReader」というStreamオブジェクトとして返してきます。そして、ファイルから読み取るときにデータは自動的に圧縮解除されるので、このOpenReaderメソッドを実行するだけで、ZIPファイル内の圧縮ファイルを取り出すことができます。

Visual Basic
'画像ファイルを取り出しPictureBoxで表示する
Dim s As Stream
w = 150
h = 100

For i = 0 To cnt - 1
    '画像ファイルをストリームに読み込む
    s = zip.Entries(i).OpenReader()
C#
//画像ファイルを取り出しPictureBoxで表示する
Stream s;
w = 150;
h = 100;

for(i=0; i<=cnt-1;i++)
{
    //画像ファイルをストリームに読み込む
    s = zip.Entries[i].OpenReader();

 次に、PictureBoxコントロールを作成してImageプロパティに画像をセットし、パネル「Panel2」に組み込みます。また、Labelコントロールも作成し、Textプロパティにファイル名を設定し、PictureBoxコントロールの下に配置します。

 このとき、Try...Catchステートメントを使用して、PictureBoxコントロールへの画像セットのエラー処理を設定しておきます。もし、Imageオブジェクト以外のファイルが解凍された場合は、メッセージボックスで表示し処理を中止します。最後に、ストリームを閉じます。

 この処理を、ZIPファイル内のファイル数ぶん繰り返します。

Visual Basic
            Try
                'PictureBoxを作成して画像をセットしパネルに組み込む
                Dim pb As New PictureBox
                pb.Image = CType(Image.FromStream(s), Image)
                pb.Visible = True
                pb.SizeMode = PictureBoxSizeMode.StretchImage
                pb.Size = New Size(w, h)
                pb.Left = ((w + 5) * i) + 5
                pb.Top = 10
                Me.Panel2.Controls.Add(pb)

                'ファイル名の設定
                fname = zip.Entries(i).FileName
                Dim lbl As New Label
                lbl.Text = fname
                lbl.Visible = True
                lbl.Left = ((w + 5) * i) + 5
                lbl.Top = 120
                Me.Panel2.Controls.Add(lbl)


            Catch ex As Exception
                MessageBox.Show("指定された形式のZIPファイルではありません。" + Chr(13) _
                                + "もう一度ファイルを選んでください", ex.Message, _
                                MessageBoxButtons.OK, MessageBoxIcon.Stop)
                Exit Sub
            End Try
            s.Close()
        Next
    End Sub
End Class
C#
                
                try
                {
                    //PictureBoxを作成して画像をセットしパネルに組み込む
                    PictureBox pb = new PictureBox();
                    pb.Image = Image.FromStream(s);
                    pb.Visible = true;
                    pb.SizeMode = PictureBoxSizeMode.StretchImage;
                    pb.Size = new Size(w, h);
                    pb.Left = ((w + 5) * i) + 5;
                    pb.Top = 10;
                    panel2.Controls.Add(pb);

                    //ファイル名の設定
                    fname = zip.Entries[i].FileName;
                    Label lbl = new Label();
                    lbl.Text = fname;
                    lbl.Visible = true;
                    lbl.Left = ((w + 5) * i) + 5;
                    lbl.Top = 120;
                    panel2.Controls.Add(lbl);


                }catch( Exception ex)
                {
                    ret = MessageBox.Show("指定された形式のZIPファイルではありません。" + "\r\n"
                                    + "もう一度ファイルを選んでください", ex.Message,
                                    MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    return;
                }
                s.Close();
            }
        }
    }
}

まとめ

 C1Zipコントロールは、市販のZIPアプリケーションと違い、ファイル圧縮・解凍機能を直接アプリケーションに実装させることができ、圧縮ファイルの追加・削除、読み出し、格納情報の取得などZIPファイルを自在に操作できます。

 また、ファイルシステムだけでなく.NETのストリームを使うことができるので、オンメモリでデータをすぐに圧縮することもでき、高速に圧縮処理を行うことができます。パスワードの設定もできるので、圧縮機能と合わせデータのセキュリティ設定にも役立つ機能をアップロードに組み込むことも可能です。

※注

サンプルプログラムで使用している写真は、すべて「アルペンガーデンやまくさ」が所有しています。無断で、転載・販売・掲載することを禁止します。

製品情報

修正履歴

この記事は参考になりましたか?

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

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5266 2010/07/06 15:48

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング