グラフィックビューワにZIPファイル内の画像ファイルを読み込む機能を追加しました。
コンパイル準備
ソースコード
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
using System.IO.Compression;
//
// ディレクトリ内の画像ファイルを連続表示するグラフィックビューワー
//
// 履歴
// Zipファイル内の画像ファイルに対応
// コンパイル
// csc /t:winexe SlideView.cs /r:System.IO.Compression.dll /r:System.IO.Compression.FileSystem.dll
namespace SlideView
{
class ImageItem
{
public string Name = "";
public string Location = "";
}
class Form1 : Form
{
List<ImageItem> ImageItems = new List<ImageItem>();
int ImagePosition = -1;
void MoveNext()
{
if (ImagePosition < 0) return;
if (ImagePosition == (ImageItems.Count() - 1)) return;
ImagePosition = ImagePosition + 1;
ShowPicture();
}
void MovePrevious()
{
if (ImagePosition <= 0) return;
ImagePosition = ImagePosition - 1;
ShowPicture();
}
void PictureBox1_MouseDown(Object s, MouseEventArgs e)
{
if (ImagePosition < 0) return;
if (e.Button == MouseButtons.Right)
{
MovePrevious();
}
if (e.Button == MouseButtons.Left)
{
MoveNext();
}
}
PictureBox PictureBox1 = new PictureBox
{
Dock = DockStyle.Fill,
AllowDrop = true,
SizeMode = PictureBoxSizeMode.Zoom,
};
void ShowPicture()
{
if (ImagePosition < 0) return;
if (PictureBox1.Image != null)
PictureBox1.Image.Dispose();
string location = ImageItems[ImagePosition].Location;
string name = ImageItems[ImagePosition].Name;
if (Directory.Exists(location))
{
string path = Path.Combine(location, name);
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
PictureBox1.Image = Image.FromStream(fs);
}
}
else if (File.Exists(location))
{
// Zipアーカイブ
using (var zip = ZipFile.OpenRead(location))
{
var entry = zip.GetEntry(name);
PictureBox1.Image = Image.FromStream(entry.Open());
}
}
}
enum PathType { None, Img, Dir, Zip };
void SetNewLocation(string path)
{
string location = "";
PathType pathType = PathType.None;
if (File.Exists(path))
{
if (Path.GetExtension(path).ToUpper() == ".ZIP")
{
location = path;
pathType = PathType.Zip;
}
else
{
location = Path.GetDirectoryName(path);
pathType = PathType.Img;
}
}
else if(Directory.Exists(path))
{
location = path;
pathType = PathType.Dir;
}
else return;
ImageItems.Clear();
ImagePosition = 0;
if (pathType == PathType.Img || pathType == PathType.Dir)
{
var files = Directory.EnumerateFiles(
location, "*", System.IO.SearchOption.TopDirectoryOnly);
ImagePosition = 0;
foreach(string f in files)
{
string ext = Path.GetExtension(f).ToUpper();
if (!Regex.IsMatch(ext, @"\.(PNG|JPEG|JPG|BMP)"))
continue;
ImageItems.Add(new ImageItem
{
Name = Path.GetFileName(f),
Location = location,
});
if (f == path)
{
ImagePosition = ImageItems.Count() - 1;
}
}
}
else if (pathType == PathType.Zip)
{
using (var zip = ZipFile.OpenRead(location))
{
foreach(var x in zip.Entries)
{
string ext = Path.GetExtension(x.FullName).ToUpper();
if (!Regex.IsMatch(ext, @"\.(PNG|JPEG|JPG|BMP)"))
continue;
ImageItems.Add(new ImageItem
{
Name = x.FullName,
Location = location,
});
}
}
}
if (ImageItems.Count() == 0)
{
ImagePosition = -1;
return;
}
ShowPicture();
}
void PictureBox1_DragDrop(Object s, DragEventArgs e)
{
string[] files =
(string[])e.Data.GetData(DataFormats.FileDrop, false);
SetNewLocation(files[0]);
}
void PictureBox1_DragEnter(Object s, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
void ChangeScreenMode()
{
if (this.WindowState == FormWindowState.Normal)
{
// フルスクリーン
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
else
{
// ウィンドウ
this.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Normal;
}
}
void Form1_KeyDown(Object s, KeyEventArgs e)
{
switch (e.KeyData)
{
case (Keys.F11):
ChangeScreenMode();
break;
}
}
Form1()
{
this.KeyPreview = true;
this.Controls.Add(PictureBox1);
this.KeyDown += Form1_KeyDown;
PictureBox1.DragEnter += PictureBox1_DragEnter;
PictureBox1.DragDrop += PictureBox1_DragDrop;
PictureBox1.MouseDown += PictureBox1_MouseDown;
}
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}// class
}// ns
コンパイル
csc /t:winexe SlideView.cs /r:System.IO.Compression.dll /r:System.IO.Compression.FileSystem.dll
実行
1-9の画像ファイルをzipファイルにアーカイブにし、そのファイルを起動したフォームにドラッグアンドドロップします。
zipファイル内の画像が表示されました。左クリックで次の画像、右クリックで前の画像が表示される点は前回と同じです。
コメント