Download ImageBoxTiffViewer.zip, last updated 30/07/2016 (3.93 MB)

Download
  • md5: ef452b2d2baa27fcc0fa5c9d031b021c
  • sha1: b1c65a3601495bcabd6847831702ded93dbc5a47
  • sha256: 52680d16d3825c2096f502526f0de41b2db2992679cfe8154ad3c9d7836b664c
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

// Displaying multi-page tiff files using the ImageBox control and C#
// http://www.cyotek.com/blog/displaying-multi-page-tiff-files-using-the-imagebox-control-and-csharp
// Copyright © 2016 Cyotek Ltd. All Rights Reserved.

namespace Cyotek.Demo.TiffViewer
{
  public partial class MainForm : Form
  {
    #region Fields

    private int _currentPage;

    private Image _openImage;

    private int _pageCount;

    #endregion

    #region Constructors

    public MainForm()
    {
      this.InitializeComponent();
    }

    #endregion

    #region Methods

    /// <summary>Raises the <see cref="E:System.Windows.Forms.Form.FormClosing" /> event.</summary>
    /// <param name="e">A <see cref="T:System.Windows.Forms.FormClosingEventArgs" /> that contains the event data. </param>
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
      base.OnFormClosing(e);

      if (!e.Cancel)
      {
        this.CloseImage();
      }
    }

    /// <summary>Raises the <see cref="E:System.Windows.Forms.Form.Shown" /> event.</summary>
    /// <param name="e">A <see cref="T:System.EventArgs" /> that contains the event data. </param>
    protected override void OnShown(EventArgs e)
    {
      string[] arguments;

      base.OnShown(e);

      arguments = Environment.GetCommandLineArgs();

      this.OpenImage(arguments.Length > 1 ? arguments[1] : "NewtonsCradle.tif");
    }

    private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
    {
      using (AboutDialog dialog = new AboutDialog())
      {
        dialog.ShowDialog(this);
      }
    }

    private void CloseImage()
    {
      if (_openImage != null)
      {
        imageBox.Image = null;
        _openImage.Dispose();
        _openImage = null;
      }
    }

    private void copyToolStripMenuItem_Click(object sender, EventArgs e)
    {
      try
      {
        Clipboard.SetImage(imageBox.Image);
      }
      catch (ExternalException ex)
      {
        MessageBox.Show($"Failed to copy image to the Clipboard. {ex.GetBaseException().Message}", "Copy Image", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.Close();
    }

    private void firstPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.ShowPage(1);
    }

    private int GetPageCount(Image image)
    {
      FrameDimension dimension;

      dimension = FrameDimension.Page;

      return image.GetFrameCount(dimension);
    }

    private void lastPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.ShowPage(_pageCount);
    }

    private void nextPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.ShowPage(_currentPage + 1);
    }

    private void OpenImage(string fileName)
    {
      fileName = Path.Combine(Environment.CurrentDirectory, fileName);

      if (!File.Exists(fileName))
      {
        MessageBox.Show($"Cannot find file '{fileName}'", "Open File", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
      }
      else
      {
        try
        {
          this.OpenImage(Image.FromFile(fileName));
        }
        catch (OutOfMemoryException ex)
        {
          MessageBox.Show($"Failed to open file '{fileName}'. {ex.GetBaseException().Message}", "Open File", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
      }
    }

    private void OpenImage(Image image)
    {
      this.CloseImage();

      _openImage = image;
      _pageCount = this.GetPageCount(image);

      imageBox.Image = _openImage;

      this.ShowPage(1);

      imageBox.ZoomToFit();
    }

    private void OpenImage()
    {
      using (OpenFileDialog dialog = new OpenFileDialog
                                     {
                                       Title = "Open Image",
                                       DefaultExt = "tif",
                                       Filter = "All Pictures(*.emf; *.wmf; *.jpg; *.jpeg; *.jfif; *.jpe; *.png; *.bmp; *.dib; *.rle; *.gif; *.tif; *.tiff)| *.emf; *.wmf; *.jpg; *.jpeg; *.jfif; *.jpe; *.png; *.bmp; *.dib; *.rle; *.gif; *.tif; *.tiff | Windows Enhanced Metafile (*.emf) | *.emf | Windows Metafile(*.wmf) | *.wmf | JPEG File Interchange Format(*.jpg; *.jpeg; *.jfif; *.jpe)| *.jpg; *.jpeg; *.jfif; *.jpe | Portable Networks Graphic (*.png) | *.png | Windows Bitmap(*.bmp; *.dib; *.rle)| *.bmp; *.dib; *.rle | Graphics Interchange Format (*.gif) | *.gif | Tagged Image File Format(*.tif; *.tiff)| *.tif; *.tiff | All files(*.*) | *.*"
                                     })
      {
        if (dialog.ShowDialog(this) == DialogResult.OK)
        {
          this.OpenImage(dialog.FileName);
        }
      }
    }

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.OpenImage();
    }

    private void previousPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.ShowPage(_currentPage - 1);
    }

    private void SaveImageFrame()
    {
      using (SaveFileDialog dialog = new SaveFileDialog
                                     {
                                       Filter = "Portable Networks Graphic (*.png)|*.png|All Files (*.*)|*.*",
                                       DefaultExt = "png",
                                       Title = "Save Frame As"
                                     })
      {
        if (dialog.ShowDialog(this) == DialogResult.OK)
        {
          this.SaveImageFrame(dialog.FileName);
        }
      }
    }

    private void SaveImageFrame(string fileName)
    {
      try
      {
        _openImage.Save(fileName, ImageFormat.Png);
      }
      catch (ExternalException ex)
      {
        MessageBox.Show($"Failed to save file '{fileName}'. {ex.GetBaseException().Message}", "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
    }

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.SaveImageFrame();
    }

    private void ShowPage(int page)
    {
      _currentPage = page;

      // update the current frame of the image
      _openImage.SelectActiveFrame(FrameDimension.Page, page - 1);

      // The ImageBox control doesn't know the image 
      // has changed, so force a repaint
      imageBox.Invalidate();

      this.UpdateUi();
    }

    private void UpdateUi()
    {
      bool canMovePrevious;
      bool canMoveNext;

      pageToolStripStatusLabel.Text = $"{_currentPage} of {_pageCount}";

      canMovePrevious = _currentPage > 1;
      canMoveNext = _currentPage < _pageCount;

      firstPageToolStripButton.Enabled = canMovePrevious;
      firstPageToolStripMenuItem.Enabled = canMovePrevious;

      previousPageToolStripButton.Enabled = canMovePrevious;
      previousPageToolStripMenuItem.Enabled = canMovePrevious;

      nextPageToolStripButton.Enabled = canMoveNext;
      nextPageToolStripMenuItem.Enabled = canMoveNext;

      lastPageToolStripButton.Enabled = canMoveNext;
      lastPageToolStripMenuItem.Enabled = canMoveNext;
    }

    #endregion
  }
}

Donate

Donate