Archive Browser
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
This software may be used free of charge, but as with all free software there are costs involved to develop and maintain.
If this site or its services have saved you time, please consider a donation to help with running costs and timely updates.
Donate