ディレクトリ内の画像ファイルを連続表示するグラフィックビューワ

.NET Framework コンピュータ
.NET Framework

クリックで次の画像が表示するグラフィックビューワを作ります。

過去にも何度も同様なグラフィックビューワを作成していますが、mono環境で実行したいのでwinforms(.NET Framework)でプログラミングをしています。

自分好みの機能をトッピングする予定です。

コンパイル準備

ソースコード

using System;
using System.Windows.Forms;
using System.Drawing;

using System.Collections.Generic;
using System.Linq;

using System.IO;
using System.Text.RegularExpressions;

// 
// ディレクトリ内の画像ファイルを連続表示するグラフィックビューワー
// 

// コンパイル
// csc /t:winexe SlideView.cs


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);
                }
            }
        }
        void SetNewLocation(string path)
        {
            string location = "";

            if (File.Exists(path))
            {
                location = Path.GetDirectoryName(path);

            }
            else if(Directory.Exists(path))
            {
                location = path;
            }
            else return;

            var files = Directory.EnumerateFiles(
                location, "*", System.IO.SearchOption.TopDirectoryOnly);
            
            ImageItems.Clear();
            if (files.Count() == 0)
            {
                ImagePosition = -1;
                return;
            }

            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;
                }
            }
            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

テスト用画像ファイル作成スクリプト

<#
.SYNOPSIS
 連番画像作成

.EXAMPLE
 Create-SEQPIC

#>

Add-Type -AssemblyName System
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"

$W = 1128
$H = 1600

for ($i=1; $i -lt 10; $i++)
{
    $Bitmap = [System.Drawing.Bitmap]::new($W, $H, [System.Drawing.Imaging.PixelFormat]::Format24bppRgb)
    $g = [System.Drawing.Graphics]::FromImage($Bitmap)

    # 白で塗りつぶし
    $rect = [System.Drawing.Rectangle]::new(0, 0, $W, $H)
    $g.FillRectangle([System.Drawing.Brushes]::White, $rect)
    $font = [System.Drawing.Font]::new("MS UI Gothic", 240);
    $g.DrawString($i, $font, [System.Drawing.Brushes]::Black, 300, 600)
    $g.Dispose()

    $Bitmap.Save("保存ディレクトリ/" + $i + ".png", [System.Drawing.Imaging.ImageFormat]::Png)

    $Bitmap.Dispose()
}

コンパイル

csc /t:winexe SlideView.cs

実行

C#のソースコードをコンパイルしテスト用画像ファイル作成スクリプトを実行すると1-9の画像ファイルが出来上がります。

実行ファイル(SlideView.exe)を起動します。

起動したフォームに4.pngをドラッグアンドドロップドロップします。

左クリックすると4.pngの次の5.pngが表示されます。

さらにクリックを繰り返すとすると9.pngで止まります。

右クリックで9.png⇒8.pngと移動し、繰り返すと1.pngで止まります。

F11キーで全画面とWindowモードを切り替えます。

機能は以上となります。

コメント